]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/model/LedgerTransaction.java
major rework of parsed transaction/descriptions/accounts storage
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / model / LedgerTransaction.java
index 9b73d2ce9d1c9d477c77fe70f83bcdb0ee126aeb..d42e5630d0274f26e3525c510a6435d40f1d023e 100644 (file)
@@ -20,6 +20,10 @@ package net.ktnx.mobileledger.model;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import net.ktnx.mobileledger.App;
 import net.ktnx.mobileledger.utils.Digest;
 import net.ktnx.mobileledger.utils.Globals;
 import net.ktnx.mobileledger.utils.SimpleDate;
@@ -29,34 +33,31 @@ import java.security.NoSuchAlgorithmException;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.List;
 
 public class LedgerTransaction {
     private static final String DIGEST_TYPE = "SHA-256";
-    public final Comparator<LedgerTransactionAccount> comparator =
-            new Comparator<LedgerTransactionAccount>() {
-                @Override
-                public int compare(LedgerTransactionAccount o1, LedgerTransactionAccount o2) {
-                    int res = o1.getAccountName()
-                                .compareTo(o2.getAccountName());
-                    if (res != 0)
-                        return res;
-                    res = o1.getCurrency()
-                            .compareTo(o2.getCurrency());
-                    if (res != 0)
-                        return res;
-                    res = o1.getComment()
-                            .compareTo(o2.getComment());
-                    if (res != 0)
-                        return res;
-                    return Float.compare(o1.getAmount(), o2.getAmount());
-                }
-            };
+    public final Comparator<LedgerTransactionAccount> comparator = (o1, o2) -> {
+        int res = o1.getAccountName()
+                    .compareTo(o2.getAccountName());
+        if (res != 0)
+            return res;
+        res = o1.getCurrency()
+                .compareTo(o2.getCurrency());
+        if (res != 0)
+            return res;
+        res = o1.getComment()
+                .compareTo(o2.getComment());
+        if (res != 0)
+            return res;
+        return Float.compare(o1.getAmount(), o2.getAmount());
+    };
     private String profile;
     private Integer id;
     private SimpleDate date;
     private String description;
     private String comment;
-    private ArrayList<LedgerTransactionAccount> accounts;
+    private List<LedgerTransactionAccount> accounts;
     private String dataHash;
     private boolean dataLoaded;
     public LedgerTransaction(Integer id, String dateString, String description)
@@ -74,7 +75,7 @@ public class LedgerTransaction {
         dataLoaded = false;
     }
     public LedgerTransaction(Integer id, SimpleDate date, String description) {
-        this(id, date, description, Data.profile.getValue());
+        this(id, date, description, Data.getProfile());
     }
     public LedgerTransaction(SimpleDate date, String description) {
         this(null, date, description);
@@ -91,14 +92,21 @@ public class LedgerTransaction {
         this.dataHash = null;
         this.dataLoaded = false;
     }
-    public ArrayList<LedgerTransactionAccount> getAccounts() {
+    public List<LedgerTransactionAccount> getAccounts() {
         return accounts;
     }
     public void addAccount(LedgerTransactionAccount item) {
         accounts.add(item);
         dataHash = null;
     }
+    @Nullable
+    public SimpleDate getDateIfAny() {
+        return date;
+    }
+    @NonNull
     public SimpleDate getDate() {
+        if (date == null)
+            throw new IllegalStateException("Transaction has no date");
         return date;
     }
     public void setDate(SimpleDate date) {
@@ -122,6 +130,7 @@ public class LedgerTransaction {
         return id;
     }
     protected void fillDataHash() {
+        loadData(App.getDatabase());
         if (dataHash != null)
             return;
         try {
@@ -155,18 +164,7 @@ public class LedgerTransaction {
                     String.format("Unable to get instance of %s digest", DIGEST_TYPE), e);
         }
     }
-    public boolean existsInDb(SQLiteDatabase db) {
-        fillDataHash();
-        try (Cursor c = db.rawQuery("SELECT 1 from transactions where data_hash = ?",
-                new String[]{dataHash}))
-        {
-            boolean result = c.moveToFirst();
-//            debug("db", String.format("Transaction %d (%s) %s", id, dataHash,
-//                    result ? "already present" : "not present"));
-            return result;
-        }
-    }
-    public void loadData(SQLiteDatabase db) {
+    public synchronized void loadData(SQLiteDatabase db) {
         if (dataLoaded)
             return;
 
@@ -207,4 +205,30 @@ public class LedgerTransaction {
     public void finishLoading() {
         dataLoaded = true;
     }
+    @Override
+    public boolean equals(@Nullable Object obj) {
+        if (obj == null)
+            return false;
+        if (!obj.getClass()
+                .equals(this.getClass()))
+            return false;
+
+        return ((LedgerTransaction) obj).getDataHash()
+                                        .equals(getDataHash());
+    }
+
+    public boolean hasAccountNamedLike(String name) {
+        name = name.toUpperCase();
+        for (LedgerTransactionAccount acc : accounts) {
+            if (acc.getAccountName()
+                   .toUpperCase()
+                   .contains(name))
+                return true;
+        }
+
+        return false;
+    }
+    public void markDataAsLoaded() {
+        dataLoaded = true;
+    }
 }