[office/kmymoney] kmymoney/views: Fix display of cleared balance during reconciliation

Thomas Baumgart <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 9703b4d901bed1d6e47faec4c36a910b108a2e21 by Thomas Baumgart.
Committed on 07/08/2026 at 09:17.
Pushed by tbaumgart into branch 'master'.

Fix display of cleared balance during reconciliation

BUG: 523940
FIXED-IN: 5.2.3

M  +43   -8    kmymoney/views/reconciliationledgerviewpage.cpp

https://invent.kde.org/office/kmymoney/-/commit/9703b4d901bed1d6e47faec4c36a910b108a2e21

diff --git a/kmymoney/views/reconciliationledgerviewpage.cpp b/kmymoney/views/reconciliationledgerviewpage.cpp
index 5b1fa7d89..ecb568d9f 100644
--- a/kmymoney/views/reconciliationledgerviewpage.cpp
+++ b/kmymoney/views/reconciliationledgerviewpage.cpp
@@ -24,6 +24,7 @@
 #include "icons.h"
 #include "journalmodel.h"
 #include "kendingbalancedlg.h"
+#include "kmmyesno.h"
 #include "kmymoneysettings.h"
 #include "menuenums.h"
 #include "mymoneyaccount.h"
@@ -33,12 +34,11 @@
 #include "mymoneyreconciliationreport.h"
 #include "reconciliationmodel.h"
 #include "schedulesjournalmodel.h"
+#include "securitiesmodel.h"
 #include "specialdatesmodel.h"
 #include "transactionmatcher.h"
 #include "widgetenums.h"
 
-#include "kmmyesno.h"
-
 using namespace Icons;
 using namespace eWidgets;
 
@@ -177,6 +177,7 @@ public:
                     } catch (const MyMoneyException& e) {
                         qWarning("interest transaction not stored: '%s'", e.what());
                     }
+                    updateClearedBalance();
                     updateSummaryInformation();
 
                     // select a transaction close to the reconciliation date
@@ -394,6 +395,42 @@ public:
         return KMyMoneySettings::sortReconcileView();
     }
 
+    void updateClearedBalance()
+    {
+        auto stockSplit = [&](MyMoneyMoney balance, MyMoneyMoney factor) {
+            balance *= factor;
+            const auto account = MyMoneyFile::instance()->accountsModel()->itemById(accountId);
+            const auto security = MyMoneyFile::instance()->securitiesModel()->itemById(account.currencyId());
+
+            AlkValue::RoundingMethod roundingMethod = AlkValue::RoundRound;
+            if (security.roundingMethod() != AlkValue::RoundNever)
+                roundingMethod = security.roundingMethod();
+
+            int securityFraction = security.smallestAccountFraction();
+
+            return balance.convertDenominator(securityFraction, roundingMethod);
+        };
+
+        const auto endDate = endingBalanceDlg->statementDate();
+        const auto journalModel = MyMoneyFile::instance()->journalModel();
+        const auto journalRows = journalModel->rowCount();
+
+        clearedBalance = MyMoneyMoney();
+        for (int row = 0; row < journalRows; ++row) {
+            const JournalEntry& journalEntry = static_cast<TreeItem<JournalEntry>*>(journalModel->index(row, 0).internalPointer())->constDataRef();
+            const auto& split = journalEntry.split();
+            if ((split.accountId() == accountId) && (split.reconcileFlag() != eMyMoney::Split::State::NotReconciled)) {
+                if (journalEntry.transaction().postDate() <= endDate) {
+                    if (Q_UNLIKELY(journalEntry.transaction().isStockSplit())) {
+                        clearedBalance = stockSplit(clearedBalance, journalEntry.split().shares());
+                    } else {
+                        clearedBalance += journalEntry.split().shares();
+                    }
+                }
+            }
+        }
+    }
+
     void updateSummaryInformation() const override
     {
         ui->m_reconciliationContainer->setVisible(endingBalanceDlg != nullptr);
@@ -478,11 +515,9 @@ bool ReconciliationLedgerViewPage::executeAction(eMenu::Action action, const Sel
 
 void ReconciliationLedgerViewPage::updateSummaryInformation(const QHash<QString, AccountBalances>& balances)
 {
+    Q_UNUSED(balances)
+
     auto dd = static_cast<ReconciliationLedgerViewPage::Private*>(d);
-    const auto it = balances.find(d->accountId);
-    if (it != balances.cend()) {
-        dd->totalBalance = (*it).m_totalBalance;
-        dd->clearedBalance = (*it).m_clearedBalance;
-        dd->updateSummaryInformation();
-    }
+    dd->updateClearedBalance();
+    dd->updateSummaryInformation();
 }
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.