From 53d34ccdb34e6b8292020ae3e243d74f98f13756 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Thu, 24 Sep 2026 21:28:41 +0800 Subject: [PATCH] Bug 799820 - Stock Assistant incorrectly records Capital Loss Because the set_value() called for every "changed" event with a negative amount, and m_debit_side was being toggled repeatedly. Set m_debit_side according to the sign of amount cf the field dr/cr side. --- gnucash/gnome/assistant-stock-transaction.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/gnucash/gnome/assistant-stock-transaction.cpp b/gnucash/gnome/assistant-stock-transaction.cpp index 97c2c03e00..4e117ba71e 100644 --- a/gnucash/gnome/assistant-stock-transaction.cpp +++ b/gnucash/gnome/assistant-stock-transaction.cpp @@ -539,8 +539,9 @@ class StockTransactionEntry protected: bool m_enabled; bool m_debit_side; + bool m_fieldmask_debit_side = false; bool m_allow_zero; - bool m_allow_negative; + bool m_allow_negative = false; bool m_input_new_balance = false; Account *m_account; gnc_numeric m_value; @@ -644,6 +645,7 @@ StockTransactionEntry::set_fieldmask(FieldMask mask) { m_enabled = mask != FieldMask::DISABLED; m_debit_side = mask & FieldMask::ENABLED_DEBIT; + m_fieldmask_debit_side = m_debit_side; m_allow_zero = mask & FieldMask::ALLOW_ZERO; m_allow_negative = mask & FieldMask::ALLOW_NEGATIVE; } @@ -667,15 +669,9 @@ StockTransactionEntry::set_value(gnc_numeric amount) return; } - if (gnc_numeric_negative_p (amount)) - { - m_value = gnc_numeric_neg(amount); - m_debit_side = !m_debit_side; - } - else - { - m_value = amount; - } + m_value = gnc_numeric_abs(amount); + m_debit_side = m_fieldmask_debit_side != gnc_numeric_negative_p (amount); + PINFO("Set %s value to %" PRId64 "/%" PRId64, m_action, m_value.num, m_value.denom); } @@ -819,6 +815,7 @@ StockTransactionStockEntry::set_fieldmask(FieldMask mask) m_enabled = mask & (FieldMask::ENABLED_CREDIT | FieldMask::ENABLED_DEBIT); m_amount_enabled = mask & (FieldMask::AMOUNT_CREDIT | FieldMask::AMOUNT_DEBIT); m_debit_side = mask & (FieldMask::ENABLED_DEBIT | FieldMask::AMOUNT_DEBIT); + m_fieldmask_debit_side = m_debit_side; m_input_new_balance = mask & FieldMask::INPUT_NEW_BALANCE; m_marker = mask & FieldMask::MARKER_SPLIT; }