[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!");
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.