GnuCash  5.6-125-g579da58a10+
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_ENTRIES   "list_of_entries"
 
#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)
 
QofBook * gncInvoiceGetBook (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 1342 of file gncInvoice.c.

1343 {
1344  switch (gncInvoiceGetType (invoice))
1345  {
1346  case GNC_INVOICE_CUST_INVOICE:
1347  case GNC_INVOICE_VEND_CREDIT_NOTE:
1348  case GNC_INVOICE_EMPL_CREDIT_NOTE:
1349  return TRUE;
1350  case GNC_INVOICE_CUST_CREDIT_NOTE:
1351  case GNC_INVOICE_VEND_INVOICE:
1352  case GNC_INVOICE_EMPL_INVOICE:
1353  return FALSE;
1354  case GNC_INVOICE_UNDEFINED:
1355  default:
1356  /* Should never be reached.
1357  * If it is, perhaps a new value is added to GncInvoiceType ? */
1358  g_assert_not_reached ();
1359  return FALSE;
1360  }
1361 }

◆ 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 2006 of file gncInvoice.c.

2010 {
2011  GNCLot *payment_lot;
2012  GList *selected_lots = NULL;
2013  const GncOwner *owner;
2014 
2015  /* Verify our arguments */
2016  if (!invoice || !gncInvoiceIsPosted (invoice) || !xfer_acc) return;
2017 
2018  owner = gncOwnerGetEndOwner (gncInvoiceGetOwner (invoice));
2019  g_return_if_fail (owner->owner.undefined);
2020 
2021  /* Create a lot for this payment */
2022  payment_lot = gncOwnerCreatePaymentLotSecs (owner, &txn,
2023  invoice->posted_acc,
2024  xfer_acc, amount, exch,
2025  date, memo, num);
2026 
2027  /* Select the invoice as only payment candidate */
2028  selected_lots = g_list_prepend (selected_lots, invoice->posted_lot);
2029 
2030  /* And link the invoice lot and the payment lot together as well as possible. */
2031  if (payment_lot)
2032  selected_lots = g_list_prepend (selected_lots, payment_lot);
2033  gncOwnerAutoApplyPaymentsWithLots (owner, selected_lots);
2034 }
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 337 of file gncInvoice.c.

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

◆ 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 1363 of file gncInvoice.c.

1364 {
1365  EntryList *entries_iter;
1366  gboolean is_cust_doc = (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_CUSTOMER);
1367  gboolean is_cn = gncInvoiceGetIsCreditNote (invoice);
1368  GHashTable *amt_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal,
1369  NULL, g_free);
1370  ENTER ("");
1371 
1372  for (entries_iter = invoice->entries; entries_iter != NULL; entries_iter = g_list_next(entries_iter))
1373  {
1374  GncEntry *entry = (GncEntry*)entries_iter->data;
1375  Account *this_acc;
1376  gnc_commodity *account_currency;
1377  AccountValueList *tt_amts = NULL, *tt_iter;
1378 
1379  /* Check entry's account currency */
1380  this_acc = (is_cust_doc ? gncEntryGetInvAccount (entry) :
1381  gncEntryGetBillAccount (entry));
1382  account_currency = xaccAccountGetCommodity (this_acc);
1383 
1384  if (this_acc &&
1385  !gnc_commodity_equal (gncInvoiceGetCurrency (invoice), account_currency))
1386  {
1387  gnc_numeric *curr_amt = (gnc_numeric*) g_hash_table_lookup (amt_hash, account_currency);
1388  gnc_numeric *entry_amt = (gnc_numeric*) g_new0 (gnc_numeric, 1);
1389  *entry_amt = gncEntryGetDocValue (entry, FALSE, is_cust_doc, is_cn);
1390  if (curr_amt)
1391  *entry_amt = gnc_numeric_add (*entry_amt, *curr_amt, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND_HALF_UP);
1392  g_hash_table_insert (amt_hash, account_currency, entry_amt);
1393  }
1394 
1395  /* Check currencies of each account in the tax table linked
1396  * to the current entry */
1397  tt_amts = gncEntryGetDocTaxValues (entry, is_cust_doc, is_cn);
1398 
1399  if (!tt_amts)
1400  continue;
1401 
1402  for (tt_iter = tt_amts; tt_iter != NULL; tt_iter = g_list_next(tt_iter))
1403  {
1404  GncAccountValue *tt_amt_val = (GncAccountValue*)tt_iter->data;
1405  Account *tt_acc = tt_amt_val->account;
1406  gnc_commodity *tt_acc_currency = xaccAccountGetCommodity (tt_acc);
1407 
1408  if (tt_acc &&
1409  !gnc_commodity_equal (gncInvoiceGetCurrency (invoice), tt_acc_currency))
1410  {
1411  gnc_numeric *curr_amt = (gnc_numeric*) g_hash_table_lookup (amt_hash, tt_acc_currency);
1412  gnc_numeric *tt_acc_amt = (gnc_numeric*) g_new0 (gnc_numeric, 1);
1413  *tt_acc_amt = tt_amt_val->value;
1414  if (curr_amt)
1415  *tt_acc_amt = gnc_numeric_add (*tt_acc_amt, *curr_amt, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND_HALF_UP);
1416  g_hash_table_insert (amt_hash, tt_acc_currency, tt_acc_amt);
1417  }
1418  }
1419  gncAccountValueDestroy (tt_amts);
1420  }
1421 
1422  LEAVE ("");
1423  return amt_hash;
1424 }
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:3465
#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:167
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
Definition: gnc-numeric.h:247

