X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fasync%2FRetrieveTransactionsTask.java;h=3a882743d44fd9e2da9b63f8e5ff9666c22fa417;hb=8e2732de0b27c0d992d5e1b9a310729ad5e2edb7;hp=3ba73936deaa875068acbe6cbf2989255ef53556;hpb=fe7de3bcefd231c054c08e3b591334e0c5fbea86;p=mobile-ledger-staging.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 3ba73936..3a882743 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; @@ -54,8 +56,6 @@ import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; -import androidx.annotation.NonNull; - import static net.ktnx.mobileledger.utils.Logger.debug; @@ -67,9 +67,12 @@ public class RetrieveTransactionsTask "id=\"transaction-(\\d+)\">([\\d.-]+)"); private static final Pattern reTransactionDescription = Pattern.compile(" contextRef; // %3A is '=' private Pattern reAccountName = Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\""); @@ -84,6 +87,33 @@ public class RetrieveTransactionsTask private static void L(String msg) { //debug("transaction-parser", msg); } + static LedgerTransactionAccount parseTransactionAccountLine(String line) { + Matcher m = reTransactionDetails.matcher(line); + if (m.find()) { + String postingStatus = m.group(1); + String acc_name = m.group(2); + String currencyPre = m.group(3); + String amount = m.group(4); + String currencyPost = m.group(5); + + String currency = null; + if ((currencyPre != null) && (currencyPre.length() > 0)) { + if ((currencyPost != null) && (currencyPost.length() > 0)) + return null; + currency = currencyPre; + } + else if ((currencyPost != null) && (currencyPost.length() > 0)) { + currency = currencyPost; + } + + amount = amount.replace(',', '.'); + + return new LedgerTransactionAccount(acc_name, Float.valueOf(amount), currency, null); + } + else { + return null; + } + } @Override protected void onProgressUpdate(Progress... values) { super.onProgressUpdate(values); @@ -120,7 +150,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); @@ -216,8 +245,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); @@ -225,8 +254,7 @@ public class RetrieveTransactionsTask } } - if ((!onlyStarred || !lastAccount.isHiddenByStar()) && - lastAccount.isVisible(accountList)) + if (lastAccount.isVisible(accountList)) accountList.add(lastAccount); accountNames.put(acct_name, null); @@ -245,18 +273,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,17 +391,12 @@ 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); - if (currency == null) currency = ""; - amount = amount.replace(',', '.'); - transaction.addAccount(new LedgerTransactionAccount(acc_name, - Float.valueOf(amount), currency)); + LedgerTransactionAccount lta = parseTransactionAccountLine(line); + if (lta != null) { + transaction.addAccount(lta); L(String.format(Locale.ENGLISH, "%d: %s = %s", - transaction.getId(), acc_name, amount)); + transaction.getId(), lta.getAccountName(), + lta.getAmount())); } else throw new IllegalStateException( String.format("Can't parse transaction %d " + "details: %s",