/*
- * Copyright © 2020 Damyan Ivanov.
+ * Copyright © 2021 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
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import java.lang.ref.WeakReference;
+import net.ktnx.mobileledger.db.Account;
+import net.ktnx.mobileledger.db.AccountValue;
+import net.ktnx.mobileledger.db.AccountWithAmounts;
+
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
public class LedgerAccount {
+ private static final char ACCOUNT_DELIMITER = ':';
static Pattern reHigherAccount = Pattern.compile("^[^:]+:");
+ private final LedgerAccount parent;
+ private long dbId;
+ private long profileId;
private String name;
private String shortName;
private int level;
- private final LedgerAccount parent;
private boolean expanded;
private List<LedgerAmount> amounts;
private boolean hasSubAccounts;
private boolean amountsExpanded;
- private final WeakReference<MobileLedgerProfile> profileWeakReference;
- public LedgerAccount(MobileLedgerProfile profile, String name, @Nullable LedgerAccount parent) {
- this.profileWeakReference = new WeakReference<>(profile);
+ public LedgerAccount(String name, @Nullable LedgerAccount parent) {
this.parent = parent;
if (parent != null && !name.startsWith(parent.getName() + ":"))
throw new IllegalStateException(
}
@Nullable
public static String extractParentName(@NonNull String accName) {
- int colonPos = accName.lastIndexOf(':');
+ int colonPos = accName.lastIndexOf(ACCOUNT_DELIMITER);
if (colonPos < 0)
return null; // no parent account -- this is a top-level account
else
return accName.substring(0, colonPos);
}
- public @Nullable
- MobileLedgerProfile getProfile() {
- return profileWeakReference.get();
+ @NonNull
+ static public LedgerAccount fromDBO(AccountWithAmounts in, LedgerAccount parent) {
+ LedgerAccount res = new LedgerAccount(in.account.getName(), parent);
+ res.dbId = in.account.getId();
+ res.profileId = in.account.getProfileId();
+ res.setName(in.account.getName());
+ res.setExpanded(in.account.isExpanded());
+ res.setAmountsExpanded(in.account.isAmountsExpanded());
+
+ res.amounts = new ArrayList<>();
+ for (AccountValue val : in.amounts) {
+ res.amounts.add(new LedgerAmount(val.getValue(), val.getCurrency()));
+ }
+
+ return res;
+ }
+ public static int determineLevel(String accName) {
+ int level = 0;
+ int delimiterPosition = accName.indexOf(ACCOUNT_DELIMITER);
+ while (delimiterPosition >= 0) {
+ level++;
+ delimiterPosition = accName.indexOf(ACCOUNT_DELIMITER, delimiterPosition + 1);
+ }
+ return level;
}
@Override
public int hashCode() {
.startsWith(name + ":");
}
private void stripName() {
- if (parent == null) {
- level = 0;
- shortName = name;
- }
- else {
- level = parent.level + 1;
- shortName = name.substring(parent.getName()
- .length() + 1);
- }
+ String[] split = name.split(":");
+ shortName = split[split.length - 1];
+ level = split.length - 1;
}
public String getName() {
return name;
public int getLevel() {
return level;
}
-
@NonNull
public String getShortName() {
return shortName;
}
-
public String getParentName() {
return (parent == null) ? null : parent.getName();
}
public boolean amountsExpanded() { return amountsExpanded; }
public void setAmountsExpanded(boolean flag) { amountsExpanded = flag; }
public void toggleAmountsExpanded() { amountsExpanded = !amountsExpanded; }
-
public void propagateAmountsTo(LedgerAccount acc) {
for (LedgerAmount a : amounts)
a.propagateToAccount(acc);
public List<LedgerAmount> getAmounts() {
return amounts;
}
+ @NonNull
+ public Account toDBO() {
+ Account dbo = new Account();
+ dbo.setName(name);
+ dbo.setNameUpper(name.toUpperCase());
+ dbo.setParentName(extractParentName(name));
+ dbo.setLevel(level);
+ dbo.setId(dbId);
+ dbo.setProfileId(profileId);
+ dbo.setExpanded(expanded);
+ dbo.setAmountsExpanded(amountsExpanded);
+
+ return dbo;
+ }
+ @NonNull
+ public AccountWithAmounts toDBOWithAmounts() {
+ AccountWithAmounts dbo = new AccountWithAmounts();
+ dbo.account = toDBO();
+
+ dbo.amounts = new ArrayList<>();
+ for (LedgerAmount amt : getAmounts()) {
+ AccountValue val = new AccountValue();
+ val.setCurrency(amt.getCurrency());
+ val.setValue(amt.getAmount());
+ dbo.amounts.add(val);
+ }
+
+ return dbo;
+ }
+ public long getId() {
+ return dbId;
+ }
}