GnuCash  5.6-150-g038405b370+
Files | Macros | Typedefs | Enumerations | Functions

An invoice holds a list of entries, a pointer to the customer, and the job, the dates entered and posted, as well as the account, transaction and lot for the posted invoice. More...

Files

file  gncInvoice.h
 Business Invoice Interface.
 

Macros

#define GNC_ID_INVOICE   "gncInvoice"
 
#define GNC_TYPE_INVOICE   (gnc_invoice_get_type ())
 
#define GNC_INVOICE(o)   (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_INVOICE, GncInvoice))
 
#define GNC_INVOICE_CLASS(k)   (G_TYPE_CHECK_CLASS_CAST((k), GNC_TYPE_INVOICE, GncInvoiceClass))
 
#define GNC_IS_INVOICE(o)   (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_INVOICE))
 
#define GNC_IS_INVOICE_CLASS(k)   (G_TYPE_CHECK_CLASS_TYPE ((k), GNC_TYPE_INVOICE))
 
#define GNC_INVOICE_GET_CLASS(o)   (G_TYPE_INSTANCE_GET_CLASS ((o), GNC_TYPE_INVOICE, GncInvoiceClass))
 
#define INVOICE_ID   "id"
 
#define INVOICE_OWNER   "owner"
 
#define INVOICE_OPENED   "date_opened"
 
#define INVOICE_POSTED   "date_posted"
 
#define INVOICE_DUE   "date_due"
 
#define INVOICE_IS_POSTED   "is_posted?"
 
#define INVOICE_IS_PAID   "is_paid?"
 
#define INVOICE_TERMS   "terms"
 
#define INVOICE_BILLINGID   "billing_id"
 
#define INVOICE_NOTES   "notes"
 
#define INVOICE_DOCLINK   "doclink"
 
#define INVOICE_ACC   "account"
 
#define INVOICE_POST_TXN   "posted_txn"
 
#define INVOICE_POST_LOT   "posted_lot"
 
#define INVOICE_IS_CN   "credit_note"
 
#define INVOICE_TYPE   "type"
 
#define INVOICE_TYPE_STRING   "type_string"
 
#define INVOICE_BILLTO   "bill-to"
 
#define INVOICE_JOB   "invoice_job"
 
#define INVOICE_FROM_LOT   "invoice-from-lot"
 
#define INVOICE_FROM_TXN   "invoice-from-txn"
 
#define gncInvoiceGetGUID(x)   qof_instance_get_guid (QOF_INSTANCE(x))
 deprecated functions
 
#define gncInvoiceRetGUID(x)   (x ? *(qof_instance_get_guid (QOF_INSTANCE(x))) : *(guid_null()))
 

Typedefs

typedef GList GncInvoiceList
 
typedef GList EntryList
 

Enumerations

enum  GncInvoiceType {
  GNC_INVOICE_UNDEFINED, GNC_INVOICE_CUST_INVOICE, GNC_INVOICE_VEND_INVOICE, GNC_INVOICE_EMPL_INVOICE,
  GNC_INVOICE_CUST_CREDIT_NOTE, GNC_INVOICE_VEND_CREDIT_NOTE, GNC_INVOICE_EMPL_CREDIT_NOTE, GNC_INVOICE_NUM_TYPES
}
 

Functions

GType gnc_invoice_get_type (void)
 
void gncInvoiceAddEntry (GncInvoice *invoice, GncEntry *entry)
 
void gncInvoiceRemoveEntry (GncInvoice *invoice, GncEntry *entry)
 
void gncInvoiceAddPrice (GncInvoice *invoice, GNCPrice *price)
 
void gncBillAddEntry (GncInvoice *bill, GncEntry *entry)
 Call this function when adding an entry to a bill instead of an invoice.
 
void gncBillRemoveEntry (GncInvoice *bill, GncEntry *entry)
 
void gncInvoiceSortEntries (GncInvoice *invoice)
 Call this function when an Entry is changed and you want to re-sort the list of entries.
 
void gncInvoiceRemoveEntries (GncInvoice *invoice)
 Remove all entries from an invoice. More...
 
gnc_numeric gncInvoiceGetTotal (GncInvoice *invoice)
 Return the "total" amount of the invoice as seen on the document (and shown to the user in the reports and invoice ledger). More...
 
gnc_numeric gncInvoiceGetTotalOf (GncInvoice *invoice, GncEntryPaymentType type)
 
gnc_numeric gncInvoiceGetTotalSubtotal (GncInvoice *invoice)
 
gnc_numeric gncInvoiceGetTotalTax (GncInvoice *invoice)
 
AccountValueList * gncInvoiceGetTotalTaxList (GncInvoice *invoice)
 Return a list of tax totals accumulated per tax account.
 
EntryList * gncInvoiceGetEntries (GncInvoice *invoice)
 
GNCPrice * gncInvoiceGetPrice (GncInvoice *invoice, gnc_commodity *commodity)
 
gboolean gncInvoiceAmountPositive (const GncInvoice *invoice)
 Depending on the invoice type, invoices have a different effect on the balance. More...
 
GHashTable * gncInvoiceGetForeignCurrencies (const GncInvoice *invoice)
 Return an overview of amounts on this invoice that will be posted to accounts in currencies that are different from the invoice currency. More...
 
Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc, time64 posted_date, time64 due_date, const char *memo, gboolean accumulatesplits, gboolean autopay)
 Post this invoice to an account. More...
 
gboolean gncInvoiceUnpost (GncInvoice *invoice, gboolean reset_tax_tables)
 Unpost this invoice. More...
 
void gncInvoiceAutoApplyPayments (GncInvoice *invoice)
 Attempt to pay the invoice using open payment lots and lots for documents of the opposite sign (credit notes versus invoices).
 
void gncInvoiceApplyPayment (const GncInvoice *invoice, Transaction *txn, Account *xfer_acc, gnc_numeric amount, gnc_numeric exch, time64 date, const char *memo, const char *num)
 A convenience function to apply a payment to an invoice. More...
 
GncInvoice * gncInvoiceGetInvoiceFromTxn (const Transaction *txn)
 Given a transaction, find and return the Invoice.
 
GncInvoice * gncInvoiceGetInvoiceFromLot (GNCLot *lot)
 Given a LOT, find and return the Invoice attached to the lot.
 
