X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;ds=sidebyside;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fjson%2FParsedLedgerAccount.java;h=04eff28f29e7cef40b9386bbc56bd5cd14e60012;hb=a87079ed41bdc3ad89fe8bd15dfba10e37b29b76;hp=aff5775358d7e393cb82fea7116e844150ecab01;hpb=052c43e2d1b50e31aa9b1293e929de6dd8ffbc6b;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/json/ParsedLedgerAccount.java b/app/src/main/java/net/ktnx/mobileledger/json/ParsedLedgerAccount.java index aff57753..04eff28f 100644 --- a/app/src/main/java/net/ktnx/mobileledger/json/ParsedLedgerAccount.java +++ b/app/src/main/java/net/ktnx/mobileledger/json/ParsedLedgerAccount.java @@ -17,14 +17,17 @@ package net.ktnx.mobileledger.json; -import net.ktnx.mobileledger.json.ParsedBalance; +import net.ktnx.mobileledger.async.RetrieveTransactionsTask; +import net.ktnx.mobileledger.model.LedgerAccount; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -public class ParsedLedgerAccount { +public abstract class ParsedLedgerAccount { private String aname; private int anumpostings; - private List aibalance; + public abstract List getSimpleBalance(); public String getAname() { return aname; } @@ -37,10 +40,71 @@ public class ParsedLedgerAccount { public void setAnumpostings(int anumpostings) { this.anumpostings = anumpostings; } - public List getAibalance() { - return aibalance; + public LedgerAccount toLedgerAccount(RetrieveTransactionsTask task, + HashMap map) { + task.addNumberOfPostings(getAnumpostings()); + final String accName = 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 (SimpleBalance b : getSimpleBalance()) { + task.throwIfCancelled(); + final String currency = b.getCommodity(); + final float amount = b.getAmount(); + 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; } - public void setAibalance(List aibalance) { - this.aibalance = aibalance; + + static public class SimpleBalance { + private String commodity; + private float amount; + public SimpleBalance(String commodity, float amount) { + this.commodity = commodity; + this.amount = amount; + } + public String getCommodity() { + return commodity; + } + public void setCommodity(String commodity) { + this.commodity = commodity; + } + public float getAmount() { + return amount; + } + public void setAmount(float amount) { + this.amount = amount; + } } }