◆ 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 1009 of file gncInvoice.c.

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

◆ 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 1497 of file gncInvoice.c.

1501 {
1502  Transaction *txn;
1503  QofBook *book;
1504  GNCLot *lot = NULL;
1505  GList *iter;
1506  GList *splitinfo = NULL;
1507  gnc_numeric total;
1508  gboolean is_cust_doc;
1509  gboolean is_cn;
1510  const char *name, *type;
1511  char *lot_title;
1512  Account *ccard_acct = NULL;
1513  const GncOwner *owner;
1514  int denom = xaccAccountGetCommoditySCU (acc);
1515  AccountValueList *taxes;
1516 
1517  if (!invoice || !acc) return NULL;
1518  if (gncInvoiceIsPosted (invoice)) return NULL;
1519 
1520  ENTER ("");
1521  gncInvoiceBeginEdit (invoice);
1522  book = qof_instance_get_book (invoice);
1523 
1524  /* Stabilize the Billing Terms of this invoice */
1525  if (invoice->terms)
1526  gncInvoiceSetTerms (invoice,
1527  gncBillTermReturnChild (invoice->terms, TRUE));
1528 
1529  /* GncEntry functions need to know if the invoice/credit note is for a customer or a vendor/employee. */
1530  is_cust_doc = (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_CUSTOMER);
1531  is_cn = gncInvoiceGetIsCreditNote (invoice);
1532 
1533  /* Figure out if we need to separate out "credit-card" items */
1534  owner = gncOwnerGetEndOwner (gncInvoiceGetOwner (invoice));
1535  if (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_EMPLOYEE)
1536  ccard_acct = gncEmployeeGetCCard (gncOwnerGetEmployee (owner));
1537 
1538  /* Create a new lot for this invoice */
1539  lot = gnc_lot_new (book);
1540  gncInvoiceAttachToLot (invoice, lot);
1541  gnc_lot_begin_edit (lot);
1542 
1543  type = gncInvoiceGetTypeString (invoice);
1544 
1545  /* Set the lot title */
1546  lot_title = g_strdup_printf ("%s %s", type, gncInvoiceGetID (invoice));
1547  gnc_lot_set_title (lot, lot_title);
1548  g_free (lot_title);
1549 
1550  /* Create a new transaction */
1551  txn = xaccMallocTransaction (book);
1552  xaccTransBeginEdit (txn);
1553 
1554  name = gncOwnerGetName (gncOwnerGetEndOwner (gncInvoiceGetOwner (invoice)));
1555 
1556  /* Set Transaction Description (Owner Name) , Num (invoice ID or type, based
1557  * on book option), Currency */
1558  xaccTransSetDescription (txn, name ? name : "");
1559  gnc_set_num_action (txn, NULL, gncInvoiceGetID (invoice), type);
1560  xaccTransSetCurrency (txn, invoice->currency);
1561 
1562  /* Entered and Posted at date */
1563  xaccTransSetDateEnteredSecs (txn, gnc_time (NULL));
1564  xaccTransSetDatePostedSecsNormalized (txn, post_date);
1565  gncInvoiceSetDatePosted (invoice, xaccTransRetDatePosted(txn));
1566 
1567  xaccTransSetDateDue (txn, due_date);
1568 
1569  /* Get invoice total and taxes. */
1570  total = gncInvoiceGetTotal (invoice);
1571  taxes = gncInvoiceGetTotalTaxList (invoice);
1572  /* The two functions above return signs relative to the document
1573  * We need to convert them to balance values before we can use them here
1574  * Note the odd construct comparing two booleans is to xor them
1575  * that is, only evaluate true if both are different.
1576  */
1577  if (is_cust_doc != is_cn)
1578  {
1579  GList *node;
1580  total = gnc_numeric_neg (total);
1581  for (node = taxes; node; node = node->next)
1582  {
1583  GncAccountValue *acc_val = node->data;
1584  acc_val->value = gnc_numeric_neg (acc_val->value);
1585  }
1586  }
1587 
1588  /* Iterate through the entries; sum up everything for each account.
1589  * then create the appropriate splits in this txn.
1590  */
1591 
1592  for (iter = gncInvoiceGetEntries (invoice); iter; iter = iter->next)
1593  {
1594  gnc_numeric value, tax;
1595  GncEntry * entry = iter->data;
1596  Account *this_acc;
1597 
1598  /* Stabilize the TaxTable in this entry */
1599  gncEntryBeginEdit (entry);
1600  if (is_cust_doc)
1601  gncEntrySetInvTaxTable
1602  (entry, gncTaxTableReturnChild (gncEntryGetInvTaxTable (entry), TRUE));
1603  else
1604  {
1605  gncEntrySetBillTaxTable
1606  (entry, gncTaxTableReturnChild (gncEntryGetBillTaxTable (entry), TRUE));
1607 
1608  /* If this is a bill, and the entry came from an invoice originally, copy the price */
1609  if (gncEntryGetBillable (entry))
1610  {
1611  /* We need to set the net price since it may be another tax rate for invoices than bills */
1612  gncEntrySetInvPrice (entry, gncEntryGetPrice (entry, FALSE, TRUE));
1613  gncEntrySetInvTaxIncluded (entry, FALSE);
1614  }
1615  }
1616  gncEntryCommitEdit (entry);
1617 
1618  /* Obtain the Entry's Value and TaxValues
1619  Note we use rounded values here and below to prevent creating an imbalanced transaction */
1620  value = gncEntryGetBalValue (entry, TRUE, is_cust_doc);
1621  tax = gncEntryGetBalTaxValue (entry, TRUE, is_cust_doc);
1622 
1623  DEBUG ("Tax %" PRId64 "/%" PRId64 " on entry value %" PRId64 "/%" PRId64,
1624  tax.num, tax.denom, value.num, value.denom);
1625  /* add the value for the account split */
1626  this_acc = (is_cust_doc ? gncEntryGetInvAccount (entry) :
1627  gncEntryGetBillAccount (entry));
1628  if (this_acc)
1629  {
1630  if (gnc_numeric_check (value) == GNC_ERROR_OK)
1631  {
1632  if (accumulatesplits)
1633  splitinfo = gncAccountValueAdd (splitinfo, this_acc, value);
1634  /* Adding to total in case of accumulatesplits will be deferred to later when each split is effectively added */
1635  else if (!gncInvoicePostAddSplit (book, this_acc, txn, value,
1636  gncEntryGetDescription (entry),
1637  type, invoice))
1638  {
1639  /*This is an error, which shouldn't even be able to happen.
1640  We can't really do anything sensible about it, and this is
1641  a user-interface free zone so we can't try asking the user
1642  again either, have to return NULL*/
1643  PERR("Failed to add split %s", gncEntryGetDescription (entry));
1644  LEAVE ("NULL");
1645  return NULL;
1646  }
1647 
1648  /* If there is a credit-card account, and this is a CCard
1649  * payment type, subtract it from the total, and instead
1650  * create a split to the CC Acct with a memo of the entry
1651  * description instead of the provided memo. Note that the
1652  * value reversal is the same as the post account.
1653  *
1654  * Note: we don't have to worry about the tax values --
1655  * expense vouchers don't have them.
1656  */
1657  if (ccard_acct && gncEntryGetBillPayment (entry) == GNC_PAYMENT_CARD)
1658  {
1659  Split *split;
1660 
1661  total = gnc_numeric_sub (total, value, denom,
1663 
1664  split = xaccMallocSplit (book);
1665  xaccSplitSetMemo (split, gncEntryGetDescription (entry));
1666  /* set action based on book option */
1667  gnc_set_num_action (NULL, split, gncInvoiceGetID (invoice), type);
1668  xaccAccountBeginEdit (ccard_acct);
1669  xaccAccountInsertSplit (ccard_acct, split);
1670  xaccAccountCommitEdit (ccard_acct);
1671  xaccTransAppendSplit (txn, split);
1672  xaccSplitSetBaseValue (split, gnc_numeric_neg (value),
1673  invoice->currency);
1674 
1675  }
1676 
1677  }
1678  else
1679  PWARN ("bad value in our entry");
1680  }
1681 
1682  /* check the taxes */
1683  if (gnc_numeric_check (tax) != GNC_ERROR_OK)
1684  PWARN ("bad tax in our entry");
1685 
1686  } /* for */
1687 
1688 
1689  /* now merge in the TaxValues */
1690  splitinfo = gncAccountValueAddList (splitinfo, taxes);
1691  gncAccountValueDestroy (taxes);
1692 
1693  /* Iterate through the splitinfo list and generate the splits */
1694  if (splitinfo)
1695  PINFO ("Processing Split List");
1696  for (iter = splitinfo; iter; iter = iter->next)
1697  {
1698  GncAccountValue *acc_val = iter->data;
1699 
1700  //gnc_numeric amt_rounded = gnc_numeric_convert(acc_val->value,
1701  // denom, GNC_HOW_DENOM_EXACT | GNC_HOW_RND_ROUND_HALF_UP);
1702  if (!gncInvoicePostAddSplit (book, acc_val->account, txn, acc_val->value,
1703  memo, type, invoice))
1704  {
1705  /*This is an error, which shouldn't even be able to happen.
1706  We can't really do anything sensible about it, and this is
1707  a user-interface free zone so we can't try asking the user
1708  again either, have to return NULL*/
1709  PERR("Failed to add split %s, aborting accumulated splits.", memo);
1710  return NULL;
1711  }
1712  }
1713 
1714  /* If there is a ccard account, we may have an additional "to_card" payment.
1715  * we should make that now.
1716  */
1717  if (ccard_acct && !gnc_numeric_zero_p (invoice->to_charge_amount))
1718  {
1719  Split *split = xaccMallocSplit (book);
1720 
1721  /* To charge amount is stored in document value. We need balance value here
1722  * so convert if necessary. */
1723  gnc_numeric to_charge_bal_amount = (is_cn ? gnc_numeric_neg (invoice->to_charge_amount)
1724  : invoice->to_charge_amount);
1725 
1726  PINFO ("Process to_card payment split");
1727  /* Set memo. */
1728  xaccSplitSetMemo (split, _("Extra to Charge Card"));
1729  /* Set action based on book option */
1730  gnc_set_num_action (NULL, split, gncInvoiceGetID (invoice), type);
1731 
1732  xaccAccountBeginEdit (ccard_acct);
1733  xaccAccountInsertSplit (ccard_acct, split);
1734  xaccAccountCommitEdit (ccard_acct);
1735  xaccTransAppendSplit (txn, split);
1736  xaccSplitSetBaseValue (split, gnc_numeric_neg (to_charge_bal_amount),
1737  invoice->currency);
1738 
1739  total = gnc_numeric_sub (total, to_charge_bal_amount, denom,
1741  }
1742 
1743  /* Now create the Posted split (which is the opposite sign of the above splits) */
1744  {
1745  Split *split = xaccMallocSplit (book);
1746 
1747  PINFO ("Process to_card balancing split");
1748  /* Set memo */
1749  xaccSplitSetMemo (split, memo);
1750  /* Set action based on book option */
1751  gnc_set_num_action (NULL, split, gncInvoiceGetID (invoice), type);
1752 
1753  xaccAccountBeginEdit (acc);
1754  xaccAccountInsertSplit (acc, split);
1755  xaccAccountCommitEdit (acc);
1756  xaccTransAppendSplit (txn, split);
1757  xaccSplitSetBaseValue (split, gnc_numeric_neg (total),
1758  invoice->currency);
1759 
1760  /* add this split to the lot */
1761  gnc_lot_add_split (lot, split);
1762  }
1763 
1764  /* Now attach this invoice to the txn and account */
1765  gncInvoiceAttachToTxn (invoice, txn);
1766  gncInvoiceSetPostedAcc (invoice, acc);
1767 
1768  xaccTransSetReadOnly (txn, _("Generated from an invoice. Try unposting the invoice."));
1769  xaccTransCommitEdit (txn);
1770 
1771  gncAccountValueDestroy (splitinfo);
1772 
1773  gnc_lot_commit_edit (lot);
1774  /* Not strictly necessary, since it was done by the Set calls
1775  * above, but good insurance. */
1776  DEBUG("Committing Invoice %s", invoice->id);
1777  mark_invoice (invoice);
1778  gncInvoiceCommitEdit (invoice);
1779 
1780  /* If requested, attempt to automatically apply open payments
1781  * and reverse documents to this lot to close it (or at least
1782  * reduce its balance) */
1783  if (autopay)
1784  gncInvoiceAutoApplyPayments (invoice);
1785 
1786  LEAVE ("");
1787  return txn;
1788 }
#define xaccTransAppendSplit(t, s)
Add a split to the transaction.
Definition: Transaction.h:381
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:1353
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:2702
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)
The gnc_lot_add_split() routine adds a split to this lot.
Definition: gnc-lot.cpp:594
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:190
#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:1009
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:1962
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
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition: Account.cpp:1483
#define xaccAccountInsertSplit(acc, s)
The xaccAccountInsertSplit() method will insert the indicated split into the indicated account...
Definition: Account.h:1048
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:167
time64 gnc_time(time64 *tbuf)
get the current time
Definition: gnc-date.cpp:261
GNCNumericErrorCode gnc_numeric_check(gnc_numeric in)
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:225
AccountValueList * gncInvoiceGetTotalTaxList(GncInvoice *invoice)
Return a list of tax totals accumulated per tax account.
Definition: gncInvoice.c:1033
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Definition: Account.cpp:1524

◆ gncInvoiceRemoveEntries()

void gncInvoiceRemoveEntries ( GncInvoice *  invoice)

Remove all entries from an invoice.

To be called before destroying an invoice.

Definition at line 761 of file gncInvoice.c.

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

◆ 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 489 of file gncInvoice.c.

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

◆ 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 1791 of file gncInvoice.c.

1792 {
1793  Transaction *txn;
1794  GNCLot *lot;
1795  GList *lot_split_list, *lot_split_iter;
1796 
1797  if (!invoice) return FALSE;
1798  if (!gncInvoiceIsPosted (invoice)) return FALSE;
1799 
1800  txn = gncInvoiceGetPostedTxn (invoice);
1801  g_return_val_if_fail (txn, FALSE);
1802 
1803  lot = gncInvoiceGetPostedLot (invoice);
1804  g_return_val_if_fail (lot, FALSE);
1805 
1806  ENTER ("");
1807  /* Destroy the Posted Transaction */
1808  xaccTransClearReadOnly (txn);
1809  xaccTransBeginEdit (txn);
1810  xaccTransDestroy (txn);
1811  xaccTransCommitEdit (txn);
1812 
1813  /* Disconnect the lot from the invoice; re-attach to the invoice owner */
1814  gncInvoiceDetachFromLot (lot);
1815  gncOwnerAttachToLot (&invoice->owner, lot);
1816 
1817  /* Check if this invoice was linked to other lots (payments/inverse signed
1818  * invoices).
1819  * If this is the case, recreate the link transaction between all the remaining lots.
1820  *
1821  * Note that before GnuCash 2.6 payments were not stored in separate lots, but
1822  * always ended up in invoice lots when matched to an invoice. Over-payments
1823  * were copied to a new lot, to which later an invoice was added again and so on.
1824  * These over-payments were handled with automatic payment forward transactions.
1825  * You could consider these transactions to be links between lots as well, but
1826  * to avoid some unexpected behavior, these will not be altered here.
1827  */
1828 
1829  // Note: make a copy of the lot list here, when splits are deleted from the lot,
1830  // the original list may be destroyed by the lot code.
1831  lot_split_list = g_list_copy (gnc_lot_get_split_list (lot));
1832  if (lot_split_list)
1833  PINFO ("Recreating link transactions for remaining lots");
1834  for (lot_split_iter = lot_split_list; lot_split_iter; lot_split_iter = lot_split_iter->next)
1835  {
1836  Split *split = lot_split_iter->data;
1837  GList *other_split_list, *list_iter;
1838  Transaction *other_txn = xaccSplitGetParent (split);
1839  GList *lot_list = NULL;
1840 
1841  /* Only work with transactions that link invoices and payments.
1842  * Note: this check also catches the possible case of NULL splits. */
1843  if (xaccTransGetTxnType (other_txn) != TXN_TYPE_LINK)
1844  continue;
1845 
1846  /* Save a list of lots this linking transaction linked to */
1847  other_split_list = xaccTransGetSplitList (other_txn);
1848  for (list_iter = other_split_list; list_iter; list_iter = list_iter->next)
1849  {
1850  Split *other_split = list_iter->data;
1851  GNCLot *other_lot = xaccSplitGetLot (other_split);
1852 
1853  /* Omit the lot we are about to delete */
1854  if (other_lot == lot)
1855  continue;
1856 
1857  lot_list = g_list_prepend (lot_list, other_lot);
1858  }
1859  /* Maintain original split order */
1860  lot_list = g_list_reverse (lot_list);
1861 
1862  /* Now remove this link transaction. */
1863  xaccTransClearReadOnly (other_txn);
1864  xaccTransBeginEdit (other_txn);
1865  xaccTransDestroy (other_txn);
1866  xaccTransCommitEdit (other_txn);
1867 
1868  /* Re-balance the saved lots as well as is possible */
1869  gncOwnerAutoApplyPaymentsWithLots (&invoice->owner, lot_list);
1870 
1871  /* If any of the saved lots has no more splits, then destroy it.
1872  * Otherwise if any has an invoice associated with it,
1873  * send it a modified event to reset its paid status */
1874  for (list_iter = lot_list; list_iter; list_iter = list_iter->next)
1875  {
1876  GNCLot *other_lot = list_iter->data;
1877  GncInvoice *other_invoice = gncInvoiceGetInvoiceFromLot (other_lot);
1878 
1879  if (!gnc_lot_count_splits (other_lot))
1880  gnc_lot_destroy (other_lot);
1881  else if (other_invoice)
1882  qof_event_gen (QOF_INSTANCE(other_invoice), QOF_EVENT_MODIFY, NULL);
1883  }
1884  g_list_free (lot_list);
1885  }
1886  g_list_free (lot_split_list);
1887 
1888  /* If the lot has no splits, then destroy it */
1889  if (!gnc_lot_count_splits (lot))
1890  gnc_lot_destroy (lot);
1891 
1892  /* Clear out the invoice posted information */
1893  gncInvoiceBeginEdit (invoice);
1894 
1895  invoice->posted_acc = NULL;
1896  invoice->posted_txn = NULL;
1897  invoice->posted_lot = NULL;
1898  invoice->date_posted = INT64_MAX;
1899 
1900  /* if we've been asked to reset the tax tables, then do so */
1901  if (reset_tax_tables)
1902  {
1903  gboolean is_cust_doc = (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_CUSTOMER);
1904  GList *iter;
1905 
1906  for (iter = gncInvoiceGetEntries (invoice); iter; iter = iter->next)
1907  {
1908  GncEntry *entry = iter->data;
1909 
1910  gncEntryBeginEdit (entry);
1911  if (is_cust_doc)
1912  gncEntrySetInvTaxTable (entry,
1913  gncTaxTableGetParent (gncEntryGetInvTaxTable( entry)));
1914  else
1915  gncEntrySetBillTaxTable (entry,
1916  gncTaxTableGetParent (gncEntryGetBillTaxTable (entry)));
1917  gncEntryCommitEdit (entry);
1918  }
1919  }
1920 
1921  mark_invoice (invoice);
1922  gncInvoiceCommitEdit (invoice);
1923 
1924  LEAVE ("TRUE");
1925 
1926  return TRUE;
1927 }
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)
The gnc_lot_get_split_list() routine returns a GList 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:1289
#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:1915