X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fasync%2FRetrieveTransactionsTask.java;h=6afe539b2ba242ac5e405e5a2624bb3dc530e678;hb=460876f2ca83b72ae815b0d781de2153132c9658;hp=465977b32e2c97e16235b49ffffaf2c55cbed201;hpb=c17ccecec53bfff9f250db515513992466a5828b;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java index 465977b3..6afe539b 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -22,13 +22,15 @@ import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.OperationCanceledException; +import androidx.annotation.NonNull; + import net.ktnx.mobileledger.App; import net.ktnx.mobileledger.err.HTTPException; -import net.ktnx.mobileledger.json.AccountListParser; -import net.ktnx.mobileledger.json.ParsedBalance; -import net.ktnx.mobileledger.json.ParsedLedgerAccount; -import net.ktnx.mobileledger.json.ParsedLedgerTransaction; -import net.ktnx.mobileledger.json.TransactionListParser; +import net.ktnx.mobileledger.json.v1_15.AccountListParser; +import net.ktnx.mobileledger.json.v1_15.ParsedBalance; +import net.ktnx.mobileledger.json.v1_15.ParsedLedgerAccount; +import net.ktnx.mobileledger.json.v1_15.ParsedLedgerTransaction; +import net.ktnx.mobileledger.json.v1_15.TransactionListParser; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.LedgerAccount; import net.ktnx.mobileledger.model.LedgerTransaction; @@ -66,8 +68,10 @@ public class RetrieveTransactionsTask private static final Pattern reTransactionDescription = Pattern.compile(" contextRef; // %3A is '=' private Pattern reAccountName = Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\""); @@ -75,7 +79,7 @@ public class RetrieveTransactionsTask "\\s*([-+]?[\\d.,]+)(?:\\s+(\\S+))?"); private MobileLedgerProfile profile; public RetrieveTransactionsTask(WeakReference contextRef, - MobileLedgerProfile profile) { + @NonNull MobileLedgerProfile profile) { this.contextRef = contextRef; this.profile = profile; } @@ -118,7 +122,6 @@ public class RetrieveTransactionsTask HashMap accountNames = new HashMap<>(); HashMap syntheticAccounts = new HashMap<>(); LedgerAccount lastAccount = null, prevAccount = null; - boolean onlyStarred = Data.optShowOnlyStarred.get(); HttpURLConnection http = NetworkUtil.prepareConnection(profile, "journal"); http.setAllowUserInteraction(false); @@ -214,8 +217,8 @@ public class RetrieveTransactionsTask } acc.setHasSubAccounts(true); acc.removeAmounts(); // filled below when amounts are parsed - if ((!onlyStarred || !acc.isHiddenByStar()) && - acc.isVisible(accountList)) accountList.add(acc); + if (acc.isVisible(accountList)) + accountList.add(acc); L(String.format("gap-filling with %s", aName)); accountNames.put(aName, null); profile.storeAccount(db, acc); @@ -223,8 +226,7 @@ public class RetrieveTransactionsTask } } - if ((!onlyStarred || !lastAccount.isHiddenByStar()) && - lastAccount.isVisible(accountList)) + if (lastAccount.isVisible(accountList)) accountList.add(lastAccount); accountNames.put(acct_name, null); @@ -243,18 +245,34 @@ public class RetrieveTransactionsTask String value = m.group(1); String currency = m.group(2); if (currency == null) currency = ""; - value = value.replace(',', '.'); + + { + Matcher tmpM = reDecimalComma.matcher(value); + if (tmpM.find()) { + value = value.replace(".", ""); + value = value.replace(',', '.'); + } + + tmpM = reDecimalPoint.matcher(value); + if (tmpM.find()) { + value = value.replace(",", ""); + value = value.replace(" ", ""); + } + } L("curr=" + currency + ", value=" + value); final float val = Float.parseFloat(value); profile.storeAccountValue(db, lastAccount.getName(), currency, val); lastAccount.addAmount(val, currency); for (LedgerAccount syn : syntheticAccounts.values()) { + L(String.format(Locale.ENGLISH, "propagating %s %1.2f to %s", + currency, val, syn.getName())); syn.addAmount(val, currency); profile.storeAccountValue(db, syn.getName(), currency, val); } } if (match_found) { + syntheticAccounts.clear(); state = ParserState.EXPECTING_ACCOUNT; L("→ expecting account"); } @@ -347,13 +365,14 @@ public class RetrieveTransactionsTask else { m = reTransactionDetails.matcher(line); if (m.find()) { - String acc_name = m.group(1); - String amount = m.group(2); - String currency = m.group(3); + String postingStatus = m.group(1); + String acc_name = m.group(2); + String amount = m.group(3); + String currency = m.group(4); if (currency == null) currency = ""; amount = amount.replace(',', '.'); transaction.addAccount(new LedgerTransactionAccount(acc_name, - Float.valueOf(amount), currency)); + Float.valueOf(amount), currency, null)); L(String.format(Locale.ENGLISH, "%d: %s = %s", transaction.getId(), acc_name, amount)); } @@ -389,8 +408,7 @@ public class RetrieveTransactionsTask new String[]{profile.getUuid()}); db.execSQL("update accounts set keep=0 where profile=?;", new String[]{profile.getUuid()}); } - private boolean retrieveAccountList() - throws IOException, HTTPException { + private boolean retrieveAccountList() throws IOException, HTTPException { Progress progress = new Progress(); HttpURLConnection http = NetworkUtil.prepareConnection(profile, "accounts"); @@ -477,8 +495,7 @@ public class RetrieveTransactionsTask return true; } - private boolean retrieveTransactionList() - throws IOException, ParseException, HTTPException { + private boolean retrieveTransactionList() throws IOException, ParseException, HTTPException { Progress progress = new Progress(); int maxTransactionId = Progress.INDETERMINATE;