diff --git a/gnucash/import-export/ofx/gnc-ofx-import.c b/gnucash/import-export/ofx/gnc-ofx-import.c index d6527561ca..c1f0bd205f 100644 --- a/gnucash/import-export/ofx/gnc-ofx-import.c +++ b/gnucash/import-export/ofx/gnc-ofx-import.c @@ -625,7 +625,10 @@ int ofx_proc_transaction_cb(struct OfxTransactionData data, void *user_data) } else if (data.reference_number_valid) { - gnc_set_num_action(transaction, split, data.reference_number, NULL); + const char *num_value = + strcasecmp (data.reference_number, "null") == 0 ? "" : + data.check_number; + gnc_set_num_action(transaction, split, num_value, NULL); } /* Also put the ofx transaction's memo in the * split's memo field */ diff --git a/libgnucash/engine/gncEntry.c b/libgnucash/engine/gncEntry.c index b967544638..ca1b725456 100644 --- a/libgnucash/engine/gncEntry.c +++ b/libgnucash/engine/gncEntry.c @@ -29,6 +29,7 @@ #include #include +#include #include "gnc-commodity.h" @@ -120,7 +121,7 @@ gncEntryDiscountHowToString (GncDiscountHow how) case (GNC_DISC_POSTTAX): return "POSTTAX"; default: - g_warning ("asked to translate unknown discount-how %d.\n", how); + PWARN ("asked to translate unknown discount-how %d.\n", how); break; } return NULL; @@ -145,7 +146,7 @@ gboolean gncEntryDiscountStringToHow (const char *str, GncDiscountHow *how) *how = GNC_DISC_POSTTAX; return TRUE; } - g_warning ("asked to translate unknown discount-how string %s.\n", + PWARN ("asked to translate unknown discount-how string %s.\n", str ? str : "(null)"); return FALSE; @@ -162,7 +163,7 @@ const char * gncEntryPaymentTypeToString (GncEntryPaymentType type) case (GNC_PAYMENT_CARD): return "CARD"; default: - g_warning ("asked to translate unknown payment type %d.\n", type); + PWARN ("asked to translate unknown payment type %d.\n", type); break; } return NULL ; @@ -182,7 +183,7 @@ gboolean gncEntryPaymentStringToType (const char *str, GncEntryPaymentType *type *type = GNC_PAYMENT_CARD; return TRUE; } - g_warning ("asked to translate unknown discount-how string %s.\n", + PWARN ("asked to translate unknown discount-how string %s.\n", str ? str : "(null)"); return FALSE; @@ -591,29 +592,46 @@ void gncEntrySetInvPrice (GncEntry *entry, gnc_numeric price) void gncEntrySetInvTaxable (GncEntry *entry, gboolean taxable) { if (!entry) return; - if (entry->i_taxable == taxable) return; + + ENTER ("%d", taxable); + if (entry->i_taxable == taxable) { + LEAVE ("Value already set"); + return; + } gncEntryBeginEdit (entry); entry->i_taxable = taxable; entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); + LEAVE (""); } void gncEntrySetInvTaxIncluded (GncEntry *entry, gboolean taxincluded) { if (!entry) return; - if (entry->i_taxincluded == taxincluded) return; + + ENTER ("%d", taxincluded); + if (entry->i_taxincluded == taxincluded) { + LEAVE ("Value already set"); + return; + } gncEntryBeginEdit (entry); entry->i_taxincluded = taxincluded; entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); + LEAVE (""); } void gncEntrySetInvTaxTable (GncEntry *entry, GncTaxTable *table) { if (!entry) return; - if (entry->i_tax_table == table) return; + + ENTER ("%s", gncTaxTableGetName (table)); + if (entry->i_tax_table == table) { + LEAVE ("Value already set"); + return; + } gncEntryBeginEdit (entry); if (entry->i_tax_table) gncTaxTableDecRef (entry->i_tax_table); @@ -623,6 +641,7 @@ void gncEntrySetInvTaxTable (GncEntry *entry, GncTaxTable *table) entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); + LEAVE (""); } void gncEntrySetInvDiscount (GncEntry *entry, gnc_numeric discount) @@ -715,29 +734,46 @@ void gncEntrySetBillPrice (GncEntry *entry, gnc_numeric price) void gncEntrySetBillTaxable (GncEntry *entry, gboolean taxable) { if (!entry) return; - if (entry->b_taxable == taxable) return; + + ENTER ("%d", taxable); + if (entry->b_taxable == taxable) { + LEAVE ("Value already set"); + return; + } gncEntryBeginEdit (entry); entry->b_taxable = taxable; entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); + LEAVE (""); } void gncEntrySetBillTaxIncluded (GncEntry *entry, gboolean taxincluded) { if (!entry) return; - if (entry->b_taxincluded == taxincluded) return; + + ENTER ("%d", taxincluded); + if (entry->b_taxincluded == taxincluded) { + LEAVE ("Value already set"); + return; + } gncEntryBeginEdit (entry); entry->b_taxincluded = taxincluded; entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); + LEAVE (""); } void gncEntrySetBillTaxTable (GncEntry *entry, GncTaxTable *table) { if (!entry) return; - if (entry->b_tax_table == table) return; + + ENTER ("%s", gncTaxTableGetName (table)); + if (entry->b_tax_table == table) { + LEAVE ("Value already set"); + return; + } gncEntryBeginEdit (entry); if (entry->b_tax_table) gncTaxTableDecRef (entry->b_tax_table); @@ -747,6 +783,7 @@ void gncEntrySetBillTaxTable (GncEntry *entry, GncTaxTable *table) entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); + LEAVE (""); } void gncEntrySetBillable (GncEntry *entry, gboolean billable) @@ -1106,10 +1143,12 @@ static void gncEntryComputeValueInt (gnc_numeric qty, gnc_numeric price, GList * entries = gncTaxTableGetEntries (tax_table); GList * node; + ENTER (""); /* Step 1: compute the aggregate price */ aggregate = gnc_numeric_mul (qty, price, GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE | GNC_HOW_RND_ROUND); + PINFO ("Aggregate value %" PRId64 "/%" PRId64, aggregate.num, aggregate.denom); /* Step 2: compute the pre-tax aggregate */ /* First, compute the aggregate tpercent and tvalue numbers */ @@ -1129,14 +1168,14 @@ static void gncEntryComputeValueInt (gnc_numeric qty, gnc_numeric price, GNC_HOW_DENOM_LCD); break; default: - g_warning ("Unknown tax type: %d", gncTaxTableEntryGetType (entry)); + PWARN ("Unknown tax type: %d", gncTaxTableEntryGetType (entry)); break; } } /* now we need to convert from 5% -> .05 */ tpercent = gnc_numeric_div (tpercent, percent, GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT | GNC_HOW_RND_NEVER); - + PINFO("Tax rate %" PRId64 "/%" PRId64, tpercent.num, tpercent.denom); /* Next, actually compute the pre-tax aggregate value based on the * taxincluded flag. */ @@ -1153,13 +1192,16 @@ static void gncEntryComputeValueInt (gnc_numeric qty, gnc_numeric price, gnc_numeric_create (1, 1), GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD), GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE | GNC_HOW_RND_ROUND); + PINFO ("pretax %" PRId64 "/%" PRId64, pretax.num, pretax.denom); if (!gnc_numeric_zero_p(qty)) { i_net_price = gnc_numeric_div (pretax, qty, GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE | GNC_HOW_RND_ROUND); } + PINFO("i_net_price %" PRId64 "/%" PRId64, i_net_price.num, i_net_price.denom); } else { + PINFO ("Tax not included or no tax table, pretax is aggregate"); pretax = aggregate; } @@ -1224,7 +1266,7 @@ static void gncEntryComputeValueInt (gnc_numeric qty, gnc_numeric price, break; default: - g_warning ("unknown DiscountHow value: %d", discount_how); + PWARN ("unknown DiscountHow value: %d", discount_how); break; } @@ -1247,6 +1289,7 @@ static void gncEntryComputeValueInt (gnc_numeric qty, gnc_numeric price, { GList * taxes = NULL; + PINFO("Computing tax value list"); for (node = entries; node; node = node->next) { GncTaxTableEntry *entry = node->data; @@ -1276,6 +1319,7 @@ static void gncEntryComputeValueInt (gnc_numeric qty, gnc_numeric price, if (net_price != NULL) *net_price = i_net_price; + LEAVE (""); return; } @@ -1317,12 +1361,14 @@ gncEntryRecomputeValues (GncEntry *entry) int denom; GList *tv_iter; + ENTER (""); /* See if either tax table changed since we last computed values */ if (entry->i_tax_table) { time64 modtime = gncTaxTableLastModifiedSecs (entry->i_tax_table); if (entry->i_taxtable_modtime != modtime) { + PINFO ("Invoice tax table changed"); entry->values_dirty = TRUE; entry->i_taxtable_modtime = modtime; } @@ -1332,13 +1378,16 @@ gncEntryRecomputeValues (GncEntry *entry) time64 modtime = gncTaxTableLastModifiedSecs (entry->b_tax_table); if (entry->b_taxtable_modtime != modtime) { + PINFO ("Bill tax table changed"); entry->values_dirty = TRUE; entry->b_taxtable_modtime = modtime; } } - if (!entry->values_dirty) + if (!entry->values_dirty) { + LEAVE ("No changes"); return; + } /* Clear the last-computed tax values */ if (entry->i_tax_values) @@ -1397,6 +1446,7 @@ gncEntryRecomputeValues (GncEntry *entry) denom, GNC_HOW_DENOM_EXACT | GNC_HOW_RND_ROUND_HALF_UP); } entry->values_dirty = FALSE; + LEAVE (""); } /* The "Int" functions below are for internal use only. diff --git a/libgnucash/engine/gncInvoice.c b/libgnucash/engine/gncInvoice.c index f3a5c5db12..745012bd1b 100644 --- a/libgnucash/engine/gncInvoice.c +++ b/libgnucash/engine/gncInvoice.c @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -943,6 +944,7 @@ static gnc_numeric gncInvoiceGetNetAndTaxesInternal (GncInvoice *invoice, gboole g_return_val_if_fail (invoice, net_total); + ENTER (""); /* Is the current document an invoice/credit note related to a customer or a vendor/employee ? * The GncEntry code needs to know to return the proper entry amounts */ @@ -966,7 +968,7 @@ static gnc_numeric gncInvoiceGetNetAndTaxesInternal (GncInvoice *invoice, gboole if (gnc_numeric_check (value) == GNC_ERROR_OK) net_total = gnc_numeric_add (net_total, value, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); else - g_warning ("bad value in our entry"); + PWARN ("bad value in our entry"); } if (taxes) @@ -991,6 +993,7 @@ static gnc_numeric gncInvoiceGetNetAndTaxesInternal (GncInvoice *invoice, gboole *taxes = tv_list; } + LEAVE ("%" PRId64 "/%" PRId64, net_total.num, net_total.denom); return net_total; } @@ -1004,6 +1007,7 @@ static gnc_numeric gncInvoiceGetTotalInternal (GncInvoice *invoice, gboolean use if (!invoice) return gnc_numeric_zero (); + ENTER (""); total = gncInvoiceGetNetAndTaxesInternal (invoice, use_value, use_tax? &taxes : NULL, use_payment_type, type); if (use_tax) @@ -1015,6 +1019,7 @@ static gnc_numeric gncInvoiceGetTotalInternal (GncInvoice *invoice, gboolean use GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT | GNC_HOW_RND_ROUND_HALF_UP); gncAccountValueDestroy (taxes); } + LEAVE ("%" PRId64 "/%" PRId64, total.num, total.denom); return total; } @@ -1070,6 +1075,7 @@ GList * gncInvoiceGetTypeListForOwnerType (GncOwnerType type) type_list = g_list_append (type_list, GINT_TO_POINTER(GNC_INVOICE_EMPL_CREDIT_NOTE)); return type_list; default: + PWARN("Bad owner type, no invoices."); return NULL; } @@ -1379,6 +1385,7 @@ GHashTable *gncInvoiceGetForeignCurrencies (const GncInvoice *invoice) gboolean is_cn = gncInvoiceGetIsCreditNote (invoice); GHashTable *amt_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free); + ENTER (""); for (entries_iter = invoice->entries; entries_iter != NULL; entries_iter = g_list_next(entries_iter)) { @@ -1429,6 +1436,8 @@ GHashTable *gncInvoiceGetForeignCurrencies (const GncInvoice *invoice) } gncAccountValueDestroy (tt_amts); } + + LEAVE (""); return amt_hash; } @@ -1442,6 +1451,7 @@ static gboolean gncInvoicePostAddSplit (QofBook *book, { Split *split; + ENTER (""); split = xaccMallocSplit (book); /* set action and memo? */ @@ -1484,6 +1494,8 @@ static gboolean gncInvoicePostAddSplit (QofBook *book, We can't really do anything sensible about it, and this is a user-interface free zone so we can't try asking the user again either, have to return NULL*/ + PERR("Multiple commodities with no price."); + LEAVE ("FALSE"); return FALSE; } else @@ -1496,6 +1508,7 @@ static gboolean gncInvoicePostAddSplit (QofBook *book, } } + LEAVE ("TRUE"); return TRUE; } @@ -1522,6 +1535,7 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, if (!invoice || !acc) return NULL; if (gncInvoiceIsPosted (invoice)) return NULL; + ENTER (""); gncInvoiceBeginEdit (invoice); book = qof_instance_get_book (invoice); @@ -1624,6 +1638,8 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, value = gncEntryGetBalValue (entry, TRUE, is_cust_doc); tax = gncEntryGetBalTaxValue (entry, TRUE, is_cust_doc); + DEBUG ("Tax %" PRId64 "/%" PRId64 " on entry value %" PRId64 "/%" PRId64, + tax.num, tax.denom, value.num, value.denom); /* add the value for the account split */ this_acc = (is_cust_doc ? gncEntryGetInvAccount (entry) : gncEntryGetBillAccount (entry)); @@ -1642,6 +1658,8 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, We can't really do anything sensible about it, and this is a user-interface free zone so we can't try asking the user again either, have to return NULL*/ + PERR("Failed to add split %s", gncEntryGetDescription (entry)); + LEAVE ("NULL"); return NULL; } @@ -1676,12 +1694,12 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, } else - g_warning ("bad value in our entry"); + PWARN ("bad value in our entry"); } /* check the taxes */ if (gnc_numeric_check (tax) != GNC_ERROR_OK) - g_warning ("bad tax in our entry"); + PWARN ("bad tax in our entry"); } /* for */ @@ -1691,6 +1709,8 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, gncAccountValueDestroy (taxes); /* Iterate through the splitinfo list and generate the splits */ + if (splitinfo) + PINFO ("Processing Split List"); for (iter = splitinfo; iter; iter = iter->next) { GncAccountValue *acc_val = iter->data; @@ -1704,6 +1724,7 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, We can't really do anything sensible about it, and this is a user-interface free zone so we can't try asking the user again either, have to return NULL*/ + PERR("Failed to add split %s, aborting accumulated splits.", memo); return NULL; } } @@ -1720,6 +1741,7 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, gnc_numeric to_charge_bal_amount = (is_cn ? gnc_numeric_neg (invoice->to_charge_amount) : invoice->to_charge_amount); + PINFO ("Process to_card payment split"); /* Set memo. */ xaccSplitSetMemo (split, _("Extra to Charge Card")); /* Set action based on book option */ @@ -1740,6 +1762,7 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, { Split *split = xaccMallocSplit (book); + PINFO ("Process to_card balancing split"); /* Set memo */ xaccSplitSetMemo (split, memo); /* Set action based on book option */ @@ -1778,6 +1801,7 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, if (autopay) gncInvoiceAutoApplyPayments (invoice); + LEAVE (""); return txn; } @@ -1797,6 +1821,7 @@ gncInvoiceUnpost (GncInvoice *invoice, gboolean reset_tax_tables) lot = gncInvoiceGetPostedLot (invoice); g_return_val_if_fail (lot, FALSE); + ENTER (""); /* Destroy the Posted Transaction */ xaccTransClearReadOnly (txn); xaccTransBeginEdit (txn); @@ -1822,6 +1847,8 @@ gncInvoiceUnpost (GncInvoice *invoice, gboolean reset_tax_tables) // Note: make a copy of the lot list here, when splits are deleted from the lot, // the original list may be destroyed by the lot code. lot_split_list = g_list_copy (gnc_lot_get_split_list (lot)); + if (lot_split_list) + PINFO ("Recreating link transactions for remaining lots"); for (lot_split_iter = lot_split_list; lot_split_iter; lot_split_iter = lot_split_iter->next) { Split *split = lot_split_iter->data; @@ -1912,6 +1939,8 @@ gncInvoiceUnpost (GncInvoice *invoice, gboolean reset_tax_tables) mark_invoice (invoice); gncInvoiceCommitEdit (invoice); + LEAVE ("TRUE"); + return TRUE; }