diff --git a/src/app-utils/gnc-sx-instance-model.c b/src/app-utils/gnc-sx-instance-model.c index fc5c8af92f1..a9c3ae47e5a 100644 --- a/src/app-utils/gnc-sx-instance-model.c +++ b/src/app-utils/gnc-sx-instance-model.c @@ -947,13 +947,29 @@ _get_template_split_account(const SchedXaction* sx, const Split *template_split, } static void -_get_sx_formula_value(const SchedXaction* sx, const Split *template_split, gnc_numeric *numeric, GList **creation_errors, const char *formula_key, GHashTable *variable_bindings) +_get_sx_formula_value(const SchedXaction* sx, const Split *template_split, gnc_numeric *numeric, GList **creation_errors, const char *formula_key, const char* numeric_key, GHashTable *variable_bindings) { kvp_frame *split_kvpf; kvp_value *kvp_val; char *formula_str, *parseErrorLoc; split_kvpf = xaccSplitGetSlots(template_split); + + /* First look up the gnc_numeric value in the template split */ + kvp_val = kvp_frame_get_slot_path(split_kvpf, + GNC_SX_ID, + numeric_key, + NULL); + *numeric = kvp_value_get_numeric(kvp_val); + if ((gnc_numeric_check(*numeric) == GNC_ERROR_OK) + && !gnc_numeric_zero_p(*numeric)) + { + /* Already a valid non-zero result? Then return and don't + * parse the string. Luckily we avoid any locale problems with + * decimal points here! Phew. */ + return; + } + kvp_val = kvp_frame_get_slot_path(split_kvpf, GNC_SX_ID, formula_key, @@ -995,13 +1011,13 @@ _get_sx_formula_value(const SchedXaction* sx, const Split *template_split, gnc_n static void _get_credit_formula_value(GncSxInstance *instance, const Split *template_split, gnc_numeric *credit_num, GList **creation_errors) { - _get_sx_formula_value(instance->parent->sx, template_split, credit_num, creation_errors, GNC_SX_CREDIT_FORMULA, instance->variable_bindings); + _get_sx_formula_value(instance->parent->sx, template_split, credit_num, creation_errors, GNC_SX_CREDIT_FORMULA, GNC_SX_CREDIT_NUMERIC, instance->variable_bindings); } static void _get_debit_formula_value(GncSxInstance *instance, const Split *template_split, gnc_numeric *debit_num, GList **creation_errors) { - _get_sx_formula_value(instance->parent->sx, template_split, debit_num, creation_errors, GNC_SX_DEBIT_FORMULA, instance->variable_bindings); + _get_sx_formula_value(instance->parent->sx, template_split, debit_num, creation_errors, GNC_SX_DEBIT_FORMULA, GNC_SX_DEBIT_NUMERIC, instance->variable_bindings); } static gboolean @@ -1544,9 +1560,9 @@ create_cashflow_helper(Transaction *template_txn, void *user_data) gint gncn_error; /* Credit value */ - _get_sx_formula_value(creation_data->sx, template_split, &credit_num, creation_data->creation_errors, GNC_SX_CREDIT_FORMULA, NULL); + _get_sx_formula_value(creation_data->sx, template_split, &credit_num, creation_data->creation_errors, GNC_SX_CREDIT_FORMULA, GNC_SX_CREDIT_NUMERIC, NULL); /* Debit value */ - _get_sx_formula_value(creation_data->sx, template_split, &debit_num, creation_data->creation_errors, GNC_SX_DEBIT_FORMULA, NULL); + _get_sx_formula_value(creation_data->sx, template_split, &debit_num, creation_data->creation_errors, GNC_SX_DEBIT_FORMULA, GNC_SX_DEBIT_NUMERIC, NULL); /* The resulting cash flow number: debit minus credit, * multiplied with the count factor. */ diff --git a/src/engine/SX-ttinfo.c b/src/engine/SX-ttinfo.c index 052d964fa8e..1de52d9c65b 100644 --- a/src/engine/SX-ttinfo.c +++ b/src/engine/SX-ttinfo.c @@ -44,6 +44,7 @@ struct TTSplitInfo_s /* FIXME: What about the split's KvpFrame */ char *memo; /* owned by us */ char *credit_formula, *debit_formula; /* owned by us */ + gnc_numeric credit_numeric, debit_numeric; Account *acc; }; @@ -241,11 +242,13 @@ gnc_ttsplitinfo_set_credit_formula_numeric(TTSplitInfo *ttsi, gnc_numeric credit g_free(ttsi->credit_formula); ttsi->credit_formula = gnc_numeric_to_string(credit); + ttsi->credit_numeric = credit; if (ttsi->debit_formula) { g_free(ttsi->debit_formula); ttsi->debit_formula = NULL; + ttsi->debit_numeric = gnc_numeric_zero(); } } @@ -263,6 +266,7 @@ gnc_ttsplitinfo_set_credit_formula(TTSplitInfo *ttsi, const char *credit_formula { g_free(ttsi->debit_formula); ttsi->debit_formula = NULL; + ttsi->debit_numeric = gnc_numeric_zero(); } return; } @@ -282,6 +286,18 @@ gnc_ttsplitinfo_get_debit_formula(TTSplitInfo *ttsi) return ttsi->debit_formula; } +gnc_numeric gnc_ttsplitinfo_get_credit_numeric(const TTSplitInfo *ttsi) +{ + g_return_val_if_fail(ttsi, gnc_numeric_zero()); + return ttsi->credit_numeric; +} + +gnc_numeric gnc_ttsplitinfo_get_debit_numeric(const TTSplitInfo *ttsi) +{ + g_return_val_if_fail(ttsi, gnc_numeric_zero()); + return ttsi->debit_numeric; +} + void gnc_ttsplitinfo_set_debit_formula_numeric(TTSplitInfo *ttsi, gnc_numeric debit) { @@ -292,11 +308,13 @@ gnc_ttsplitinfo_set_debit_formula_numeric(TTSplitInfo *ttsi, gnc_numeric debit) g_free(ttsi->debit_formula); } ttsi->debit_formula = gnc_numeric_to_string(debit); + ttsi->debit_numeric = debit; if (ttsi->credit_formula) { g_free(ttsi->credit_formula); ttsi->credit_formula = NULL; + ttsi->credit_numeric = gnc_numeric_zero(); } return; } @@ -315,6 +333,7 @@ gnc_ttsplitinfo_set_debit_formula(TTSplitInfo *ttsi, const char *debit_formula) { g_free(ttsi->credit_formula); ttsi->credit_formula = NULL; + ttsi->credit_numeric = gnc_numeric_zero(); } return; } diff --git a/src/engine/SX-ttinfo.h b/src/engine/SX-ttinfo.h index 08ea7223000..1b3e8450340 100644 --- a/src/engine/SX-ttinfo.h +++ b/src/engine/SX-ttinfo.h @@ -72,12 +72,14 @@ void gnc_ttsplitinfo_set_credit_formula(TTSplitInfo *split_i, void gnc_ttsplitinfo_set_credit_formula_numeric(TTSplitInfo *split_i, gnc_numeric credit_formula); const char *gnc_ttsplitinfo_get_credit_formula(TTSplitInfo *split_i); +gnc_numeric gnc_ttsplitinfo_get_credit_numeric(const TTSplitInfo *split_i); void gnc_ttsplitinfo_set_debit_formula(TTSplitInfo *split_i, const char *debit_formula); void gnc_ttsplitinfo_set_debit_formula_numeric(TTSplitInfo *split_i, gnc_numeric debit_formula); const char *gnc_ttsplitinfo_get_debit_formula(TTSplitInfo *split_i); +gnc_numeric gnc_ttsplitinfo_get_debit_numeric(const TTSplitInfo *split_i); void gnc_ttsplitinfo_set_account(TTSplitInfo *split_i, Account *acc); Account *gnc_ttsplitinfo_get_account(TTSplitInfo *split_i); diff --git a/src/engine/SchedXaction.c b/src/engine/SchedXaction.c index b06fcdbb9c0..92bdf1371b2 100644 --- a/src/engine/SchedXaction.c +++ b/src/engine/SchedXaction.c @@ -1061,6 +1061,15 @@ pack_split_info (TTSplitInfo *s_info, Account *parent_acct, NULL); kvp_value_delete(tmp_value); + tmp_value + = kvp_value_new_numeric(gnc_ttsplitinfo_get_credit_numeric(s_info)); + kvp_frame_set_slot_path(split_frame, + tmp_value, + GNC_SX_ID, + GNC_SX_CREDIT_NUMERIC, + NULL); + kvp_value_delete(tmp_value); + tmp_value = kvp_value_new_string(gnc_ttsplitinfo_get_debit_formula(s_info)); @@ -1072,6 +1081,15 @@ pack_split_info (TTSplitInfo *s_info, Account *parent_acct, kvp_value_delete(tmp_value); + tmp_value + = kvp_value_new_numeric(gnc_ttsplitinfo_get_debit_numeric(s_info)); + kvp_frame_set_slot_path(split_frame, + tmp_value, + GNC_SX_ID, + GNC_SX_DEBIT_NUMERIC, + NULL); + kvp_value_delete(tmp_value); + acc_guid = qof_entity_get_guid(QOF_INSTANCE(gnc_ttsplitinfo_get_account(s_info))); tmp_value = kvp_value_new_guid(acc_guid); diff --git a/src/engine/SchedXaction.h b/src/engine/SchedXaction.h index a00ec94958d..767de21c222 100644 --- a/src/engine/SchedXaction.h +++ b/src/engine/SchedXaction.h @@ -315,6 +315,8 @@ GList *gnc_sx_get_defer_instances( SchedXaction *sx ); #define GNC_SX_ACCOUNT "account" #define GNC_SX_CREDIT_FORMULA "credit-formula" #define GNC_SX_DEBIT_FORMULA "debit-formula" +#define GNC_SX_CREDIT_NUMERIC "credit-numeric" +#define GNC_SX_DEBIT_NUMERIC "debit-numeric" #define GNC_SX_SHARES "shares" #define GNC_SX_AMOUNT "amnt" #define GNC_SX_FROM_SCHED_XACTION "from-sched-xaction" diff --git a/src/gnome/dialog-sx-from-trans.c b/src/gnome/dialog-sx-from-trans.c index a99b33d8237..f62df57244a 100644 --- a/src/gnome/dialog-sx-from-trans.c +++ b/src/gnome/dialog-sx-from-trans.c @@ -231,7 +231,6 @@ sxftd_add_template_trans(SXFromTransInfo *sxfti) Split *sp; gnc_numeric runningBalance; gnc_numeric split_value; - const char *tmpStr; runningBalance = gnc_numeric_zero(); @@ -252,16 +251,12 @@ sxftd_add_template_trans(SXFromTransInfo *sxfti) if (gnc_numeric_positive_p(split_value)) { - tmpStr = xaccPrintAmount( split_value, - gnc_default_print_info(FALSE) ); - gnc_ttsplitinfo_set_debit_formula( ttsi, tmpStr ); + gnc_ttsplitinfo_set_debit_formula_numeric( ttsi, split_value ); } else { /* Negate the numeric so it prints w/o the sign at the front. */ - tmpStr = xaccPrintAmount( gnc_numeric_neg( split_value ), - gnc_default_print_info(FALSE) ); - gnc_ttsplitinfo_set_credit_formula( ttsi, tmpStr ); + gnc_ttsplitinfo_set_credit_formula_numeric ( ttsi, split_value ); } /* Copy over per-split account info */ diff --git a/src/register/ledger-core/split-register-model-save.c b/src/register/ledger-core/split-register-model-save.c index e68c7049ac0..502b97191e2 100644 --- a/src/register/ledger-core/split-register-model-save.c +++ b/src/register/ledger-core/split-register-model-save.c @@ -33,6 +33,7 @@ #include "recncell.h" #include "split-register-model-save.h" #include "split-register-p.h" +#include "app-utils/gnc-exp-parser.h" struct sr_save_data @@ -677,6 +678,9 @@ gnc_template_register_save_debcred_cell (BasicCell * cell, SplitRegister *reg = user_data; kvp_frame *kvpf; const char *value; + char *error_loc; + gnc_numeric new_amount; + gboolean parse_result; g_return_if_fail (gnc_basic_cell_has_name (cell, FDEBT_CELL) || gnc_basic_cell_has_name (cell, FCRED_CELL)); @@ -696,6 +700,20 @@ gnc_template_register_save_debcred_cell (BasicCell * cell, GNC_SX_CREDIT_FORMULA, NULL); + /* If the value can be parsed into a numeric result (without any + * further variable definitions), store that numeric value + * additionally in the kvp. Otherwise store a zero numeric + * there.*/ + parse_result = gnc_exp_parser_parse_separate_vars(value, &new_amount, &error_loc, NULL); + if (!parse_result) + { + new_amount = gnc_numeric_zero(); + } + kvp_frame_set_slot_path (kvpf, kvp_value_new_numeric (new_amount), + GNC_SX_ID, + GNC_SX_CREDIT_NUMERIC, + NULL); + value = gnc_table_layout_get_cell_value (reg->table->layout, FDEBT_CELL); kvp_frame_set_slot_path (kvpf, @@ -704,6 +722,18 @@ gnc_template_register_save_debcred_cell (BasicCell * cell, GNC_SX_DEBIT_FORMULA, NULL); + /* If the value can be parsed into a numeric result, store that + * numeric value additionally. See above comment.*/ + parse_result = gnc_exp_parser_parse_separate_vars(value, &new_amount, &error_loc, NULL); + if (!parse_result) + { + new_amount = gnc_numeric_zero(); + } + kvp_frame_set_slot_path (kvpf, kvp_value_new_numeric (new_amount), + GNC_SX_ID, + GNC_SX_DEBIT_NUMERIC, + NULL); + DEBUG ("kvp_frame after: %s\n", kvp_frame_to_string (kvpf)); /* set the amount to an innocuous value */