31 #include "engine-helpers.h"
33 #include "pricecell.h"
35 #include "split-register-model-save.h"
36 #include "split-register-p.h"
37 #include "app-utils/gnc-exp-parser.h"
47 gboolean reg_expanded;
55 gnc_split_register_save_date_cell (
BasicCell * cell,
63 g_return_if_fail (gnc_basic_cell_has_name (cell, DATE_CELL));
65 value = gnc_basic_cell_get_value (cell);
68 gnc_date_cell_commit ((
DateCell *) cell);
70 DEBUG (
"DATE: %s", value ? value :
"(null)");
72 gnc_date_cell_get_date_gdate ((
DateCell *) cell, &gdate);
78 gnc_split_register_save_type_cell (
BasicCell * cell,
85 g_return_if_fail (gnc_basic_cell_has_name (cell, TYPE_CELL));
87 value = gnc_recn_cell_get_flag ((
RecnCell *)cell);
93 gnc_split_register_save_due_date_cell (
BasicCell * cell,
101 g_return_if_fail (gnc_basic_cell_has_name (cell, DDUE_CELL));
103 value = gnc_basic_cell_get_value (cell);
106 gnc_date_cell_commit ((
DateCell *) cell);
108 DEBUG (
"DATE: %s", value ? value :
"(null)");
110 gnc_date_cell_get_date ((
DateCell *) cell, &ts);
116 gnc_split_register_save_num_cell (
BasicCell * cell,
124 g_return_if_fail (gnc_basic_cell_has_name (cell, NUM_CELL));
126 value = gnc_basic_cell_get_value (cell);
128 DEBUG (
"NUM: %s\n", value ? value :
"(null)");
131 gnc_set_num_action (sd->trans, sd->split, value, NULL);
133 if (gnc_num_cell_set_last_num ((
NumCell *) cell, value))
135 SRInfo *info = gnc_split_register_get_info (reg);
137 gnc_get_current_book ());
140 if (sd->trans == blank_trans)
141 gnc_split_register_set_last_num (reg, gnc_basic_cell_get_value (cell));
146 gnc_split_register_save_tnum_cell (
BasicCell * cell,
154 g_return_if_fail (gnc_basic_cell_has_name (cell, TNUM_CELL));
156 value = gnc_basic_cell_get_value (cell);
158 DEBUG (
"TNUM: %s\n", value ? value :
"(null)");
161 gnc_set_num_action (sd->trans, NULL, value, NULL);
165 gnc_split_register_save_desc_cell (
BasicCell * cell,
172 g_return_if_fail (gnc_basic_cell_has_name (cell, DESC_CELL));
174 value = gnc_basic_cell_get_value (cell);
176 DEBUG (
"DESC: %s", value ? value :
"(null)");
182 gnc_split_register_save_notes_cell (
BasicCell * cell,
189 g_return_if_fail (gnc_basic_cell_has_name (cell, NOTES_CELL));
191 value = gnc_basic_cell_get_value (cell);
193 DEBUG (
"NOTES: %s", value ? value :
"(null)");
199 gnc_split_register_save_recn_cell (
BasicCell * bcell,
206 g_return_if_fail (gnc_basic_cell_has_name (bcell, RECN_CELL));
208 DEBUG (
"RECN: %c", gnc_recn_cell_get_flag (cell));
214 gnc_split_register_save_actn_cell (
BasicCell * cell,
221 g_return_if_fail (gnc_basic_cell_has_name (cell, ACTN_CELL));
223 value = gnc_basic_cell_get_value (cell);
225 DEBUG (
"ACTN: %s", value ? value :
"(null)");
229 gnc_set_num_action (NULL, sd->split, NULL, value);
233 gnc_split_register_save_memo_cell (
BasicCell * cell,
240 g_return_if_fail (gnc_basic_cell_has_name (cell, MEMO_CELL));
242 value = gnc_basic_cell_get_value (cell);
244 DEBUG (
"MEMO: %s", value ? value :
"(null)");
255 gnc_split_register_save_xfrm_cell (
BasicCell * cell,
264 g_return_if_fail (gnc_basic_cell_has_name (cell, XFRM_CELL));
268 new_acc = gnc_split_register_get_account (reg, XFRM_CELL);
270 if ((new_acc != NULL) && (old_acc != new_acc))
275 gnc_split_register_save_mxfrm_cell (
BasicCell * cell,
283 g_return_if_fail (gnc_basic_cell_has_name (cell, MXFRM_CELL));
315 new_acc = gnc_split_register_get_account (reg, MXFRM_CELL);
317 if ((new_acc != NULL) && (old_acc != new_acc))
323 gnc_split_register_save_shares_cell (
BasicCell * bcell,
331 g_return_if_fail (gnc_basic_cell_has_name (bcell, SHRS_CELL));
333 amount = gnc_price_cell_get_value (cell);
343 gnc_split_register_save_price_cell (
BasicCell * bcell,
351 g_return_if_fail (gnc_basic_cell_has_name (bcell, PRIC_CELL));
353 price = gnc_price_cell_get_value (cell);
372 cell = (
PriceCell *) gnc_table_layout_get_cell (reg->
table->layout,
374 credit = gnc_price_cell_get_value (cell);
376 cell = (
PriceCell *) gnc_table_layout_get_cell (reg->
table->layout,
378 debit = gnc_price_cell_get_value (cell);
380 new_amount = gnc_numeric_sub_fixed (debit, credit);
386 gnc_split_register_get_rate_cell (
SplitRegister *reg,
const char *cell_name)
390 rate_cell = (
PriceCell*) gnc_table_layout_get_cell (reg->
table->layout,
393 return gnc_price_cell_get_value (rate_cell);
396 return gnc_numeric_create (100, 100);
405 return gnc_split_register_needs_conv_rate (reg, txn, acc);
416 new_amount = gnc_split_register_debcred_cell_value (reg);
417 acc = gnc_split_register_get_default_account (reg);
427 amtconv = convrate = gnc_split_register_get_rate_cell (reg, RATE_CELL);
428 if (acc && gnc_split_register_needs_conv_rate (reg, sd->trans, acc))
436 amtconv = xaccTransGetAccountConvRate(sd->trans, acc);
444 if (reg->type == STOCK_REGISTER ||
445 reg->type == CURRENCY_REGISTER ||
446 reg->type == PORTFOLIO_LEDGER)
462 if (gnc_split_register_split_needs_amount (reg, sd->split))
491 if (acc && gnc_split_register_needs_conv_rate (reg, sd->trans, acc))
509 if (gnc_split_register_split_needs_amount (reg, sd->split))
520 gnc_split_register_save_debcred_cell (
BasicCell * bcell,
527 g_return_if_fail (gnc_basic_cell_has_name (bcell, DEBT_CELL) ||
528 gnc_basic_cell_has_name (bcell, CRED_CELL));
533 gnc_split_register_save_amount_values (sd, reg);
535 sd->handled_dc = TRUE;
540 gnc_split_register_save_rate_cell (
BasicCell * bcell,
551 gnc_split_register_save_cells (gpointer save_data,
560 g_return_if_fail (sd != NULL);
570 rate = gnc_split_register_get_rate_cell (reg, RATE_CELL);
572 if (other_split && !sd->reg_expanded)
576 gboolean split_needs_amount;
578 split_needs_amount = gnc_split_register_split_needs_amount(reg, sd->split);
596 if (gnc_split_register_split_needs_amount (reg, other_split))
619 else if (gnc_split_register_split_needs_amount (reg, sd->split) &&
632 gnc_split_register_save_amount_values (sd, reg);
646 gnc_template_register_save_unexpected_cell (
BasicCell * cell,
650 PERR (
"unexpected changed fields in a template register");
654 gnc_template_register_save_xfrm_cell (
BasicCell * cell,
660 SRInfo *info = gnc_split_register_get_info (reg);
666 g_return_if_fail (gnc_basic_cell_has_name (cell, XFRM_CELL));
669 acct = gnc_split_register_get_account (reg, XFRM_CELL);
672 PERR (
"unknown account");
678 "sx-account", acctGUID,
681 gnc_get_current_book ());
688 gnc_template_register_save_mxfrm_cell (
BasicCell * cell,
695 gnc_template_register_save_debcred_cell (
BasicCell * cell,
701 const char *credit_formula, *debit_formula;
704 gboolean parse_result;
706 g_return_if_fail (gnc_basic_cell_has_name (cell, FDEBT_CELL) ||
707 gnc_basic_cell_has_name (cell, FCRED_CELL));
714 credit_formula = gnc_table_layout_get_cell_value (reg->
table->layout,
720 parse_result = gnc_exp_parser_parse_separate_vars(credit_formula,
724 credit_amount = gnc_numeric_zero();
726 debit_formula = gnc_table_layout_get_cell_value (reg->
table->layout,
731 parse_result = gnc_exp_parser_parse_separate_vars(debit_formula,
735 debit_amount = gnc_numeric_zero();
738 "sx-credit-formula", credit_formula,
739 "sx-credit-numeric", &credit_amount,
740 "sx-debit-formula", debit_formula,
741 "sx-debit-numeric", &debit_amount,
747 sd->handled_dc = TRUE;
751 gnc_template_register_save_shares_cell (
BasicCell * cell,
756 char *sharesStr =
"(x + y)/42";
758 g_return_if_fail (gnc_basic_cell_has_name (cell, SHRS_CELL));
761 "sx-shares", sharesStr,
767 gnc_numeric_create (0, 1),
768 gnc_numeric_create (0, 1));
772 gnc_split_register_model_add_save_handlers (
TableModel *model)
774 g_return_if_fail (model != NULL);
776 gnc_table_model_set_save_handler (model,
777 gnc_split_register_save_date_cell,
780 gnc_table_model_set_save_handler (model,
781 gnc_split_register_save_due_date_cell,
784 gnc_table_model_set_save_handler (model,
785 gnc_split_register_save_type_cell,
788 gnc_table_model_set_save_handler (model,
789 gnc_split_register_save_num_cell,
792 gnc_table_model_set_save_handler (model,
793 gnc_split_register_save_tnum_cell,
796 gnc_table_model_set_save_handler (model,
797 gnc_split_register_save_desc_cell,
800 gnc_table_model_set_save_handler (model,
801 gnc_split_register_save_notes_cell,
804 gnc_table_model_set_save_handler (model,
805 gnc_split_register_save_recn_cell,
808 gnc_table_model_set_save_handler (model,
809 gnc_split_register_save_actn_cell,
812 gnc_table_model_set_save_handler (model,
813 gnc_split_register_save_memo_cell,
816 gnc_table_model_set_save_handler (model,
817 gnc_split_register_save_xfrm_cell,
820 gnc_table_model_set_save_handler (model,
821 gnc_split_register_save_mxfrm_cell,
824 gnc_table_model_set_save_handler (model,
825 gnc_split_register_save_shares_cell,
828 gnc_table_model_set_save_handler (model,
829 gnc_split_register_save_price_cell,
832 gnc_table_model_set_save_handler (model,
833 gnc_split_register_save_debcred_cell,
836 gnc_table_model_set_save_handler (model,
837 gnc_split_register_save_debcred_cell,
840 gnc_table_model_set_save_handler (model,
841 gnc_split_register_save_rate_cell,
844 gnc_table_model_set_post_save_handler (model, gnc_split_register_save_cells);
848 gnc_template_register_model_add_save_handlers (
TableModel *model)
850 g_return_if_fail (model != NULL);
852 gnc_split_register_model_add_save_handlers (model);
854 gnc_table_model_set_save_handler (model,
855 gnc_template_register_save_unexpected_cell,
858 gnc_table_model_set_save_handler (model,
859 gnc_template_register_save_unexpected_cell,
862 gnc_table_model_set_save_handler (model,
863 gnc_template_register_save_xfrm_cell,
866 gnc_table_model_set_save_handler (model,
867 gnc_template_register_save_mxfrm_cell,
870 gnc_table_model_set_save_handler (model,
871 gnc_template_register_save_debcred_cell,
874 gnc_table_model_set_save_handler (model,
875 gnc_template_register_save_debcred_cell,
878 gnc_table_model_set_save_handler (model,
879 gnc_template_register_save_shares_cell,
889 g_return_val_if_fail (trans != NULL, NULL);
890 g_return_val_if_fail (split != NULL, NULL);
896 sd->handled_dc = FALSE;
897 sd->do_scrub = FALSE;
898 sd->reg_expanded = expanded;
904 gnc_split_register_save_data_destroy (
SRSaveData *sd)
void xaccSplitSetValue(Split *s, gnc_numeric amt)
#define xaccTransAppendSplit(t, s)
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Split * xaccTransGetSplit(const Transaction *trans, int i)
gboolean xaccTransUseTradingAccounts(const Transaction *trans)
gboolean xaccAccountIsPriced(const Account *acc)
The type, style and table for the register.
int xaccAccountGetCommoditySCU(const Account *acc)
gnc_numeric gnc_numeric_neg(gnc_numeric a)
void xaccTransSetNotes(Transaction *trans, const char *notes)
#define DEBUG(format, args...)
void qof_instance_set(QofInstance *inst, const gchar *first_param,...)
Wrapper for g_object_set Group setting multiple parameters in a single begin/commit/rollback.
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
void xaccTransSetDescription(Transaction *trans, const char *desc)
Use a 64-bit unsigned int timespec.
gboolean gnc_numeric_zero_p(gnc_numeric a)
void xaccSplitSetReconcile(Split *split, char recn)
Transaction * xaccSplitGetParent(const Split *split)
#define PERR(format, args...)
void xaccTransSetDatePostedGDate(Transaction *trans, GDate date)
#define xaccAccountGetGUID(X)
void xaccTransSetTxnType(Transaction *trans, char type)
convert single-entry accounts to clean double-entry
Split * xaccSplitLookup(const GncGUID *guid, QofBook *book)
void xaccSplitSetAmount(Split *s, gnc_numeric amt)
gnc_numeric gnc_numeric_mul(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
void xaccSplitSetMemo(Split *split, const char *memo)
void xaccSplitSetSharePriceAndAmount(Split *s, gnc_numeric price, gnc_numeric amt)
void xaccSplitScrub(Split *split)
gnc_numeric gnc_numeric_div(gnc_numeric x, gnc_numeric y, gint64 denom, gint how)
All type declarations for the whole Gnucash engine.
Split * xaccMallocSplit(QofBook *book)
gnc_numeric xaccSplitGetValue(const Split *split)
Account * xaccSplitGetAccount(const Split *s)
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
#define xaccAccountInsertSplit(acc, s)
void xaccTransSetDateDueTS(Transaction *trans, const Timespec *ts)
struct KvpFrameImpl KvpFrame
Split * xaccSplitGetOtherSplit(const Split *split)
void xaccSplitSetSharePrice(Split *s, gnc_numeric price)
Scheduled Transactions public handling routines.
gboolean gnc_commodity_is_iso(const gnc_commodity *cm)
const gchar * QofLogModule
gnc_numeric xaccSplitGetAmount(const Split *split)
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)