X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fdao%2FTransactionDAO.java;h=8e0156b77cf1993e29abbedabe2c9f79e14a1c94;hp=e347207cda9ed053b36cb1481d9c62ca2527884c;hb=916547239190f7daf921f2066593637cfca877fc;hpb=bba9ffd8fa7af0e3a940461cbc6448e266794aa6 diff --git a/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java b/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java index e347207c..8e0156b7 100644 --- a/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java +++ b/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java @@ -17,6 +17,8 @@ package net.ktnx.mobileledger.dao; +import android.os.AsyncTask; + import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; import androidx.room.ColumnInfo; @@ -27,10 +29,13 @@ import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; +import net.ktnx.mobileledger.db.Account; +import net.ktnx.mobileledger.db.AccountValue; import net.ktnx.mobileledger.db.DB; import net.ktnx.mobileledger.db.Transaction; import net.ktnx.mobileledger.db.TransactionAccount; import net.ktnx.mobileledger.db.TransactionWithAccounts; +import net.ktnx.mobileledger.model.LedgerAccount; import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.Misc; @@ -151,6 +156,9 @@ public abstract class TransactionDAO extends BaseDAO { @Query("UPDATE transaction_accounts SET generation = :newGeneration WHERE transaction_id = " + ":transactionId") public abstract int updateAccountsGeneration(long transactionId, long newGeneration); + + @Query("SELECT max(ledger_id) as ledger_id FROM transactions WHERE profile_id = :profileId") + public abstract LedgerIdContainer getMaxLedgerIdPOJOSync(long profileId); @androidx.room.Transaction public void updateGenerationWithAccounts(long transactionId, long newGeneration) { updateGeneration(transactionId, newGeneration); @@ -163,6 +171,13 @@ public abstract class TransactionDAO extends BaseDAO { return 0; return result.generation; } + public long getMaxLedgerIdSync(long profileId) { + LedgerIdContainer result = getMaxLedgerIdPOJOSync(profileId); + + if (result == null) + return 0; + return result.ledgerId; + } @androidx.room.Transaction public void storeTransactionsSync(List list, long profileId) { long generation = getGenerationSync(profileId) + 1; @@ -216,6 +231,58 @@ public abstract class TransactionDAO extends BaseDAO { trAcc.setId(trAccDao.insertSync(trAcc)); } } + public void storeLast(TransactionWithAccounts rec) { + AsyncTask.execute(() -> appendSync(rec)); + } + @androidx.room.Transaction + public void appendSync(TransactionWithAccounts rec) { + TransactionAccountDAO trAccDao = DB.get() + .getTransactionAccountDAO(); + AccountDAO accDao = DB.get() + .getAccountDAO(); + AccountValueDAO accValDao = DB.get() + .getAccountValueDAO(); + + Transaction transaction = rec.transaction; + final long profileId = transaction.getProfileId(); + transaction.setGeneration(getGenerationSync(profileId)); + transaction.setLedgerId(getMaxLedgerIdSync(profileId) + 1); + transaction.setId(insertSync(transaction)); + + for (TransactionAccount trAcc : rec.accounts) { + trAcc.setTransactionId(transaction.getId()); + trAcc.setGeneration(transaction.getGeneration()); + trAcc.setId(trAccDao.insertSync(trAcc)); + + Account acc = accDao.getByNameSync(profileId, trAcc.getAccountName()); + if (acc == null) { + acc = new Account(); + acc.setProfileId(profileId); + acc.setName(trAcc.getAccountName()); + acc.setNameUpper(acc.getName() + .toUpperCase()); + acc.setParentName(LedgerAccount.extractParentName(acc.getName())); + acc.setLevel(LedgerAccount.determineLevel(acc.getName())); + acc.setGeneration(trAcc.getGeneration()); + + acc.setId(accDao.insertSync(acc)); + } + + AccountValue accVal = accValDao.getByCurrencySync(acc.getId(), trAcc.getCurrency()); + if (accVal == null) { + accVal = new AccountValue(); + accVal.setAccountId(acc.getId()); + accVal.setGeneration(trAcc.getGeneration()); + accVal.setCurrency(trAcc.getCurrency()); + accVal.setValue(trAcc.getAmount()); + accVal.setId(accValDao.insertSync(accVal)); + } + else { + accVal.setValue(accVal.getValue() + trAcc.getAmount()); + accValDao.updateSync(accVal); + } + } + } static class TransactionGenerationContainer { @ColumnInfo long generation; @@ -224,6 +291,14 @@ public abstract class TransactionDAO extends BaseDAO { } } + static class LedgerIdContainer { + @ColumnInfo(name = "ledger_id") + long ledgerId; + public LedgerIdContainer(long ledgerId) { + this.ledgerId = ledgerId; + } + } + static public class DescriptionContainer { @ColumnInfo public String description;