package net.ktnx.mobileledger.ui.new_transaction;
import android.annotation.SuppressLint;
-import android.os.Handler;
-import android.os.Looper;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import net.ktnx.mobileledger.BuildConfig;
+import net.ktnx.mobileledger.db.Currency;
import net.ktnx.mobileledger.db.DB;
+import net.ktnx.mobileledger.db.Profile;
import net.ktnx.mobileledger.db.TemplateAccount;
import net.ktnx.mobileledger.db.TemplateHeader;
+import net.ktnx.mobileledger.db.TransactionWithAccounts;
import net.ktnx.mobileledger.model.Data;
import net.ktnx.mobileledger.model.InertMutableLiveData;
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.model.LedgerTransactionAccount;
import net.ktnx.mobileledger.model.MatchedTemplate;
-import net.ktnx.mobileledger.model.MobileLedgerProfile;
import net.ktnx.mobileledger.utils.Globals;
import net.ktnx.mobileledger.utils.Logger;
import net.ktnx.mobileledger.utils.Misc;
private final MutableLiveData<Boolean> simulateSave = new InertMutableLiveData<>(false);
private final AtomicInteger busyCounter = new AtomicInteger(0);
private final MutableLiveData<Boolean> busyFlag = new InertMutableLiveData<>(false);
- private final Observer<MobileLedgerProfile> profileObserver = profile -> {
+ private final Observer<Profile> profileObserver = profile -> {
showCurrency.postValue(profile.getShowCommodityByDefault());
showComments.postValue(profile.getShowCommentsByDefault());
};
* make old items replaceable in-place. makes the new values visually blend in
*/
private void renumberItems() {
- final List<Item> list = items.getValue();
+ renumberItems(items.getValue());
+ }
+ private void renumberItems(List<Item> list) {
if (list == null) {
return;
}
List<Item> list = new ArrayList<>();
Item.resetIdDispenser();
list.add(new TransactionHead(""));
- list.add(new TransactionAccount(""));
- list.add(new TransactionAccount(""));
+ final String defaultCurrency = Objects.requireNonNull(Data.getProfile())
+ .getDefaultCommodity();
+ list.add(new TransactionAccount("", defaultCurrency));
+ list.add(new TransactionAccount("", defaultCurrency));
noteFocusChanged(0, FocusedElement.Description);
renumberItems();
isSubmittable.setValue(false);
if (Misc.emptyIsNull(transactionComment) != null)
head.setComment(transactionComment);
- Item.resetIdDispenser();
List<Item> newItems = new ArrayList<>();
newItems.add(head);
if (amount != null && acc.getNegateAmount() != null && acc.getNegateAmount())
amount = -amount;
- // TODO currency
TransactionAccount accRow = new TransactionAccount(accountName);
accRow.setComment(accountComment);
if (amount != null)
accRow.setAmount(amount);
+ accRow.setCurrency(
+ extractCurrencyFromMatches(matchResult, acc.getCurrencyMatchGroup(),
+ acc.getCurrencyObject()));
newItems.add(accRow);
}
- new Handler(Looper.getMainLooper()).post(() -> replaceItems(newItems));
+ renumberItems(newItems);
+ Misc.onMainThread(() -> replaceItems(newItems));
});
}
+ private String extractCurrencyFromMatches(MatchResult m, Integer group, Currency literal) {
+ return extractStringFromMatches(m, group, (literal == null) ? "" : literal.getName());
+ }
private int extractIntFromMatches(MatchResult m, Integer group, Integer literal) {
if (literal != null)
return literal;
if (group != null) {
int grp = group;
- if (grp > 0 & grp <= m.groupCount())
+ if (grp > 0 && grp <= m.groupCount())
try {
return Integer.parseInt(m.group(grp));
}
if (group != null) {
int grp = group;
- if (grp > 0 & grp <= m.groupCount())
+ if (grp > 0 && grp <= m.groupCount())
return m.group(grp);
}
if (group != null) {
int grp = group;
- if (grp > 0 & grp <= m.groupCount())
+ if (grp > 0 && grp <= m.groupCount())
try {
return Float.valueOf(m.group(grp));
}
List<Item> list = Objects.requireNonNull(items.getValue());
TransactionHead head = list.get(0)
.toTransactionHead();
- SimpleDate date = head.getDate();
LedgerTransaction tr = head.asLedgerTransaction();
tr.setComment(head.getComment());
return tr;
}
- void loadTransactionIntoModel(String profileUUID, int transactionId) {
+ void loadTransactionIntoModel(@NonNull TransactionWithAccounts tr) {
List<Item> newList = new ArrayList<>();
Item.resetIdDispenser();
- LedgerTransaction tr;
- MobileLedgerProfile profile = Data.getProfile(profileUUID);
- if (profile == null)
- throw new RuntimeException(String.format(
- "Unable to find profile %s, which is supposed to contain transaction %d",
- profileUUID, transactionId));
- tr = profile.loadTransaction(transactionId);
- TransactionHead head = new TransactionHead(tr.getDescription());
- head.setComment(tr.getComment());
+ Item currentHead = items.getValue()
+ .get(0);
+ TransactionHead head = new TransactionHead(tr.transaction.getDescription());
+ head.setComment(tr.transaction.getComment());
+ if (currentHead instanceof TransactionHead)
+ head.setDate(((TransactionHead) currentHead).date);
newList.add(head);
- List<LedgerTransactionAccount> accounts = tr.getAccounts();
+ List<LedgerTransactionAccount> accounts = new ArrayList<>();
+ for (net.ktnx.mobileledger.db.TransactionAccount acc : tr.accounts) {
+ accounts.add(new LedgerTransactionAccount(acc));
+ }
TransactionAccount firstNegative = null;
TransactionAccount firstPositive = null;
moveItemLast(newList, singlePositiveIndex);
}
- setItems(newList);
-
- noteFocusChanged(1, FocusedElement.Amount);
+ Misc.onMainThread(() -> {
+ setItems(newList);
+ noteFocusChanged(1, FocusedElement.Amount);
+ });
}
/**
* A transaction is submittable if:
return ItemType.generalData;
}
public LedgerTransaction asLedgerTransaction() {
- return new LedgerTransaction(null, date, description, Data.getProfile());
+ return new LedgerTransaction(0, (date == null) ? SimpleDate.today() : date, description,
+ Data.getProfile());
}
public boolean equalContents(TransactionHead other) {
if (other == null)