void gncInvoiceBeginEdit (GncInvoice *invoice)
 
void gncInvoiceCommitEdit (GncInvoice *invoice)
 
int gncInvoiceCompare (const GncInvoice *a, const GncInvoice *b)
 
gboolean gncInvoiceIsPosted (const GncInvoice *invoice)
 
gboolean gncInvoiceIsPaid (const GncInvoice *invoice)
 
QofBookgncInvoiceGetBook (GncInvoice *x)
 
gboolean gncInvoiceEqual (const GncInvoice *a, const GncInvoice *b)
 Test support function used by test-dbi-business-stuff.c.
 

Create/Destroy Functions

GncInvoice * gncInvoiceCreate (QofBook *book)
 
void gncInvoiceDestroy (GncInvoice *invoice)
 
GncInvoice * gncInvoiceCopy (const GncInvoice *other_invoice)
 Create a new GncInvoice object as a deep copy of the given other invoice. More...
 

Set Functions

void gncInvoiceSetID (GncInvoice *invoice, const char *id)
 
void gncInvoiceSetOwner (GncInvoice *invoice, GncOwner *owner)
 
void gncInvoiceSetDateOpenedGDate (GncInvoice *invoice, const GDate *date)
 Set the DateOpened using a GDate argument. More...
 
void gncInvoiceSetDateOpened (GncInvoice *invoice, time64 date)
 
void gncInvoiceSetDatePosted (GncInvoice *invoice, time64 date)
 
void gncInvoiceSetTerms (GncInvoice *invoice, GncBillTerm *terms)
 
void gncInvoiceSetBillingID (GncInvoice *invoice, const char *billing_id)
 
void gncInvoiceSetNotes (GncInvoice *invoice, const char *notes)
 
void gncInvoiceSetDocLink (GncInvoice *invoice, const char *doclink)
 
void gncInvoiceSetCurrency (GncInvoice *invoice, gnc_commodity *currency)
 
void gncInvoiceSetActive (GncInvoice *invoice, gboolean active)
 
void gncInvoiceSetIsCreditNote (GncInvoice *invoice, gboolean credit_note)
 
void gncInvoiceSetBillTo (GncInvoice *invoice, GncOwner *billto)
 
void gncInvoiceSetToChargeAmount (GncInvoice *invoice, gnc_numeric amount)
 

Get Functions

const char * gncInvoiceGetID (const GncInvoice *invoice)
 
const GncOwnergncInvoiceGetOwner (const GncInvoice *invoice)
 
time64 gncInvoiceGetDateOpened (const GncInvoice *invoice)
 
time64 gncInvoiceGetDatePosted (const GncInvoice *invoice)
 
time64 gncInvoiceGetDateDue (const GncInvoice *invoice)
 
GncBillTerm * gncInvoiceGetTerms (const GncInvoice *invoice)
 
const char * gncInvoiceGetBillingID (const GncInvoice *invoice)
 
const char * gncInvoiceGetNotes (const GncInvoice *invoice)
 
const char * gncInvoiceGetDocLink (const GncInvoice *invoice)
 
GncOwnerType gncInvoiceGetOwnerType (const GncInvoice *invoice)
 
GList * gncInvoiceGetTypeListForOwnerType (const GncOwnerType type)
 
GncInvoiceType gncInvoiceGetType (const GncInvoice *invoice)
 
const char * gncInvoiceGetTypeString (const GncInvoice *invoice)
 
gnc_commodity * gncInvoiceGetCurrency (const GncInvoice *invoice)
 
GncOwnergncInvoiceGetBillTo (GncInvoice *invoice)
 
gnc_numeric gncInvoiceGetToChargeAmount (const GncInvoice *invoice)
 
gboolean gncInvoiceGetActive (const GncInvoice *invoice)
 
gboolean gncInvoiceGetIsCreditNote (const GncInvoice *invoice)
 
GNCLot * gncInvoiceGetPostedLot (const GncInvoice *invoice)
 
Transaction * gncInvoiceGetPostedTxn (const GncInvoice *invoice)
 
AccountgncInvoiceGetPostedAcc (const GncInvoice *invoice)
 

Detailed Description

An invoice holds a list of entries, a pointer to the customer, and the job, the dates entered and posted, as well as the account, transaction and lot for the posted invoice.

Function Documentation

◆ gncInvoiceAmountPositive()

gboolean gncInvoiceAmountPositive ( const GncInvoice *  invoice)

Depending on the invoice type, invoices have a different effect on the balance.

Customer invoices increase the balance, while vendor bills decrease the balance. Credit notes have the opposite effect.

Returns TRUE if the invoice will increase the balance or FALSE otherwise.

Definition at line 1287 of file gncInvoice.c.

1288 {
1289  switch (gncInvoiceGetType (invoice))
1290  {
1291  case GNC_INVOICE_CUST_INVOICE:
1292  case GNC_INVOICE_VEND_CREDIT_NOTE:
1293  case GNC_INVOICE_EMPL_CREDIT_NOTE:
1294  return TRUE;
1295  case GNC_INVOICE_CUST_CREDIT_NOTE:
1296  case GNC_INVOICE_VEND_INVOICE:
1297  case GNC_INVOICE_EMPL_INVOICE:
1298  return FALSE;
1299  case GNC_INVOICE_UNDEFINED:
1300  default:
1301  /* Should never be reached.
1302  * If it is, perhaps a new value is added to GncInvoiceType ? */
1303  g_assert_not_reached ();
1304  return FALSE;
1305  }
1306 }

◆ gncInvoiceApplyPayment()

void gncInvoiceApplyPayment ( const GncInvoice *  invoice,
Transaction *  txn,
Account xfer_acc,
gnc_numeric  amount,
gnc_numeric  exch,
time64  date,
const char *  memo,
const char *  num 
)

A convenience function to apply a payment to an invoice.

It creates a lot for a payment optionally based on an existing transaction and then tries to balance it with the given invoice. Contrary to gncOwnerApplyPayment, no other open documents or payments for the owner will be considered to balance the payment.

This code is actually a convenience wrapper around gncOwnerCreatePaymentLotSecs and gncOwnerAutoApplyPaymentsWithLots. See their descriptions for more details on what happens exactly.

Definition at line 1951 of file gncInvoice.c.

