Skip to content

Commit 2353957

Browse files
committed
Ensure the balancing split has positive amount and the proper transaction type
Splits should always have positive amounts. Whether their amounts are added or substract is controled by the type of transaction: debit or credit. The problem was some unbalanced transactions were getting an auto-balance split with negative amount. When exported to QIF QifExporter might add a minus according to the transaction type, so ending up with a double minus. Fixes #693
1 parent a37f346 commit 2353957

2 files changed

Lines changed: 31 additions & 2 deletions

File tree

app/src/main/java/org/gnucash/android/model/Transaction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ public Split createAutoBalanceSplit(){
178178
if (!imbalance.isAmountZero()){
179179
// yes, this is on purpose the account UID is set to the currency.
180180
// This should be overridden before saving to db
181-
Split split = new Split(imbalance.negate(), mCommodity.getCurrencyCode());
181+
Split split = new Split(imbalance.abs(), mCommodity.getCurrencyCode());
182+
split.setType(imbalance.isNegative() ? TransactionType.CREDIT : TransactionType.DEBIT);
182183
addSplit(split);
183184
return split;
184185
}

app/src/test/java/org/gnucash/android/test/unit/model/TransactionTest.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
import org.gnucash.android.model.Money;
66
import org.gnucash.android.model.Split;
77
import org.gnucash.android.model.Transaction;
8+
import org.gnucash.android.model.TransactionType;
89
import org.gnucash.android.test.unit.testutil.GnucashTestRunner;
910
import org.gnucash.android.test.unit.testutil.ShadowCrashlytics;
1011
import org.gnucash.android.test.unit.testutil.ShadowUserVoice;
11-
import org.gnucash.android.ui.transaction.SplitEditorFragment;
1212
import org.junit.Test;
1313
import org.junit.runner.RunWith;
1414
import org.robolectric.annotation.Config;
@@ -76,4 +76,32 @@ public void settingUID_shouldSetTransactionUidOfSplits(){
7676
.doesNotContain("non-existent")
7777
.doesNotContain("pre-existent");
7878
}
79+
80+
@Test
81+
public void testCreateAutoBalanceSplit() {
82+
Transaction transactionCredit = new Transaction("Transaction with more credit");
83+
Split creditSplit = new Split(new Money("1", "EUR"), "test-account");
84+
creditSplit.setType(TransactionType.CREDIT);
85+
transactionCredit.addSplit(creditSplit);
86+
Split debitBalanceSplit = transactionCredit.createAutoBalanceSplit();
87+
88+
assertThat(creditSplit.getValue().isNegative()).isFalse();
89+
assertThat(debitBalanceSplit.getValue()).isEqualTo(creditSplit.getValue());
90+
91+
assertThat(creditSplit.getQuantity().isNegative()).isFalse();
92+
assertThat(debitBalanceSplit.getQuantity()).isEqualTo(creditSplit.getQuantity());
93+
94+
95+
Transaction transactionDebit = new Transaction("Transaction with more debit");
96+
Split debitSplit = new Split(new Money("1", "EUR"), "test-account");
97+
debitSplit.setType(TransactionType.DEBIT);
98+
transactionDebit.addSplit(debitSplit);
99+
Split creditBalanceSplit = transactionDebit.createAutoBalanceSplit();
100+
101+
assertThat(debitSplit.getValue().isNegative()).isFalse();
102+
assertThat(creditBalanceSplit.getValue()).isEqualTo(debitSplit.getValue());
103+
104+
assertThat(debitSplit.getQuantity().isNegative()).isFalse();
105+
assertThat(creditBalanceSplit.getQuantity()).isEqualTo(debitSplit.getQuantity());
106+
}
79107
}

0 commit comments

Comments
 (0)