implemented proper messages for accounting events

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-05-05 10:01:03 +02:00
parent 713edd3638
commit 719558e8ee
14 changed files with 101 additions and 43 deletions
@@ -9,6 +9,8 @@ import java.util.Optional;
import java.util.Set;
public interface AccountDb {
Transaction dropTransaction(Transaction transaction);
void dropTransactionTag(long transactionId, String tag);
Optional<Transaction> lastTransaction(long accountId, String source, String dest, double amount);
@@ -6,13 +6,11 @@ import static de.srsoftware.umbrella.accounting.Constants.CONFIG_DATABASE;
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.ModuleRegistry.tagService;
import static de.srsoftware.umbrella.core.ModuleRegistry.userService;
import static de.srsoftware.umbrella.core.Util.mapValues;
import static de.srsoftware.umbrella.core.constants.Path.*;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.invalidField;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingField;
import static de.srsoftware.umbrella.messagebus.MessageBus.messageBus;
import static de.srsoftware.umbrella.messagebus.events.Event.EventType.CREATE;
import static de.srsoftware.umbrella.messagebus.events.Event.EventType.UPDATE;
import static java.lang.System.Logger.Level.WARNING;
import com.sun.net.httpserver.HttpExchange;
@@ -26,13 +24,12 @@ import de.srsoftware.umbrella.core.constants.Field;
import de.srsoftware.umbrella.core.constants.Text;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.*;
import de.srsoftware.umbrella.messagebus.events.Event;
import de.srsoftware.umbrella.messagebus.events.TransactionEvent;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import de.srsoftware.umbrella.messagebus.events.Event;
import de.srsoftware.umbrella.messagebus.events.TransactionEvent;
import org.json.JSONArray;
import org.json.JSONObject;
@@ -143,11 +140,18 @@ public class AccountingModule extends BaseHandler implements AccountingService {
}
}
public boolean dropTransaction(Transaction transaction, UmbrellaUser user, HttpExchange ex) throws IOException {
var dropped = accountDb.dropTransaction(transaction);
messageBus().dispatch(new TransactionEvent(user,dropped,Event.EventType.DELETE));
return sendContent(ex,dropped);
}
public boolean dropTransaction(Transaction transaction, UmbrellaUser user, Path path, HttpExchange ex) throws IOException {
var head = path.pop();
return switch (head){
case TAG -> dropTransactionTag(user,transaction,ex);
case null, default -> super.doDelete(path,ex);
case null -> dropTransaction(transaction,user,ex);
default -> super.doDelete(path,ex);
};
}
@@ -10,8 +10,6 @@ import static de.srsoftware.umbrella.accounting.Constants.*;
import static de.srsoftware.umbrella.core.constants.Field.*;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
import static de.srsoftware.umbrella.core.model.Translatable.t;
import static de.srsoftware.umbrella.messagebus.MessageBus.messageBus;
import static de.srsoftware.umbrella.messagebus.events.Event.EventType.UPDATE;
import static java.text.MessageFormat.format;
import de.srsoftware.tools.jdbc.Condition;
@@ -21,8 +19,6 @@ import de.srsoftware.umbrella.core.constants.Field;
import de.srsoftware.umbrella.core.constants.Text;
import de.srsoftware.umbrella.core.model.Account;
import de.srsoftware.umbrella.core.model.Transaction;
import de.srsoftware.umbrella.messagebus.events.TransactionEvent;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.ZoneOffset;
@@ -121,6 +117,21 @@ public class SqliteDb extends BaseDb implements AccountDb {
}
}
public Transaction dropTransaction(Transaction transaction){
try {
db.setAutoCommit(false);
Query.delete().from(TABLE_TAGS_TRANSACTIONS).where(TRANSACTION_ID,equal(transaction.id())).execute(db);
Query.delete().from(TABLE_TRANSACTIONS).where(ID,equal(transaction.id())).execute(db);
db.setAutoCommit(true);
return transaction;
} catch (SQLException e){
try {
db.rollback();
} catch (SQLException ignored){};
throw failedToDropObject(transaction);
}
}
@Override
public void dropTransactionTag(long transactionId, String tag) {
try {
@@ -299,13 +310,9 @@ public class SqliteDb extends BaseDb implements AccountDb {
}
} else if (transaction.isDirty()) {
try {
if (transaction.amount() == 0 || transaction.source().isEmpty() || transaction.destination().isEmpty()) {
delete().from(TABLE_TRANSACTIONS).where(Field.ID, equal(transaction.id())).where(ACCOUNT, equal(transaction.accountId())).execute(db);
} else {
replaceInto(TABLE_TRANSACTIONS, Field.ID, Field.ACCOUNT, Field.TIMESTAMP, Field.SOURCE, Field.DESTINATION, Field.AMOUNT, Field.DESCRIPTION)
.values(transaction.id(), transaction.accountId(), timestamp, transaction.source().value(), transaction.destination().value(), transaction.amount(), transaction.purpose())
.execute(db).close();
}
replaceInto(TABLE_TRANSACTIONS, Field.ID, Field.ACCOUNT, Field.TIMESTAMP, Field.SOURCE, Field.DESTINATION, Field.AMOUNT, Field.DESCRIPTION)
.values(transaction.id(), transaction.accountId(), timestamp, transaction.source().value(), transaction.destination().value(), transaction.amount(), transaction.purpose())
.execute(db).close();
return transaction.clearDirtyState();
} catch (SQLException e) {
throw failedToStoreObject(transaction);