1955 {
1956  GNCLot *payment_lot;
1957  GList *selected_lots = NULL;
1958  const GncOwner *owner;
1959 
1960  /* Verify our arguments */
1961  if (!invoice || !gncInvoiceIsPosted (invoice) || !xfer_acc) return;
1962 
1963  owner = gncOwnerGetEndOwner (gncInvoiceGetOwner (invoice));
1964  g_return_if_fail (owner->owner.undefined);
1965 
1966  /* Create a lot for this payment */
1967  payment_lot = gncOwnerCreatePaymentLotSecs (owner, &txn,
1968  invoice->posted_acc,
1969  xfer_acc, amount, exch,
1970  date, memo, num);
1971 
1972  /* Select the invoice as only payment candidate */
1973  selected_lots = g_list_prepend (selected_lots, invoice->posted_lot);
1974 
1975  /* And link the invoice lot and the payment lot together as well as possible. */
1976  if (payment_lot)
1977  selected_lots = g_list_prepend (selected_lots, payment_lot);
1978  gncOwnerAutoApplyPaymentsWithLots (owner, selected_lots);
1979 }
void gncOwnerAutoApplyPaymentsWithLots(const GncOwner *owner, GList *lots)
Given a list of lots, try to balance as many of them as possible by creating balancing transactions b...
Definition: gncOwner.c:1256
GNCLot * gncOwnerCreatePaymentLotSecs(const GncOwner *owner, Transaction **preset_txn, Account *posted_acc, Account *xfer_acc, gnc_numeric amount, gnc_numeric exch, time64 date, const char *memo, const char *num)
Create a lot for a payment to the owner using the other parameters passed in.
Definition: gncOwner.c:750
const GncOwner * gncOwnerGetEndOwner(const GncOwner *owner)
Get the "parent" Owner or GncGUID thereof.
Definition: gncOwner.c:572

◆ gncInvoiceCopy()

GncInvoice* gncInvoiceCopy ( const GncInvoice *  other_invoice)

Create a new GncInvoice object as a deep copy of the given other invoice.

The returned new invoice has everything copied from the other invoice, including the ID string field. All GncEntries are newly allocated copies of the original invoice's entries.

Definition at line 336 of file gncInvoice.c.

337 {
338  GncInvoice *invoice;
339  QofBook* book;
340  GList *node;
341  GValue v = G_VALUE_INIT;
342 
343  g_assert (from);
344  book = qof_instance_get_book (from);
345  g_assert (book);
346 
347  invoice = g_object_new (GNC_TYPE_INVOICE, NULL);
348  qof_instance_init_data (&invoice->inst, _GNC_MOD_NAME, book);
349 
350  gncInvoiceBeginEdit (invoice);
351 
352  invoice->id = CACHE_INSERT (from->id);
353  invoice->notes = CACHE_INSERT (from->notes);
354  invoice->billing_id = CACHE_INSERT (from->billing_id);
355  invoice->active = from->active;
356 
357  qof_instance_get_kvp (QOF_INSTANCE (from), &v, 1, GNC_INVOICE_IS_CN);
358  if (G_VALUE_HOLDS_INT64 (&v))
359  qof_instance_set_kvp (QOF_INSTANCE (invoice), &v, 1, GNC_INVOICE_IS_CN);
360  g_value_unset (&v);
361 
362  invoice->terms = from->terms;
363  gncBillTermIncRef (invoice->terms);
364 
365  gncOwnerCopy (&from->billto, &invoice->billto);
366  gncOwnerCopy (&from->owner, &invoice->owner);
367  invoice->job = from->job; // FIXME: Need IncRef or similar here?!?
368 
369  invoice->to_charge_amount = from->to_charge_amount;
370  invoice->date_opened = from->date_opened;
371 
372  // Oops. Do not forget to copy the pointer to the correct currency here.
373  invoice->currency = from->currency;
374 
375  gncInvoiceSetDocLink (invoice, gncInvoiceGetDocLink (from));
376 
377  // Copy all invoice->entries
378  for (node = from->entries; node; node = node->next)
379  {
380  GncEntry *from_entry = node->data;
381  GncEntry *to_entry = gncEntryCreate (book);
382  gncEntryCopy (from_entry, to_entry, FALSE);
383 
384  switch (gncInvoiceGetOwnerType (invoice))
385  {
386  case GNC_OWNER_VENDOR:
387  case GNC_OWNER_EMPLOYEE:
388  // this is a vendor bill, or an expense voucher
389  gncBillAddEntry (invoice, to_entry);
390  break;
391  case GNC_OWNER_CUSTOMER:
392  default:
393  // this is an invoice
394  gncInvoiceAddEntry (invoice, to_entry);
395  break;
396  }
397  }
398 
399  // FIXME: The prices are not (yet) copied; is this a problem?
400 
401  // Posted-date and the posted Txn is intentionally not copied; the
402  // copy isn't "posted" but needs to be posted by the user.
403  mark_invoice (invoice);
404  gncInvoiceCommitEdit (invoice);
405 
406  return invoice;
407 }
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
void qof_instance_init_data(QofInstance *inst, QofIdType type, QofBook *book)
Initialise the settings associated with an instance.
void gncBillAddEntry(GncInvoice *bill, GncEntry *entry)
Call this function when adding an entry to a bill instead of an invoice.
Definition: gncInvoice.c:719
QofBook reference.
Definition: qofbook-p.hpp:46

◆ gncInvoiceGetForeignCurrencies()

GHashTable* gncInvoiceGetForeignCurrencies ( const GncInvoice *  invoice)

Return an overview of amounts on this invoice that will be posted to accounts in currencies that are different from the invoice currency.

These accounts can be the accounts referred to in invoice entries or tax tables. This information is returned in the from of a hash table. The keys in the hash table are the foreign currencies, the values are the accumulated amounts in that currency. Drop the reference to the hash table with g_hash_table_unref when no longer needed.

Definition at line 1308 of file gncInvoice.c.

