[office/kmymoney/5.2] 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 942f7d180c200224bfa5d27328bb9d1ab1ea1a35 by Thomas Baumgart.
Committed on 26/07/2026 at 06:16.
Pushed by tbaumgart into branch '5.2'.

Fix initial cleared balance display for liability accounts

BUG: 523478
FIXED-IN: 5.2.3
(cherry picked from commit 8066b6cda57ba3f6b46238077a867318f18d5876)

M  +1    -27   kmymoney/mymoney/mymoneyfile.cpp
M  +34   -0    kmymoney/mymoney/tests/mymoneyfile-test.cpp

https://invent.kde.org/office/kmymoney/-/commit/942f7d180c200224bfa5d27328bb9d1ab1ea1a35

diff --git a/kmymoney/mymoney/mymoneyfile.cpp b/kmymoney/mymoney/mymoneyfile.cpp
index 0cf2338d6..7c8f43c5f 100644
--- a/kmymoney/mymoney/mymoneyfile.cpp
+++ b/kmymoney/mymoney/mymoneyfile.cpp
@@ -2818,33 +2818,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/mymoneyfile-test.cpp b/kmymoney/mymoney/tests/mymoneyfile-test.cpp
index 9c06257a1..35f7bccc2 100644
--- a/kmymoney/mymoney/tests/mymoneyfile-test.cpp
+++ b/kmymoney/mymoney/tests/mymoneyfile-test.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.