[business]Add diagnostic messages to GncEntry and GncInvoice.

This commit is contained in:
John Ralls 2022-03-05 18:17:58 -08:00
parent 916caa25f2
commit ce2b89fd8c
3 changed files with 100 additions and 18 deletions

View File

@ -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 */

View File

@ -29,6 +29,7 @@
#include <glib.h>
#include <qofinstance-p.h>
#include <inttypes.h>
#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.

View File

@ -30,6 +30,7 @@
#include <config.h>
#include <stdint.h>
#include <inttypes.h>
#include <glib.h>
#include <glib/gi18n.h>
#include <qofinstance-p.h>
@ -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;
}