1309 {
1310  EntryList *entries_iter;
1311  gboolean is_cust_doc = (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_CUSTOMER);
1312  gboolean is_cn = gncInvoiceGetIsCreditNote (invoice);
1313  GHashTable *amt_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal,
1314  NULL, g_free);
1315  ENTER ("");
1316 
1317  for (entries_iter = invoice->entries; entries_iter != NULL; entries_iter = g_list_next(entries_iter))
1318  {
1319  GncEntry *entry = (GncEntry*)entries_iter->data;
1320  Account *this_acc;
1321  gnc_commodity *account_currency;
1322  AccountValueList *tt_amts = NULL, *tt_iter;
1323 
1324  /* Check entry's account currency */
1325  this_acc = (is_cust_doc ? gncEntryGetInvAccount (entry) :
1326  gncEntryGetBillAccount (entry));
1327  account_currency = xaccAccountGetCommodity (this_acc);
1328 
1329  if (this_acc &&
1330  !gnc_commodity_equal (gncInvoiceGetCurrency (invoice), account_currency))
1331  {
1332  gnc_numeric *curr_amt = (gnc_numeric*) g_hash_table_lookup (amt_hash, account_currency);
1333  gnc_numeric *entry_amt = (gnc_numeric*) g_new0 (gnc_numeric, 1);
1334  *entry_amt = gncEntryGetDocValue (entry, FALSE, is_cust_doc, is_cn);
1335  if (curr_amt)
1336  *entry_amt = gnc_numeric_add (*entry_amt, *curr_amt, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND_HALF_UP);
1337  g_hash_table_insert (amt_hash, account_currency, entry_amt);
1338  }
1339 
1340  /* Check currencies of each account in the tax table linked
1341  * to the current entry */
1342  tt_amts = gncEntryGetDocTaxValues (entry, is_cust_doc, is_cn);
1343 
1344  if (!tt_amts)
1345  continue;
1346 
1347  for (tt_iter = tt_amts; tt_iter != NULL; tt_iter = g_list_next(tt_iter))
1348  {
1349  GncAccountValue *tt_amt_val = (GncAccountValue*)tt_iter->data;
1350  Account *tt_acc = tt_amt_val->account;
1351  gnc_commodity *tt_acc_currency = xaccAccountGetCommodity (tt_acc);
1352 
1353  if (tt_acc &&
1354  !gnc_commodity_equal (gncInvoiceGetCurrency (invoice), tt_acc_currency))
1355  {
1356  gnc_numeric *curr_amt = (gnc_numeric*) g_hash_table_lookup (amt_hash, tt_acc_currency);
1357  gnc_numeric *tt_acc_amt = (gnc_numeric*) g_new0 (gnc_numeric, 1);
1358  *tt_acc_amt = tt_amt_val->value;
1359  if (curr_amt)
1360  *tt_acc_amt = gnc_numeric_add (*tt_acc_amt, *curr_amt, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND_HALF_UP);
1361  g_hash_table_insert (amt_hash, tt_acc_currency, tt_acc_amt);
1362  }
1363  }
1364  gncAccountValueDestroy (tt_amts);
1365  }
1366 
1367  LEAVE ("");
1368  return amt_hash;
1369 }
STRUCTS.
AccountValueList * gncEntryGetDocTaxValues(GncEntry *entry, gboolean is_cust_doc, gboolean is_cn)
Careful: the returned list is NOT owned by the entry and should be freed by the caller.
Definition: gncEntry.c:1548
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
void gncAccountValueDestroy(GList *list)
Destroy a list of accountvalues.
Definition: gncTaxTable.c:997
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
Definition: Account.cpp:3389
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
Definition: gnc-numeric.h:165
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
Definition: gnc-numeric.h:245

◆ gncInvoiceGetTotal()

gnc_numeric gncInvoiceGetTotal ( GncInvoice *  invoice)

Return the "total" amount of the invoice as seen on the document (and shown to the user in the reports and invoice ledger).

Definition at line 1008 of file gncInvoice.c.

1009 {
1010  if (!invoice) return gnc_numeric_zero ();
1011  return gncInvoiceGetTotalInternal (invoice, TRUE, TRUE, FALSE, 0);
1012 }

◆ gncInvoicePostToAccount()

Transaction* gncInvoicePostToAccount ( GncInvoice *  invoice,
Account acc,
time64  posted_date,
time64  due_date,
const char *  memo,
gboolean  accumulatesplits,
gboolean  autopay 
)

Post this invoice to an account.

Returns the new Transaction that is tied to this invoice. The transaction is set with the supplied posted date, due date, and memo. The Transaction description is set to the name of the company.

If accumulate splits is TRUE, entries in the same account will be merged into one single split in that account. Otherwise each entry will be posted as a separate split, possibly resulting in multiple splits in one account.

If autopay is TRUE, the code will try to find pre-payments, invoices or credit notes that can reduce the amount due for this invoice, marking the invoice as fully or partially paid, depending on the amounts on all documents involved. If autopay is FALSE, it's the user's responsibility to explicitly pay the invoice.

Definition at line 1442 of file gncInvoice.c.

