[office/kmymoney] kmymoney/mymoney: Fix initial cleared balance display for liability accounts
Thomas Baumgart <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 8066b6cda57ba3f6b46238077a867318f18d5876 by Thomas Baumgart.
Committed on 26/07/2026 at 06:15.
Pushed by tbaumgart into branch 'master'.
Fix initial cleared balance display for liability accounts
BUG: 523478
FIXED-IN: 5.2.3
M +1 -27 kmymoney/mymoney/mymoneyfile.cpp
M +34 -0 kmymoney/mymoney/tests/test-mymoneyfile.cpp
https://invent.kde.org/office/kmymoney/-/commit/8066b6cda57ba3f6b46238077a867318f18d5876
diff --git a/kmymoney/mymoney/mymoneyfile.cpp b/kmymoney/mymoney/mymoneyfile.cpp
index 2a5958439..50943d06d 100644
--- a/kmymoney/mymoney/mymoneyfile.cpp
+++ b/kmymoney/mymoney/mymoneyfile.cpp
@@ -2814,33 +2814,7 @@ MyMoneyMoney MyMoneyFile::balance(const QString& id) const
MyMoneyMoney MyMoneyFile::clearedBalance(const QString& id, const QDate& date) const
{
- MyMoneyMoney cleared;
- QList<MyMoneyTransaction> list;
-
- cleared = balance(id, date);
-
- MyMoneyAccount account = this->account(id);
- MyMoneyMoney factor(1, 1);
- if (account.accountGroup() == Account::Type::Liability || account.accountGroup() == Account::Type::Equity)
- factor = -factor;
-
- MyMoneyTransactionFilter filter;
- filter.addAccount(id);
- filter.setDateFilter(QDate(), date);
- filter.setReportAllSplits(false);
- filter.addState((int)TransactionFilter::State::NotReconciled);
- transactionList(list, filter);
-
- for (QList<MyMoneyTransaction>::const_iterator it_t = list.cbegin(); it_t != list.cend(); ++it_t) {
- const QList<MyMoneySplit>& splits = (*it_t).splits();
- for (QList<MyMoneySplit>::const_iterator it_s = splits.cbegin(); it_s != splits.cend(); ++it_s) {
- const MyMoneySplit& split = (*it_s);
- if (split.accountId() != id)
- continue;
- cleared -= split.shares();
- }
- }
- return cleared * factor;
+ return d->journalModel.clearedBalance(id, date);
}
MyMoneyMoney MyMoneyFile::totalBalance(const QString& id, const QDate& date) const
diff --git a/kmymoney/mymoney/tests/test-mymoneyfile.cpp b/kmymoney/mymoney/tests/test-mymoneyfile.cpp
index e18c4d67a..109f83dcd 100644
--- a/kmymoney/mymoney/tests/test-mymoneyfile.cpp
+++ b/kmymoney/mymoney/tests/test-mymoneyfile.cpp
@@ -2460,6 +2460,7 @@ void MyMoneyFileTest::testClearedBalance()
testAddTransaction();
MyMoneyTransaction t1;
MyMoneyTransaction t2;
+ MyMoneyTransaction t3;
// construct a transaction and add it to the pool
t1.setPostDate(QDate(2002, 2, 1));
@@ -2472,6 +2473,8 @@ void MyMoneyFileTest::testClearedBalance()
MyMoneySplit split2;
MyMoneySplit split3;
MyMoneySplit split4;
+ MyMoneySplit split5;
+ MyMoneySplit split6;
MyMoneyFileTransaction ft;
try {
@@ -2514,6 +2517,37 @@ void MyMoneyFileTest::testClearedBalance()
// Date before first transaction
QVERIFY(m->clearedBalance("A000002", QDate(2002, 1, 15)).isZero());
+ MyMoneyAccount liability;
+ liability.setAccountType(eMyMoney::Account::Type::Liability);
+ liability.setName("Account-Liability");
+ liability.setCurrencyId("EUR");
+
+ MyMoneyAccount parent = m->liability();
+ m->addAccount(liability, parent);
+ QCOMPARE(liability.id(), "A000005");
+
+ split5.setAccountId("A000002");
+ split5.setShares(MyMoneyMoney(2000, 100));
+ split5.setValue(MyMoneyMoney(2000, 100));
+ split5.setReconcileFlag(eMyMoney::Split::State::Cleared);
+ split6.setAccountId("A000005");
+ split6.setValue(MyMoneyMoney(-2000, 100));
+ split6.setShares(MyMoneyMoney(-2000, 100));
+ split6.setReconcileFlag(eMyMoney::Split::State::Cleared);
+
+ t3.setPostDate(QDate(2002, 2, 4));
+ t3.setMemo("Memotext");
+ t3.addSplit(split5);
+ t3.addSplit(split6);
+ m->addTransaction(t3);
+ ft.commit();
+ ft.restart();
+
+ // Date of last cleared transaction
+ const auto clearedBalance = m->clearedBalance("A000005", QDate(2002, 2, 4));
+ QCOMPARE(m->clearedBalance("A000005", QDate(2002, 2, 3)), MyMoneyMoney());
+ QCOMPARE(m->clearedBalance("A000005", QDate(2002, 2, 4)), MyMoneyMoney(-2000, 100));
+
} catch (const MyMoneyException&) {
QFAIL("Unexpected exception!");
}