gnucash maint: [assistant-stock-transaction] handle sign reversal outside create_split

Christopher Lam clam at code.gnucash.org
Sun Dec 18 22:52:18 EST 2022


Updated	 via  https://github.com/Gnucash/gnucash/commit/52deda86 (commit)
	from  https://github.com/Gnucash/gnucash/commit/dec66bc8 (commit)



commit 52deda868ff042a2815cc6b91464a1d3415a447b
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Dec 18 11:39:51 2022 +0800

    [assistant-stock-transaction] handle sign reversal outside create_split
    
    Passing the FieldMask as an arg to create_split is the wrong approach;
    it needs to test the input_new_balance bool and the FieldMask to
    determine whether negation should take place. It's best to handle
    negation outside create_split.
    
    Thus cash&fee amounts are not mangled when creating a stock-split
    transaction whose input_new_balance is true.

diff --git a/gnucash/gnome/assistant-stock-transaction.cpp b/gnucash/gnome/assistant-stock-transaction.cpp
index c0022757c..077ef428a 100644
--- a/gnucash/gnome/assistant-stock-transaction.cpp
+++ b/gnucash/gnome/assistant-stock-transaction.cpp
@@ -1005,23 +1005,10 @@ forward_page_func (gint current_page, gpointer user_data)
 }
 
 static void
-create_split (Transaction *trans, FieldMask splitfield,
-              const gchar *action, Account *account,
+create_split (Transaction *trans, const gchar *action, Account *account,
               AccountVec& account_commits, GtkWidget *memo_entry,
-              gnc_numeric amount_numeric, gnc_numeric value_numeric,
-              bool skip_if_zero, StockTransactionInfo *info)
+              gnc_numeric amount_numeric, gnc_numeric value_numeric)
 {
-    if (skip_if_zero && gnc_numeric_zero_p (value_numeric))
-        return;
-
-    if (info->txn_type->input_new_balance)
-        amount_numeric = gnc_numeric_sub_fixed (amount_numeric, info->balance_at_date);
-    else if (splitfield & FieldMask::ENABLED_CREDIT)
-    {
-        amount_numeric = gnc_numeric_neg (amount_numeric);
-        value_numeric = gnc_numeric_neg (value_numeric);
-    }
-
     auto split = xaccMallocSplit (gnc_get_current_book ());
     xaccSplitSetParent (split, trans);
     xaccAccountBeginEdit (account);
@@ -1096,55 +1083,68 @@ stock_assistant_finish (GtkAssistant *assistant, gpointer user_data)
         gae_amount (info->stock_amount_edit) : gnc_numeric_zero ();
     auto stock_value = info->txn_type->stock_value != FieldMask::DISABLED ?
         gae_amount (info->stock_value_edit) : gnc_numeric_zero ();
-    create_split (trans, info->txn_type->stock_amount | info->txn_type->stock_value,
-                  NC_ ("Stock Assistant: Action field", "Stock"),
+    if (info->txn_type->input_new_balance)
+        stock_amount = gnc_numeric_sub_fixed (stock_amount, info->balance_at_date);
+    else
+    {
+        if (info->txn_type->stock_amount & FieldMask::ENABLED_CREDIT)
+            stock_amount = gnc_numeric_neg (stock_amount);
+        if (info->txn_type->stock_value & FieldMask::ENABLED_CREDIT)
+            stock_value = gnc_numeric_neg (stock_value);
+    }
+
+    create_split (trans, NC_ ("Stock Assistant: Action field", "Stock"),
                   info->acct, account_commits, info->stock_memo_edit,
-                  stock_amount, stock_value, false, info);
+                  stock_amount, stock_value);
 
     if (info->txn_type->cash_value != FieldMask::DISABLED)
     {
         auto cash = gae_amount (info->cash_value);
-        create_split (trans, info->txn_type->cash_value,
-                      NC_ ("Stock Assistant: Action field", "Cash"),
+        if (info->txn_type->cash_value & FieldMask::ENABLED_CREDIT)
+            cash = gnc_numeric_neg (cash);
+
+        create_split (trans, NC_ ("Stock Assistant: Action field", "Cash"),
                       gas_account (info->cash_account), account_commits,
-                      info->cash_memo_edit, cash, cash, false, info);
+                      info->cash_memo_edit, cash, cash);
     }
 
     if (info->txn_type->fees_value != FieldMask::DISABLED)
     {
         auto fees = gae_amount (info->fees_value);
-        auto capitalize = gtk_toggle_button_get_active
-            (GTK_TOGGLE_BUTTON (info->capitalize_fees_checkbox));
-        create_split (trans, info->txn_type->fees_value,
-                      NC_ ("Stock Assistant: Action field", "Fees"),
-                      capitalize ? info->acct : gas_account (info->fees_account),
-                      account_commits, info->fees_memo_edit,
-                      capitalize ? gnc_numeric_zero () : fees, fees, true, info);
+        if (!gnc_numeric_zero_p (fees))
+        {
+            auto capitalize = gtk_toggle_button_get_active
+                (GTK_TOGGLE_BUTTON (info->capitalize_fees_checkbox));
+
+            create_split (trans, NC_ ("Stock Assistant: Action field", "Fees"),
+                          capitalize ? info->acct : gas_account (info->fees_account),
+                          account_commits, info->fees_memo_edit,
+                          capitalize ? gnc_numeric_zero () : fees, fees);
+        }
     }
 
     if (info->txn_type->dividend_value != FieldMask::DISABLED)
     {
         auto dividend = gae_amount (info->dividend_value);
-        create_split (trans, info->txn_type->dividend_value,
-                      NC_ ("Stock Assistant: Action field", "Dividend"),
+        if (info->txn_type->dividend_value & FieldMask::ENABLED_CREDIT)
+            dividend = gnc_numeric_neg (dividend);
+
+        create_split (trans, NC_ ("Stock Assistant: Action field", "Dividend"),
                       gas_account (info->dividend_account), account_commits,
-                      info->dividend_memo_edit, dividend, dividend, false, info);
+                      info->dividend_memo_edit, dividend, dividend);
     }
 
     if (info->txn_type->capgains_value != FieldMask::DISABLED)
     {
         auto capgains = gae_amount (info->capgains_value);
-        create_split (trans, info->txn_type->capgains_value,
-                      NC_ ("Stock Assistant: Action field", "Capital Gain"),
-                      gas_account (info->capgains_account),
-                      account_commits, info->capgains_memo_edit,
-                      capgains, capgains, false, info);
-
-        create_split (trans,
-                      info->txn_type->capgains_value ^ (FieldMask::ENABLED_CREDIT | FieldMask::ENABLED_DEBIT),
-                      NC_ ("Stock Assistant: Action field", "Capital Gain"),
+        create_split (trans, NC_ ("Stock Assistant: Action field", "Capital Gain"),
                       info->acct, account_commits, info->capgains_memo_edit,
-                      gnc_numeric_zero (), capgains, false, info);
+                      gnc_numeric_zero (), capgains);
+
+        capgains = gnc_numeric_neg (capgains);
+        create_split (trans, NC_ ("Stock Assistant: Action field", "Capital Gain"),
+                      gas_account (info->capgains_account), account_commits,
+                      info->capgains_memo_edit, capgains, capgains);
     }
 
     add_price (info, date);



Summary of changes:
 gnucash/gnome/assistant-stock-transaction.cpp | 82 +++++++++++++--------------
 1 file changed, 41 insertions(+), 41 deletions(-)



More information about the gnucash-changes mailing list