1446 {
1447  Transaction *txn;
1448  QofBook *book;
1449  GNCLot *lot = NULL;
1450  GList *iter;
1451  GList *splitinfo = NULL;
1452  gnc_numeric total;
1453  gboolean is_cust_doc;
1454  gboolean is_cn;
1455  const char *name, *type;
1456  char *lot_title;
1457  Account *ccard_acct = NULL;
1458  const GncOwner *owner;
1459  int denom = xaccAccountGetCommoditySCU (acc);
1460  AccountValueList *taxes;
1461 
1462  if (!invoice || !acc) return NULL;
1463  if (gncInvoiceIsPosted (invoice)) return NULL;
1464 
1465  ENTER ("");
1466  gncInvoiceBeginEdit (invoice);
1467  book = qof_instance_get_book (invoice);
1468 
1469  /* Stabilize the Billing Terms of this invoice */
1470  if (invoice->terms)
1471  gncInvoiceSetTerms (invoice,
1472  gncBillTermReturnChild (invoice->terms, TRUE));
1473 
1474  /* GncEntry functions need to know if the invoice/credit note is for a customer or a vendor/employee. */
1475  is_cust_doc = (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_CUSTOMER);
1476  is_cn = gncInvoiceGetIsCreditNote (invoice);
1477 
1478  /* Figure out if we need to separate out "credit-card" items */
1479  owner = gncOwnerGetEndOwner (gncInvoiceGetOwner (invoice));
1480  if (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_EMPLOYEE)
1481  ccard_acct = gncEmployeeGetCCard (gncOwnerGetEmployee (owner));
1482 
1483  /* Create a new lot for this invoice */
1484  lot = gnc_lot_new (book);
1485  gncInvoiceAttachToLot (invoice, lot);
1486  gnc_lot_begin_edit (lot);
1487 
1488  type = gncInvoiceGetTypeString (invoice);
1489 
1490  /* Set the lot title */
1491  lot_title = g_strdup_printf ("%s %s", type, gncInvoiceGetID (invoice));
1492  gnc_lot_set_title (lot, lot_title);
1493  g_free (lot_title);
1494 
1495  /* Create a new transaction */
1496  txn = xaccMallocTransaction (book);
1497  xaccTransBeginEdit (txn);
1498 
1499  name = gncOwnerGetName (gncOwnerGetEndOwner (gncInvoiceGetOwner (invoice)));
1500 
1501  /* Set Transaction Description (Owner Name) , Num (invoice ID or type, based
1502  * on book option), Currency */
1503  xaccTransSetDescription (txn, name ? name : "");
1504  gnc_set_num_action (txn, NULL, gncInvoiceGetID (invoice), type);
1505  xaccTransSetCurrency (txn, invoice->currency);
1506 
1507  /* Entered and Posted at date */
1508  xaccTransSetDateEnteredSecs (txn, gnc_time (NULL));
1509  xaccTransSetDatePostedSecsNormalized (txn, post_date);
1510  gncInvoiceSetDatePosted (invoice, xaccTransRetDatePosted(txn));
1511 
1512  xaccTransSetDateDue (txn, due_date);
1513 
1514  /* Get invoice total and taxes. */
1515  total = gncInvoiceGetTotal (invoice);
1516  taxes = gncInvoiceGetTotalTaxList (invoice);
1517  /* The two functions above return signs relative to the document
1518  * We need to convert them to balance values before we can use them here
1519  * Note the odd construct comparing two booleans is to xor them
1520  * that is, only evaluate true if both are different.
1521  */
1522  if (is_cust_doc != is_cn)
1523  {
1524  GList *node;
1525  total = gnc_numeric_neg (total);
1526  for (node = taxes; node; node = node->next)
1527  {
1528  GncAccountValue *acc_val = node->data;
1529  acc_val->value = gnc_numeric_neg (acc_val->value);
1530  }
1531  }
1532 
1533  /* Iterate through the entries; sum up everything for each account.
1534  * then create the appropriate splits in this txn.
1535  */
1536 
1537  for (iter = gncInvoiceGetEntries (invoice); iter; iter = iter->next)
1538  {
1539  gnc_numeric value, tax;
1540  GncEntry * entry = iter->data;
1541  Account *this_acc;
1542 
1543  /* Stabilize the TaxTable in this entry */
1544  gncEntryBeginEdit (entry);
1545  if (is_cust_doc)
1546  gncEntrySetInvTaxTable
1547  (entry, gncTaxTableReturnChild (gncEntryGetInvTaxTable (entry), TRUE));
1548  else
1549  {
1550  gncEntrySetBillTaxTable
1551  (entry, gncTaxTableReturnChild (gncEntryGetBillTaxTable (entry), TRUE));
1552 
1553  /* If this is a bill, and the entry came from an invoice originally, copy the price */
1554  if (gncEntryGetBillable (entry))
1555  {
1556  /* We need to set the net price since it may be another tax rate for invoices than bills */
1557  gncEntrySetInvPrice (entry, gncEntryGetPrice (entry, FALSE, TRUE));
1558  gncEntrySetInvTaxIncluded (entry, FALSE);
1559  }
1560  }
1561  gncEntryCommitEdit (entry);
1562 
1563  /* Obtain the Entry's Value and TaxValues
1564  Note we use rounded values here and below to prevent creating an imbalanced transaction */
1565  value = gncEntryGetBalValue (entry, TRUE, is_cust_doc);
1566  tax = gncEntryGetBalTaxValue (entry, TRUE, is_cust_doc);
1567 
1568  DEBUG ("Tax %" PRId64 "/%" PRId64 " on entry value %" PRId64 "/%" PRId64,
1569  tax.num, tax.denom, value.num, value.denom);
1570  /* add the value for the account split */
1571  this_acc = (is_cust_doc ? gncEntryGetInvAccount (entry) :
1572  gncEntryGetBillAccount (entry));
1573  if (this_acc)
1574  {
1575  if (gnc_numeric_check (value) == GNC_ERROR_OK)
1576  {
1577  if (accumulatesplits)
1578  splitinfo = gncAccountValueAdd (splitinfo, this_acc, value);
1579  /* Adding to total in case of accumulatesplits will be deferred to later when each split is effectively added */
1580  else if (!gncInvoicePostAddSplit (book, this_acc, txn, value,
1581  gncEntryGetDescription (entry),
1582  type, invoice))
1583  {
1584  /*This is an error, which shouldn't even be able to happen.
1585  We can't really do anything sensible about it, and this is
1586  a user-interface free zone so we can't try asking the user
1587  again either, have to return NULL*/
1588  PERR("Failed to add split %s", gncEntryGetDescription (entry));
1589  LEAVE ("NULL");
1590  return NULL;
1591  }
1592 
1593  /* If there is a credit-card account, and this is a CCard
1594  * payment type, subtract it from the total, and instead
1595  * create a split to the CC Acct with a memo of the entry
1596  * description instead of the provided memo. Note that the
1597  * value reversal is the same as the post account.
1598  *
1599  * Note: we don't have to worry about the tax values --
1600  * expense vouchers don't have them.
1601  */
1602  if (ccard_acct && gncEntryGetBillPayment (entry) == GNC_PAYMENT_CARD)
1603  {
1604  Split *split;
1605 
1606  total = gnc_numeric_sub (total, value, denom,
1608 
1609  split = xaccMallocSplit (book);
1610  xaccSplitSetMemo (split, gncEntryGetDescription (entry));
1611  /* set action based on book option */
1612  gnc_set_num_action (NULL, split, gncInvoiceGetID (invoice), type);
1613  xaccAccountBeginEdit (ccard_acct);
1614  xaccAccountInsertSplit (ccard_acct, split);
1615  xaccAccountCommitEdit (ccard_acct);
1616  xaccTransAppendSplit (txn, split);
1617  xaccSplitSetBaseValue (split, gnc_numeric_neg (value),
1618  invoice->currency);
1619 
1620  }
1621 
1622  }
1623  else
1624  PWARN ("bad value in our entry");
1625  }
1626 
1627  /* check the taxes */
1628  if (gnc_numeric_check (tax) != GNC_ERROR_OK)
1629  PWARN ("bad tax in our entry");
1630 
1631  } /* for */
1632 
1633 
1634  /* now merge in the TaxValues */
1635  splitinfo = gncAccountValueAddList (splitinfo, taxes);
1636  gncAccountValueDestroy (taxes);
1637 
1638  /* Iterate through the splitinfo list and generate the splits */
1639  if (splitinfo)
1640  PINFO ("Processing Split List");
1641  for (iter = splitinfo; iter; iter = iter->next)
1642  {
1643  GncAccountValue *acc_val = iter->data;
1644 
1645  //gnc_numeric amt_rounded = gnc_numeric_convert(acc_val->value,
1646  // denom, GNC_HOW_DENOM_EXACT | GNC_HOW_RND_ROUND_HALF_UP);
1647  if (!gncInvoicePostAddSplit (book, acc_val->account, txn, acc_val->value,
1648  memo, type, invoice))
1649  {
1650  /*This is an error, which shouldn't even be able to happen.
1651  We can't really do anything sensible about it, and this is
1652  a user-interface free zone so we can't try asking the user
1653  again either, have to return NULL*/
1654  PERR("Failed to add split %s, aborting accumulated splits.", memo);
1655  return NULL;
1656  }
1657  }
1658 
1659  /* If there is a ccard account, we may have an additional "to_card" payment.
1660  * we should make that now.
1661  */
1662  if (ccard_acct && !gnc_numeric_zero_p (invoice->to_charge_amount))
1663  {
1664  Split *split = xaccMallocSplit (book);
1665 
1666  /* To charge amount is stored in document value. We need balance value here
1667  * so convert if necessary. */
1668  gnc_numeric to_charge_bal_amount = (is_cn ? gnc_numeric_neg (invoice->to_charge_amount)
1669  : invoice->to_charge_amount);
1670 
1671  PINFO ("Process to_card payment split");
1672  /* Set memo. */
1673  xaccSplitSetMemo (split, _("Extra to Charge Card"));
1674  /* Set action based on book option */
1675  gnc_set_num_action (NULL, split, gncInvoiceGetID (invoice), type);
1676 
1677  xaccAccountBeginEdit (ccard_acct);
1678  xaccAccountInsertSplit (ccard_acct, split);
1679  xaccAccountCommitEdit (ccard_acct);
1680  xaccTransAppendSplit (txn, split);
1681  xaccSplitSetBaseValue (split, gnc_numeric_neg (to_charge_bal_amount),
1682  invoice->currency);
1683 
1684  total = gnc_numeric_sub (total, to_charge_bal_amount, denom,
1686  }
1687 
1688  /* Now create the Posted split (which is the opposite sign of the above splits) */
1689  {
1690  Split *split = xaccMallocSplit (book);
1691 
1692  PINFO ("Process to_card balancing split");
1693  /* Set memo */
1694  xaccSplitSetMemo (split, memo);
1695  /* Set action based on book option */
1696  gnc_set_num_action (NULL, split, gncInvoiceGetID (invoice), type);
1697 
1698  xaccAccountBeginEdit (acc);
1699  xaccAccountInsertSplit (acc, split);
1700  xaccAccountCommitEdit (acc);
1701  xaccTransAppendSplit (txn, split);
1702  xaccSplitSetBaseValue (split, gnc_numeric_neg (total),
1703  invoice->currency);
1704 
1705  /* add this split to the lot */
1706  gnc_lot_add_split (lot, split);
1707  }
1708 
1709  /* Now attach this invoice to the txn and account */
1710  gncInvoiceAttachToTxn (invoice, txn);
1711  gncInvoiceSetPostedAcc (invoice, acc);
1712 
1713  xaccTransSetReadOnly (txn, _("Generated from an invoice. Try unposting the invoice."));
1714  xaccTransCommitEdit (txn);
1715 
1716  gncAccountValueDestroy (splitinfo);
1717 
1718  gnc_lot_commit_edit (lot);
1719  /* Not strictly necessary, since it was done by the Set calls
1720  * above, but good insurance. */
1721  DEBUG("Committing Invoice %s", invoice->id);
1722  mark_invoice (invoice);
1723  gncInvoiceCommitEdit (invoice);
1724 
1725  /* If requested, attempt to automatically apply open payments
1726  * and reverse documents to this lot to close it (or at least
1727  * reduce its balance) */
1728  if (autopay)
1729  gncInvoiceAutoApplyPayments (invoice);
1730 
1731  LEAVE ("");
1732  return txn;
1733 }
#define xaccTransAppendSplit(t, s)
Add a split to the transaction.
Definition: Transaction.h:380
Transaction * xaccMallocTransaction(QofBook *book)
The xaccMallocTransaction() will malloc memory and initialize it.
void xaccSplitSetBaseValue(Split *s, gnc_numeric value, const gnc_commodity *base_currency)
Depending on the base_currency, set either the value or the amount of this split or both: If the base...
Definition: Split.cpp:1320
void xaccTransSetDatePostedSecsNormalized(Transaction *trans, time64 time)
This function sets the posted date of the transaction, specified by a time64 (see ctime(3))...
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
int xaccAccountGetCommoditySCU(const Account *acc)
Return the SCU for the account.
Definition: Account.cpp:2726
gnc_numeric gnc_numeric_neg(gnc_numeric a)
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value...
STRUCTS.
#define DEBUG(format, args...)
Print a debugging message.
Definition: qoflog.h:264
void gnc_lot_add_split(GNCLot *lot, Split *split)
Adds a split to this lot.
Definition: gnc-lot.cpp:579
void xaccTransSetDescription(Transaction *trans, const char *desc)
Sets the transaction Description.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
Use any denominator which gives an exactly correct ratio of numerator to denominator.
Definition: gnc-numeric.h:188
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
gnc_numeric gncInvoiceGetTotal(GncInvoice *invoice)
Return the "total" amount of the invoice as seen on the document (and shown to the user in the report...
Definition: gncInvoice.c:1008
void gncInvoiceAutoApplyPayments(GncInvoice *invoice)
Attempt to pay the invoice using open payment lots and lots for documents of the opposite sign (credi...
Definition: gncInvoice.c:1907
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Set a new currency on a transaction.
#define PWARN(format, args...)
Log a warning.
Definition: qoflog.h:250
void xaccTransSetReadOnly(Transaction *trans, const char *reason)
Set the transaction to be ReadOnly by setting a non-NULL value as "reason".
void xaccSplitSetMemo(Split *split, const char *memo)
The memo is an arbitrary string associated with a split.
time64 xaccTransRetDatePosted(const Transaction *trans)
Retrieve the posted date of the transaction.
void xaccTransSetDateDue(Transaction *trans, time64 time)
Dates and txn-type for A/R and A/P "invoice" postings.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void gncAccountValueDestroy(GList *list)
Destroy a list of accountvalues.
Definition: gncTaxTable.c:997
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
Split * xaccMallocSplit(QofBook *book)
Constructor.
Definition: gmock-Split.cpp:37
gnc_numeric gnc_numeric_sub(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a-b.
const GncOwner * gncOwnerGetEndOwner(const GncOwner *owner)
Get the "parent" Owner or GncGUID thereof.
Definition: gncOwner.c:572
QofBook reference.
Definition: qofbook-p.hpp:46
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition: Account.cpp:1473
#define xaccAccountInsertSplit(acc, s)
The xaccAccountInsertSplit() method will insert the indicated split into the indicated account...
Definition: Account.h:1065
GList * gncAccountValueAddList(GList *l1, GList *l2)
Merge l2 into l1.
Definition: gncTaxTable.c:970
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
Definition: gnc-numeric.h:165
time64 gnc_time(time64 *tbuf)
get the current time
Definition: gnc-date.cpp:262
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
Check for error signal in value.
GList * gncAccountValueAdd(GList *list, Account *acc, gnc_numeric value)
This will add value to the account-value for acc, creating a new list object if necessary.
Definition: gncTaxTable.c:942
void xaccTransSetDateEnteredSecs(Transaction *trans, time64 secs)
Modify the date of when the transaction was entered.
GncEmployee * gncOwnerGetEmployee(const GncOwner *owner)
If the given owner is of type GNC_OWNER_EMPLOYEE, returns the pointer to the employee object...
Definition: gncOwner.c:390
No error.
Definition: gnc-numeric.h:223
AccountValueList * gncInvoiceGetTotalTaxList(GncInvoice *invoice)
Return a list of tax totals accumulated per tax account.
Definition: gncInvoice.c:1032
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Definition: Account.cpp:1514

◆ gncInvoiceRemoveEntries()

void gncInvoiceRemoveEntries ( GncInvoice *  invoice)

Remove all entries from an invoice.

To be called before destroying an invoice.

Definition at line 760 of file gncInvoice.c.

761 {
762  if (!invoice) return;
763 
764  // gnc{Bill,Invoice}RemoveEntry free the "entry" node.
765  // Make sure to save "next" first.
766  for (GList *next, *node = invoice->entries; node; node = next)
767  {
768  next = node->next;
769  GncEntry *entry = node->data;
770 
771  switch (gncInvoiceGetOwnerType (invoice))
772  {
773  case GNC_OWNER_VENDOR:
774  case GNC_OWNER_EMPLOYEE:
775  // this is a vendor bill, or an expense voucher
776  gncBillRemoveEntry (invoice, entry);
777  break;
778  case GNC_OWNER_CUSTOMER:
779  default:
780  // this is an invoice
781  gncInvoiceRemoveEntry (invoice, entry);
782  break;
783  }
784 
785  /* If the entry is no longer referenced by any document,
786  * remove it.
787  */
788  if (!(gncEntryGetInvoice (entry) ||
789  gncEntryGetBill (entry) ||
790  gncEntryGetOrder (entry)))
791  {
792  gncEntryBeginEdit (entry);
793  gncEntryDestroy (entry);
794  }
795  }
796 }

◆ gncInvoiceSetDateOpenedGDate()

void gncInvoiceSetDateOpenedGDate ( GncInvoice *  invoice,
const GDate *  date 
)

Set the DateOpened using a GDate argument.

(Note: Internally this stores the date in a time64 as created through time64CanonicalDayTime()).

Definition at line 488 of file gncInvoice.c.

489 {
490  g_assert (date);
491  gncInvoiceSetDateOpened(invoice, time64CanonicalDayTime (gdate_to_time64 (*date)));
492 }
time64 gdate_to_time64(GDate d)
Turns a GDate into a time64, returning the first second of the day.
Definition: gnc-date.cpp:1323
time64 time64CanonicalDayTime(time64 t)
convert a time64 on a certain day (localtime) to the time64 representing midday on that day...
Definition: gnc-date.cpp:404

◆ gncInvoiceUnpost()

gboolean gncInvoiceUnpost ( GncInvoice *  invoice,
gboolean  reset_tax_tables 
)

Unpost this invoice.

This will destroy the posted transaction and return the invoice to its unposted state. It may leave empty lots out there. If reset_tax_tables is TRUE, then it will also revert all the Tax Tables to the parent, which will potentially change the total value of the invoice. It may also leave some orphaned Tax Table children.

Returns TRUE if successful, FALSE if there is a problem.

Definition at line 1736 of file gncInvoice.c.

1737 {
1738  Transaction *txn;
1739  GNCLot *lot;
1740  GList *lot_split_list, *lot_split_iter;
1741 
1742  if (!invoice) return FALSE;
1743  if (!gncInvoiceIsPosted (invoice)) return FALSE;
1744 
1745  txn = gncInvoiceGetPostedTxn (invoice);
1746  g_return_val_if_fail (txn, FALSE);
1747 
1748  lot = gncInvoiceGetPostedLot (invoice);
1749  g_return_val_if_fail (lot, FALSE);
1750 
1751  ENTER ("");
1752  /* Destroy the Posted Transaction */
1753  xaccTransClearReadOnly (txn);
1754  xaccTransBeginEdit (txn);
1755  xaccTransDestroy (txn);
1756  xaccTransCommitEdit (txn);
1757 
1758  /* Disconnect the lot from the invoice; re-attach to the invoice owner */
1759  gncInvoiceDetachFromLot (lot);
1760  gncOwnerAttachToLot (&invoice->owner, lot);
1761 
1762  /* Check if this invoice was linked to other lots (payments/inverse signed
1763  * invoices).
1764  * If this is the case, recreate the link transaction between all the remaining lots.
1765  *
1766  * Note that before GnuCash 2.6 payments were not stored in separate lots, but
1767  * always ended up in invoice lots when matched to an invoice. Over-payments
1768  * were copied to a new lot, to which later an invoice was added again and so on.
1769  * These over-payments were handled with automatic payment forward transactions.
1770  * You could consider these transactions to be links between lots as well, but
1771  * to avoid some unexpected behavior, these will not be altered here.
1772  */
1773 
1774  // Note: make a copy of the lot list here, when splits are deleted from the lot,
1775  // the original list may be destroyed by the lot code.
1776  lot_split_list = g_list_copy (gnc_lot_get_split_list (lot));
1777  if (lot_split_list)
1778  PINFO ("Recreating link transactions for remaining lots");
1779  for (lot_split_iter = lot_split_list; lot_split_iter; lot_split_iter = lot_split_iter->next)
1780  {
1781  Split *split = lot_split_iter->data;
1782  GList *other_split_list, *list_iter;
1783  Transaction *other_txn = xaccSplitGetParent (split);
1784  GList *lot_list = NULL;
1785 
1786  /* Only work with transactions that link invoices and payments.
1787  * Note: this check also catches the possible case of NULL splits. */
1788  if (xaccTransGetTxnType (other_txn) != TXN_TYPE_LINK)
1789  continue;
1790 
1791  /* Save a list of lots this linking transaction linked to */
1792  other_split_list = xaccTransGetSplitList (other_txn);
1793  for (list_iter = other_split_list; list_iter; list_iter = list_iter->next)
1794  {
1795  Split *other_split = list_iter->data;
1796  GNCLot *other_lot = xaccSplitGetLot (other_split);
1797 
1798  /* Omit the lot we are about to delete */
1799  if (other_lot == lot)
1800  continue;
1801 
1802  lot_list = g_list_prepend (lot_list, other_lot);
1803  }
1804  /* Maintain original split order */
1805  lot_list = g_list_reverse (lot_list);
1806 
1807  /* Now remove this link transaction. */
1808  xaccTransClearReadOnly (other_txn);
1809  xaccTransBeginEdit (other_txn);
1810  xaccTransDestroy (other_txn);
1811  xaccTransCommitEdit (other_txn);
1812 
1813  /* Re-balance the saved lots as well as is possible */
1814  gncOwnerAutoApplyPaymentsWithLots (&invoice->owner, lot_list);
1815 
1816  /* If any of the saved lots has no more splits, then destroy it.
1817  * Otherwise if any has an invoice associated with it,
1818  * send it a modified event to reset its paid status */
1819  for (list_iter = lot_list; list_iter; list_iter = list_iter->next)
1820  {
1821  GNCLot *other_lot = list_iter->data;
1822  GncInvoice *other_invoice = gncInvoiceGetInvoiceFromLot (other_lot);
1823 
1824  if (!gnc_lot_count_splits (other_lot))
1825  gnc_lot_destroy (other_lot);
1826  else if (other_invoice)
1827  qof_event_gen (QOF_INSTANCE(other_invoice), QOF_EVENT_MODIFY, NULL);
1828  }
1829  g_list_free (lot_list);
1830  }
1831  g_list_free (lot_split_list);
1832 
1833  /* If the lot has no splits, then destroy it */
1834  if (!gnc_lot_count_splits (lot))
1835  gnc_lot_destroy (lot);
1836 
1837  /* Clear out the invoice posted information */
1838  gncInvoiceBeginEdit (invoice);
1839 
1840  invoice->posted_acc = NULL;
1841  invoice->posted_txn = NULL;
1842  invoice->posted_lot = NULL;
1843  invoice->date_posted = INT64_MAX;
1844 
1845  /* if we've been asked to reset the tax tables, then do so */
1846  if (reset_tax_tables)
1847  {
1848  gboolean is_cust_doc = (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_CUSTOMER);
1849  GList *iter;
1850 
1851  for (iter = gncInvoiceGetEntries (invoice); iter; iter = iter->next)
1852  {
1853  GncEntry *entry = iter->data;
1854 
1855  gncEntryBeginEdit (entry);
1856  if (is_cust_doc)
1857  gncEntrySetInvTaxTable (entry,
1858  gncTaxTableGetParent (gncEntryGetInvTaxTable( entry)));
1859  else
1860  gncEntrySetBillTaxTable (entry,
1861  gncTaxTableGetParent (gncEntryGetBillTaxTable (entry)));
1862  gncEntryCommitEdit (entry);
1863  }
1864  }
1865 
1866  mark_invoice (invoice);
1867  gncInvoiceCommitEdit (invoice);
1868 
1869  LEAVE ("TRUE");
1870 
1871  return TRUE;
1872 }
char xaccTransGetTxnType(Transaction *trans)
Returns the Transaction Type: note this type will be derived from the transaction splits...
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
void gncOwnerAutoApplyPaymentsWithLots(const GncOwner *owner, GList *lots)
Given a list of lots, try to balance as many of them as possible by creating balancing transactions b...
Definition: gncOwner.c:1256
void xaccTransDestroy(Transaction *trans)
Destroys a transaction.
SplitList * gnc_lot_get_split_list(const GNCLot *lot)
Returns a list of all the splits in this lot.
Definition: gnc-lot.cpp:425
void gncOwnerAttachToLot(const GncOwner *owner, GNCLot *lot)
Attach an owner to a lot.
Definition: gncOwner.c:622
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
#define TXN_TYPE_LINK
Transaction is a link between (invoice and payment) lots.
Definition: Transaction.h:128
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
GncInvoice * gncInvoiceGetInvoiceFromLot(GNCLot *lot)
Given a LOT, find and return the Invoice attached to the lot.
Definition: gncInvoice.c:1234
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Definition: qofevent.cpp:231
SplitList * xaccTransGetSplitList(const Transaction *trans)
The xaccTransGetSplitList() method returns a GList of the splits in a transaction.
GNCLot * xaccSplitGetLot(const Split *split)
Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn't be...
Definition: Split.cpp:1885