gnucash maint: Multiple changes pushed
Christopher Lam
clam at code.gnucash.org
Thu Sep 15 08:55:32 EDT 2022
Updated via https://github.com/Gnucash/gnucash/commit/8dd063b8 (commit)
via https://github.com/Gnucash/gnucash/commit/723189b2 (commit)
via https://github.com/Gnucash/gnucash/commit/ab06e1e0 (commit)
via https://github.com/Gnucash/gnucash/commit/1d4e5225 (commit)
from https://github.com/Gnucash/gnucash/commit/5c97da5d (commit)
commit 8dd063b84df47cf045ec140ca0f52fa52c23f5b1
Merge: 5c97da5d8 723189b26
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Thu Sep 15 20:54:43 2022 +0800
Merge branch 'maint-stock-assistant-stock-split' into maint #1414
commit 723189b26c6c8e7d5a638b5f6e88ed054fd4250c
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Tue Aug 23 22:34:14 2022 +0800
[assistant-stock-transaction] special stock_amount input stock splits
diff --git a/gnucash/gnome/assistant-stock-transaction.cpp b/gnucash/gnome/assistant-stock-transaction.cpp
index 7312cc3aa..03b9105b8 100644
--- a/gnucash/gnome/assistant-stock-transaction.cpp
+++ b/gnucash/gnome/assistant-stock-transaction.cpp
@@ -399,9 +399,12 @@ typedef struct
// stock amount page
gnc_numeric balance_at_date;
GtkWidget * stock_amount_page;
+ GtkWidget * stock_amount_title;
GtkWidget * prev_amount;
GtkWidget * next_amount;
+ GtkWidget * next_amount_label;
GtkWidget * stock_amount_edit;
+ GtkWidget * stock_amount_label;
// stock value page
GtkWidget * stock_value_page;
@@ -501,6 +504,24 @@ refresh_page_stock_amount (GtkWidget *widget, gpointer user_data)
if (gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT (info->stock_amount_edit),
&stock_amount, true, nullptr))
gtk_label_set_text (GTK_LABEL(info->next_amount), nullptr);
+ else if (info->txn_type->input_new_balance)
+ {
+ gnc_numeric ratio = gnc_numeric_div (stock_amount, bal,
+ GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
+ if (gnc_numeric_check (ratio) || gnc_numeric_negative_p (ratio))
+ gtk_label_set_text (GTK_LABEL(info->next_amount), nullptr);
+ else
+ {
+ auto str = gnc_numeric_to_string (ratio);
+ auto p = str ? strchr (str, '/') : nullptr;
+ if (p)
+ *p = ':';
+ auto lbl = g_strdup_printf (_("%s Split"), str);
+ gtk_label_set_text (GTK_LABEL(info->next_amount), lbl);
+ g_free (lbl);
+ g_free (str);
+ }
+ }
else
{
if (info->txn_type->stock_amount == FieldMask::ENABLED_CREDIT)
@@ -721,7 +742,30 @@ to ensure proper recording."), new_date_str, last_split_date_str);
NC_ ("Stock Assistant: Page name", "stock value"), errors);
- if (info->txn_type->stock_amount != FieldMask::DISABLED)
+ if (info->txn_type->stock_amount == FieldMask::DISABLED)
+ ;
+ else if (info->txn_type->input_new_balance)
+ {
+ auto stock_amount = gnc_amount_edit_get_amount
+ (GNC_AMOUNT_EDIT(info->stock_amount_edit));
+ auto credit_side = (info->txn_type->stock_amount & FieldMask::ENABLED_CREDIT);
+ auto delta = gnc_numeric_sub_fixed (stock_amount, info->balance_at_date);
+ auto ratio = gnc_numeric_div (stock_amount, info->balance_at_date,
+ GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
+ auto stock_pinfo = gnc_commodity_print_info
+ (xaccAccountGetCommodity (info->acct), true);
+ stock_amount = gnc_numeric_sub_fixed (stock_amount, info->balance_at_date);
+ line.units = xaccPrintAmount (stock_amount, stock_pinfo);
+ if (gnc_numeric_check (ratio))
+ add_error_str (errors, N_("Invalid stock new balance"));
+ else if (gnc_numeric_negative_p (ratio))
+ add_error_str (errors, N_("New and old balance must have same signs"));
+ else if (gnc_numeric_negative_p (delta) && !credit_side)
+ add_error_str (errors, N_("New balance must be higher than old balance"));
+ else if (gnc_numeric_positive_p (delta) && credit_side)
+ add_error_str (errors, N_("New balance must be lower than old balance"));
+ }
+ else
{
auto stock_amount = gnc_amount_edit_get_amount
(GNC_AMOUNT_EDIT(info->stock_amount_edit));
@@ -880,6 +924,17 @@ stock_assistant_prepare (GtkAssistant *assistant, GtkWidget *page,
case PAGE_STOCK_AMOUNT:
info->balance_at_date = xaccAccountGetBalanceAsOfDate
(info->acct, gnc_date_edit_get_date_end (GNC_DATE_EDIT (info->date_edit)));
+ gtk_label_set_text_with_mnemonic
+ (GTK_LABEL (info->stock_amount_label),
+ info->txn_type->input_new_balance ? _("Ne_w Balance") : _("_Shares"));
+ gtk_label_set_text
+ (GTK_LABEL (info->next_amount_label),
+ info->txn_type->input_new_balance ? _("Ratio") : _("Next Balance"));
+ gtk_label_set_text
+ (GTK_LABEL (info->stock_amount_title),
+ info->txn_type->input_new_balance ?
+ _("Enter the new balance of shares after the stock split.") :
+ _("Enter the number of shares you gained or lost in the transaction."));
refresh_page_stock_amount (info->stock_amount_edit, info);
// fixme: the following doesn't work???
gtk_widget_grab_focus (gnc_amount_edit_gtk_entry
@@ -945,7 +1000,9 @@ create_split (Transaction *trans, FieldMask splitfield,
if (skip_if_zero && gnc_numeric_zero_p (value_numeric))
return;
- if (splitfield & FieldMask::ENABLED_CREDIT)
+ 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);
@@ -1024,6 +1081,8 @@ 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 ();
+ if (info->txn_type->input_new_balance)
+ stock_amount = gnc_numeric_sub_fixed (stock_amount, info->balance_at_date);
create_split (trans, info->txn_type->stock_amount | info->txn_type->stock_value,
NC_ ("Stock Assistant: Action field", "Stock"),
info->acct, account_commits, info->stock_memo_edit,
@@ -1232,9 +1291,12 @@ stock_assistant_create (StockTransactionInfo *info)
/* Stock Amount Page Widgets */
info->stock_amount_page = get_widget (builder, "stock_amount_page");
+ info->stock_amount_title = get_widget (builder, "stock_amount_title");
info->prev_amount = get_widget (builder, "prev_balance_amount");
+ info->stock_amount_label = get_widget (builder, "stock_amount_label");
info->stock_amount_edit = create_gae (builder, 1, xaccAccountGetCommodity (info->acct), "stock_amount_table", "stock_amount_label");
info->next_amount = get_widget (builder, "next_balance_amount");
+ info->next_amount_label = get_widget (builder, "next_balance_label");
g_signal_connect (info->stock_amount_edit, "changed",
G_CALLBACK (refresh_page_stock_amount), info);
commit ab06e1e0659d0d3236e1aad86cccc6084ed448d6
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Tue Aug 23 22:32:20 2022 +0800
[assistant-stock-transaction] specialises stock_amount input
diff --git a/gnucash/gnome/assistant-stock-transaction.cpp b/gnucash/gnome/assistant-stock-transaction.cpp
index 9c9f0da51..7312cc3aa 100644
--- a/gnucash/gnome/assistant-stock-transaction.cpp
+++ b/gnucash/gnome/assistant-stock-transaction.cpp
@@ -113,6 +113,7 @@ FieldMask operator ^(FieldMask lhs, FieldMask rhs)
struct TxnTypeInfo
{
FieldMask stock_amount;
+ bool input_new_balance;
FieldMask stock_value;
FieldMask cash_value;
FieldMask fees_value;
@@ -131,6 +132,7 @@ static const TxnTypeVec starting_types
{
{
FieldMask::ENABLED_DEBIT, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_DEBIT, // stock_val
FieldMask::ENABLED_CREDIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -144,6 +146,7 @@ static const TxnTypeVec starting_types
},
{
FieldMask::ENABLED_CREDIT, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_CREDIT, // stock_val
FieldMask::ENABLED_DEBIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -161,6 +164,7 @@ static const TxnTypeVec long_types
{
{
FieldMask::ENABLED_DEBIT, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_DEBIT, // stock_val
FieldMask::ENABLED_CREDIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -174,6 +178,7 @@ static const TxnTypeVec long_types
},
{
FieldMask::ENABLED_CREDIT, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_CREDIT, // stock_val
FieldMask::ENABLED_DEBIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -187,6 +192,7 @@ static const TxnTypeVec long_types
},
{
FieldMask::DISABLED, // stock_amt
+ false, // input_new_balance
FieldMask::DISABLED, // stock_val
FieldMask::ENABLED_DEBIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -201,6 +207,7 @@ reinvested must be subsequently recorded as a regular stock purchase.")
},
{
FieldMask::DISABLED, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_CREDIT, // stock_val
FieldMask::ENABLED_DEBIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -214,6 +221,7 @@ reinvested must be subsequently recorded as a regular stock purchase.")
},
{
FieldMask::DISABLED, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_DEBIT, // stock_val
FieldMask::DISABLED, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -227,6 +235,7 @@ reinvested must be subsequently recorded as a regular stock purchase.")
},
{
FieldMask::ENABLED_DEBIT, // stock_amt
+ true, // input_new_balance
FieldMask::DISABLED, // stock_val
FieldMask::DISABLED, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -240,6 +249,7 @@ reinvested must be subsequently recorded as a regular stock purchase.")
},
{
FieldMask::ENABLED_CREDIT, // stock_amt
+ true, // input_new_balance
FieldMask::DISABLED, // stock_val
FieldMask::DISABLED, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -260,6 +270,7 @@ static const TxnTypeVec short_types
{
{
FieldMask::ENABLED_CREDIT, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_CREDIT, // stock_val
FieldMask::ENABLED_DEBIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -273,6 +284,7 @@ static const TxnTypeVec short_types
},
{
FieldMask::ENABLED_DEBIT, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_DEBIT, // stock_val
FieldMask::ENABLED_CREDIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -286,6 +298,7 @@ static const TxnTypeVec short_types
},
{
FieldMask::DISABLED, // stock_amt
+ false, // input_new_balance
FieldMask::DISABLED, // stock_val
FieldMask::ENABLED_CREDIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -299,6 +312,7 @@ static const TxnTypeVec short_types
},
{
FieldMask::DISABLED, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_DEBIT, // stock_val
FieldMask::ENABLED_CREDIT, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -312,6 +326,7 @@ static const TxnTypeVec short_types
},
{
FieldMask::DISABLED, // stock_amt
+ false, // input_new_balance
FieldMask::ENABLED_CREDIT, // stock_val
FieldMask::DISABLED, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -325,6 +340,7 @@ static const TxnTypeVec short_types
},
{
FieldMask::ENABLED_CREDIT, // stock_amt
+ true, // input_new_balance
FieldMask::DISABLED, // stock_val
FieldMask::DISABLED, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
@@ -338,6 +354,7 @@ static const TxnTypeVec short_types
},
{
FieldMask::ENABLED_DEBIT, // stock_amt
+ true, // input_new_balance
FieldMask::DISABLED, // stock_val
FieldMask::DISABLED, // cash_amt
FieldMask::ENABLED_DEBIT | FieldMask::ALLOW_ZERO, // fees_amt
commit 1d4e522597697c5ec211d7e9a08bd14a19fedb77
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Thu Aug 25 20:25:00 2022 +0800
[assistant-stock-transaction] refactor create_split
takes gnc_numeric instead of GtkWidget*
diff --git a/gnucash/gnome/assistant-stock-transaction.cpp b/gnucash/gnome/assistant-stock-transaction.cpp
index e266f99a5..9c9f0da51 100644
--- a/gnucash/gnome/assistant-stock-transaction.cpp
+++ b/gnucash/gnome/assistant-stock-transaction.cpp
@@ -922,12 +922,9 @@ static void
create_split (Transaction *trans, FieldMask splitfield,
const gchar *action, Account *account,
AccountVec& account_commits, GtkWidget *memo_entry,
- GtkWidget *amount, GtkWidget *value,
- bool skip_if_zero)
+ gnc_numeric amount_numeric, gnc_numeric value_numeric,
+ bool skip_if_zero, StockTransactionInfo *info)
{
- auto amount_numeric = amount ? gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount)) : gnc_numeric_zero ();
- auto value_numeric = value ? gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (value)) : gnc_numeric_zero ();
-
if (skip_if_zero && gnc_numeric_zero_p (value_numeric))
return;
@@ -982,6 +979,11 @@ add_price (GtkWidget *amount, GtkWidget *value,
gnc_price_unref (price);
}
+static gnc_numeric gae_amount (GtkWidget *widget)
+{
+ return gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (widget));
+}
+
void
stock_assistant_finish (GtkAssistant *assistant, gpointer user_data)
{
@@ -1001,52 +1003,59 @@ stock_assistant_finish (GtkAssistant *assistant, gpointer user_data)
auto date = gnc_date_edit_get_date (GNC_DATE_EDIT (info->date_edit));
xaccTransSetDatePostedSecsNormalized (trans, date);
+ auto stock_amount = info->txn_type->stock_amount != FieldMask::DISABLED ?
+ 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"),
info->acct, account_commits, info->stock_memo_edit,
- info->txn_type->stock_amount != FieldMask::DISABLED ? info->stock_amount_edit : nullptr,
- info->txn_type->stock_value != FieldMask::DISABLED ? info->stock_value_edit : nullptr,
- false);
+ stock_amount, stock_value, false, info);
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"),
- gas_account (info->cash_account),
- account_commits, info->cash_memo_edit, info->cash_value,
- info->cash_value, false);
+ gas_account (info->cash_account), account_commits,
+ info->cash_memo_edit, cash, cash, false, info);
+ }
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 ? nullptr : info->fees_value,
- info->fees_value, true);
+ capitalize ? gnc_numeric_zero () : fees, fees, true, info);
}
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"),
- gas_account (info->dividend_account),
- account_commits, info->dividend_memo_edit,
- info->dividend_value, info->dividend_value, false);
+ gas_account (info->dividend_account), account_commits,
+ info->dividend_memo_edit, dividend, dividend, false, info);
+ }
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,
- info->capgains_value, info->capgains_value, false);
+ 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"),
info->acct, account_commits, info->capgains_memo_edit,
- nullptr, info->capgains_value, false);
+ gnc_numeric_zero (), capgains, false, info);
}
if (info->txn_type->stock_amount != FieldMask::DISABLED &&
Summary of changes:
gnucash/gnome/assistant-stock-transaction.cpp | 128 ++++++++++++++++++++++----
1 file changed, 108 insertions(+), 20 deletions(-)
More information about the gnucash-changes
mailing list