X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fjson%2FAccountListParser.java;h=053b1e9074c6561359daf0b4d235cdd91e5775cf;hb=052c43e2d1b50e31aa9b1293e929de6dd8ffbc6b;hp=4dd2e375ae7ac79e9c66c31feb7afc6b6e978e07;hpb=eccd11f1895e84dcc2a95db41934355311cebe2e;p=mobile-ledger-staging.git diff --git a/app/src/main/java/net/ktnx/mobileledger/json/AccountListParser.java b/app/src/main/java/net/ktnx/mobileledger/json/AccountListParser.java index 4dd2e375..053b1e90 100644 --- a/app/src/main/java/net/ktnx/mobileledger/json/AccountListParser.java +++ b/app/src/main/java/net/ktnx/mobileledger/json/AccountListParser.java @@ -1,5 +1,5 @@ /* - * Copyright © 2019 Damyan Ivanov. + * Copyright © 2020 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -18,23 +18,81 @@ package net.ktnx.mobileledger.json; import com.fasterxml.jackson.databind.MappingIterator; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import java.io.IOException; -import java.io.InputStream; +import net.ktnx.mobileledger.async.RetrieveTransactionsTask; +import net.ktnx.mobileledger.model.LedgerAccount; -public class AccountListParser { +import java.util.ArrayList; +import java.util.HashMap; - private final MappingIterator iter; +import static net.ktnx.mobileledger.utils.Logger.debug; - public AccountListParser(InputStream input) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - ObjectReader reader = mapper.readerFor(ParsedLedgerAccount.class); +abstract public class AccountListParser { + protected MappingIterator iterator; - iter = reader.readValues(input); + public ParsedLedgerAccount nextAccount() { + if (!iterator.hasNext()) + return null; + + ParsedLedgerAccount next = iterator.next(); + + if (next.getAname() + .equalsIgnoreCase("root")) + return nextAccount(); + + debug("accounts", String.format("Got account '%s' [v1.15]", next.getAname())); + return next; } - public ParsedLedgerAccount nextAccount() throws IOException { - return iter.hasNext() ? iter.next() : null; + public LedgerAccount nextLedgerAccount(RetrieveTransactionsTask task, + HashMap map) { + ParsedLedgerAccount parsedAccount = nextAccount(); + if (parsedAccount == null) + return null; + + task.addNumberOfPostings(parsedAccount.getAnumpostings()); + final String accName = parsedAccount.getAname(); + LedgerAccount acc = map.get(accName); + if (acc != null) + throw new RuntimeException( + String.format("Account '%s' already present", acc.getName())); + String parentName = LedgerAccount.extractParentName(accName); + ArrayList createdParents = new ArrayList<>(); + LedgerAccount parent; + if (parentName == null) { + parent = null; + } + else { + parent = task.ensureAccountExists(parentName, map, createdParents); + parent.setHasSubAccounts(true); + } + acc = new LedgerAccount(task.getProfile(), accName, parent); + map.put(accName, acc); + + String lastCurrency = null; + float lastCurrencyAmount = 0; + for (ParsedBalance b : parsedAccount.getAibalance()) { + task.throwIfCancelled(); + final String currency = b.getAcommodity(); + final float amount = b.getAquantity() + .asFloat(); + if (currency.equals(lastCurrency)) { + lastCurrencyAmount += amount; + } + else { + if (lastCurrency != null) { + acc.addAmount(lastCurrencyAmount, lastCurrency); + } + lastCurrency = currency; + lastCurrencyAmount = amount; + } + } + if (lastCurrency != null) { + acc.addAmount(lastCurrencyAmount, lastCurrency); + } + for (LedgerAccount p : createdParents) + acc.propagateAmountsTo(p); + + return acc; } + }