Add TaxTable entries to Vendor Invoices (Bills); make sure it does

not bleed over into billback items.  Fixes RFE #91415

	(See ChangeLog for more details)


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7208 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Derek Atkins
2002-09-14 05:32:37 +00:00
parent b3e5697cf5
commit 1a38508787
14 changed files with 830 additions and 418 deletions

View File

@@ -1,3 +1,36 @@
2002-09-14 Derek Atkins <derek@ihtfp.com>
Add TaxTable entries to Vendor Invoices (Bills); make sure it does
not bleed over into billback items. Fixes RFE #91415
* business-core/gncEntry.[ch] -- change the API to provide
separate storage for Price, Taxtable information, etc. for
Invoices and Bills, for chargeback features
* business-core/file/gnc-entry-xml-v2.c -- change the XML to
clearly separate the "bill" and "invoice" data.
* business-core/gw-business-core-spec.scm -- change scheme API
to match the new gncEntry API
* business-core/gncInvoice.c -- use new gncEntry API. If posting
a bill, set the invoice-price on each "billable" item.
* business-gnome/business-prefs.scm -- duplicate the Taxincluded
preference into Invoice Taxincluded and Bill Taxincluded.
* business-gnome/dialog-invoice.c -- use proper Price (Invoice
Price or Bill Price) when sorting by price.
* business-ledger/gncEntryLedgerP.h -- add "is_invoice" flag
* business-ledger/gncEntryLedger.c -- set is_invoice at creation
* business-ledger/gncEntryLedgerLayout.c -- add TaxTable columns to Bills
* business-ledger/gncEntryLedgerLoad.c -- initialize the entry properly
based upon this being an invoice or a bill. Use different global
pref's as well.
* business-ledger/gncEntryLedgerModel.c -- Load/Save using the new API.
Make price-cell immutable if the ledger is an invoice-ledger and the
entry is attached to a bill.
* business-reports/invoice.scm -- use new API
2002-09-07 Christian Stimming <stimming@tuhh.de> 2002-09-07 Christian Stimming <stimming@tuhh.de>
* src/import-export/gnc-generic-import.c, ...: Patch by Benoit * src/import-export/gnc-generic-import.c, ...: Patch by Benoit

View File

@@ -66,20 +66,30 @@ const gchar *entry_version_string = "2.0.0";
#define entry_action_string "entry:action" #define entry_action_string "entry:action"
#define entry_notes_string "entry:notes" #define entry_notes_string "entry:notes"
#define entry_qty_string "entry:qty" #define entry_qty_string "entry:qty"
#define entry_price_string "entry:price"
#define entry_discount_string "entry:discount" /* cust inv */
#define entry_disctype_string "entry:disc-type"
#define entry_dischow_string "entry:disc-how"
#define entry_invacct_string "entry:i-acct" #define entry_invacct_string "entry:i-acct"
#define entry_iprice_string "entry:i-price"
#define entry_idiscount_string "entry:i-discount"
#define entry_idisctype_string "entry:i-disc-type"
#define entry_idischow_string "entry:i-disc-how"
#define entry_itaxable_string "entry:i-taxable"
#define entry_itaxincluded_string "entry:i-taxincluded"
#define entry_itaxtable_string "entry:i-taxtable"
/* vend bill */
#define entry_billacct_string "entry:b-acct" #define entry_billacct_string "entry:b-acct"
#define entry_taxable_string "entry:taxable" #define entry_bprice_string "entry:b-price"
#define entry_taxincluded_string "entry:taxincluded" #define entry_btaxable_string "entry:b-taxable"
#define entry_taxtable_string "entry:taxtable" #define entry_btaxincluded_string "entry:b-taxincluded"
#define entry_btaxtable_string "entry:b-taxtable"
#define entry_billable_string "entry:billable"
#define entry_billto_string "entry:billto"
/* other stuff */
#define entry_order_string "entry:order" #define entry_order_string "entry:order"
#define entry_invoice_string "entry:invoice" #define entry_invoice_string "entry:invoice"
#define entry_bill_string "entry:bill" #define entry_bill_string "entry:bill"
#define entry_billable_string "entry:billable"
#define entry_billto_string "entry:billto"
static void static void
maybe_add_string (xmlNodePtr ptr, const char *tag, const char *str) maybe_add_string (xmlNodePtr ptr, const char *tag, const char *str)
@@ -123,44 +133,49 @@ entry_dom_tree_create (GncEntry *entry)
maybe_add_string (ret, entry_notes_string, gncEntryGetNotes (entry)); maybe_add_string (ret, entry_notes_string, gncEntryGetNotes (entry));
maybe_add_numeric (ret, entry_qty_string, gncEntryGetQuantity (entry)); maybe_add_numeric (ret, entry_qty_string, gncEntryGetQuantity (entry));
maybe_add_numeric (ret, entry_price_string, gncEntryGetPrice (entry));
maybe_add_numeric (ret, entry_discount_string, gncEntryGetDiscount (entry)); /* cust invoice */
xmlAddChild(ret, text_to_dom_tree(entry_disctype_string,
gncAmountTypeToString (
gncEntryGetDiscountType (entry))));
xmlAddChild(ret, text_to_dom_tree(entry_dischow_string,
gncEntryDiscountHowToString (
gncEntryGetDiscountHow (entry))));
acc = gncEntryGetInvAccount (entry); acc = gncEntryGetInvAccount (entry);
if (acc) if (acc)
xmlAddChild (ret, guid_to_dom_tree (entry_invacct_string, xmlAddChild (ret, guid_to_dom_tree (entry_invacct_string,
xaccAccountGetGUID (acc))); xaccAccountGetGUID (acc)));
maybe_add_numeric (ret, entry_iprice_string, gncEntryGetInvPrice (entry));
maybe_add_numeric (ret, entry_idiscount_string, gncEntryGetInvDiscount (entry));
invoice = gncEntryGetInvoice (entry);
if (invoice) {
xmlAddChild (ret, guid_to_dom_tree (entry_invoice_string,
gncInvoiceGetGUID (invoice)));
xmlAddChild(ret, text_to_dom_tree(entry_idisctype_string,
gncAmountTypeToString (
gncEntryGetInvDiscountType (entry))));
xmlAddChild(ret, text_to_dom_tree(entry_idischow_string,
gncEntryDiscountHowToString (
gncEntryGetInvDiscountHow (entry))));
xmlAddChild(ret, int_to_dom_tree(entry_itaxable_string,
gncEntryGetInvTaxable (entry)));
xmlAddChild(ret, int_to_dom_tree(entry_itaxincluded_string,
gncEntryGetInvTaxIncluded (entry)));
}
taxtable = gncEntryGetInvTaxTable (entry);
if (taxtable)
xmlAddChild (ret, guid_to_dom_tree (entry_itaxtable_string,
gncTaxTableGetGUID (taxtable)));
/* vendor bills */
acc = gncEntryGetBillAccount (entry); acc = gncEntryGetBillAccount (entry);
if (acc) if (acc)
xmlAddChild (ret, guid_to_dom_tree (entry_billacct_string, xmlAddChild (ret, guid_to_dom_tree (entry_billacct_string,
xaccAccountGetGUID (acc))); xaccAccountGetGUID (acc)));
xmlAddChild(ret, int_to_dom_tree(entry_taxable_string, maybe_add_numeric (ret, entry_bprice_string, gncEntryGetBillPrice (entry));
gncEntryGetTaxable (entry)));
xmlAddChild(ret, int_to_dom_tree(entry_taxincluded_string,
gncEntryGetTaxIncluded (entry)));
taxtable = gncEntryGetTaxTable (entry);
if (taxtable)
xmlAddChild (ret, guid_to_dom_tree (entry_taxtable_string,
gncTaxTableGetGUID (taxtable)));
order = gncEntryGetOrder (entry);
if (order)
xmlAddChild (ret, guid_to_dom_tree (entry_order_string,
gncOrderGetGUID (order)));
invoice = gncEntryGetInvoice (entry);
if (invoice)
xmlAddChild (ret, guid_to_dom_tree (entry_invoice_string,
gncInvoiceGetGUID (invoice)));
invoice = gncEntryGetBill (entry); invoice = gncEntryGetBill (entry);
if (invoice) { if (invoice) {
@@ -172,8 +187,25 @@ entry_dom_tree_create (GncEntry *entry)
owner = gncEntryGetBillTo (entry); owner = gncEntryGetBillTo (entry);
if (owner && owner->owner.undefined != NULL) if (owner && owner->owner.undefined != NULL)
xmlAddChild (ret, gnc_owner_to_dom_tree (entry_billto_string, owner)); xmlAddChild (ret, gnc_owner_to_dom_tree (entry_billto_string, owner));
xmlAddChild(ret, int_to_dom_tree(entry_btaxable_string,
gncEntryGetBillTaxable (entry)));
xmlAddChild(ret, int_to_dom_tree(entry_btaxincluded_string,
gncEntryGetBillTaxIncluded (entry)));
} }
taxtable = gncEntryGetBillTaxTable (entry);
if (taxtable)
xmlAddChild (ret, guid_to_dom_tree (entry_btaxtable_string,
gncTaxTableGetGUID (taxtable)));
/* Other stuff */
order = gncEntryGetOrder (entry);
if (order)
xmlAddChild (ret, guid_to_dom_tree (entry_order_string,
gncOrderGetGUID (order)));
return ret; return ret;
} }
@@ -254,6 +286,27 @@ set_account(xmlNodePtr node, struct entry_pdata *pdata,
return TRUE; return TRUE;
} }
static gboolean
set_taxtable (xmlNodePtr node, struct entry_pdata *pdata,
void (*func)(GncEntry *entry, GncTaxTable *taxtable))
{
GUID *guid;
GncTaxTable *taxtable;
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
taxtable = gncTaxTableLookup (pdata->book, guid);
if (!taxtable) {
taxtable = gncTaxTableCreate (pdata->book);
gncTaxTableSetGUID (taxtable, guid);
} else
gncTaxTableDecRef (taxtable);
func (pdata->entry, taxtable);
g_free(guid);
return TRUE;
}
static gboolean static gboolean
entry_guid_handler (xmlNodePtr node, gpointer entry_pdata) entry_guid_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
@@ -324,24 +377,33 @@ entry_qty_handler (xmlNodePtr node, gpointer entry_pdata)
return set_numeric(node, pdata->entry, gncEntrySetQuantity); return set_numeric(node, pdata->entry, gncEntrySetQuantity);
} }
/* Cust invoice */
static gboolean static gboolean
entry_price_handler (xmlNodePtr node, gpointer entry_pdata) entry_invacct_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
return set_account (node, pdata, gncEntrySetInvAccount);
return set_numeric(node, pdata->entry, gncEntrySetPrice);
} }
static gboolean static gboolean
entry_discount_handler (xmlNodePtr node, gpointer entry_pdata) entry_iprice_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
return set_numeric(node, pdata->entry, gncEntrySetDiscount); return set_numeric(node, pdata->entry, gncEntrySetInvPrice);
} }
static gboolean static gboolean
entry_disctype_handler (xmlNodePtr node, gpointer entry_pdata) entry_idiscount_handler (xmlNodePtr node, gpointer entry_pdata)
{
struct entry_pdata *pdata = entry_pdata;
return set_numeric(node, pdata->entry, gncEntrySetInvDiscount);
}
static gboolean
entry_idisctype_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
GncAmountType type; GncAmountType type;
@@ -355,13 +417,13 @@ entry_disctype_handler (xmlNodePtr node, gpointer entry_pdata)
g_free (str); g_free (str);
if (ret) if (ret)
gncEntrySetDiscountType(pdata->entry, type); gncEntrySetInvDiscountType(pdata->entry, type);
return ret; return ret;
} }
static gboolean static gboolean
entry_dischow_handler (xmlNodePtr node, gpointer entry_pdata) entry_idischow_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
GncDiscountHow how; GncDiscountHow how;
@@ -375,29 +437,34 @@ entry_dischow_handler (xmlNodePtr node, gpointer entry_pdata)
g_free (str); g_free (str);
if (ret) if (ret)
gncEntrySetDiscountHow(pdata->entry, how); gncEntrySetInvDiscountHow(pdata->entry, how);
return ret; return ret;
} }
static gboolean static gboolean
entry_acct_handler (xmlNodePtr node, gpointer entry_pdata) entry_itaxable_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
/* XXX: try to figure out if this is an 'invoice' or a 'bill' -- return set_boolean (node, pdata->entry, gncEntrySetInvTaxable);
* we have to wait until the end!
*/
return set_account (node, pdata, NULL);
} }
static gboolean static gboolean
entry_invacct_handler (xmlNodePtr node, gpointer entry_pdata) entry_itaxincluded_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
return set_account (node, pdata, gncEntrySetInvAccount); return set_boolean (node, pdata->entry, gncEntrySetInvTaxIncluded);
} }
static gboolean
entry_itaxtable_handler (xmlNodePtr node, gpointer entry_pdata)
{
struct entry_pdata *pdata = entry_pdata;
return set_taxtable (node, pdata, gncEntrySetInvTaxTable);
}
/* vendor bills */
static gboolean static gboolean
entry_billacct_handler (xmlNodePtr node, gpointer entry_pdata) entry_billacct_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
@@ -406,40 +473,57 @@ entry_billacct_handler (xmlNodePtr node, gpointer entry_pdata)
} }
static gboolean static gboolean
entry_taxable_handler (xmlNodePtr node, gpointer entry_pdata) entry_bprice_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
return set_boolean (node, pdata->entry, gncEntrySetTaxable);
return set_numeric(node, pdata->entry, gncEntrySetBillPrice);
} }
static gboolean static gboolean
entry_taxincluded_handler (xmlNodePtr node, gpointer entry_pdata) entry_btaxable_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
return set_boolean (node, pdata->entry, gncEntrySetTaxIncluded); return set_boolean (node, pdata->entry, gncEntrySetBillTaxable);
} }
static gboolean static gboolean
entry_taxtable_handler (xmlNodePtr node, gpointer entry_pdata) entry_btaxincluded_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
GUID *guid; return set_boolean (node, pdata->entry, gncEntrySetBillTaxIncluded);
GncTaxTable *taxtable;
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
taxtable = gncTaxTableLookup (pdata->book, guid);
if (!taxtable) {
taxtable = gncTaxTableCreate (pdata->book);
gncTaxTableSetGUID (taxtable, guid);
} else
gncTaxTableDecRef (taxtable);
gncEntrySetTaxTable (pdata->entry, taxtable);
g_free(guid);
return TRUE;
} }
static gboolean
entry_btaxtable_handler (xmlNodePtr node, gpointer entry_pdata)
{
struct entry_pdata *pdata = entry_pdata;
return set_taxtable (node, pdata, gncEntrySetBillTaxTable);
}
static gboolean
entry_billable_handler (xmlNodePtr node, gpointer entry_pdata)
{
struct entry_pdata *pdata = entry_pdata;
return set_boolean (node, pdata->entry, gncEntrySetBillable);
}
static gboolean
entry_billto_handler (xmlNodePtr node, gpointer entry_pdata)
{
struct entry_pdata *pdata = entry_pdata;
GncOwner billto;
gboolean ret;
ret = gnc_dom_tree_to_owner (node, &billto, pdata->book);
if (ret)
gncEntrySetBillTo (pdata->entry, &billto);
return ret;
}
/* The rest of the stuff */
static gboolean static gboolean
entry_order_handler (xmlNodePtr node, gpointer entry_pdata) entry_order_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
@@ -503,25 +587,30 @@ entry_bill_handler (xmlNodePtr node, gpointer entry_pdata)
return TRUE; return TRUE;
} }
/* Support for older XML versions */
static gboolean static gboolean
entry_billable_handler (xmlNodePtr node, gpointer entry_pdata) entry_acct_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
return set_boolean (node, pdata->entry, gncEntrySetBillable); /* XXX: try to figure out if this is an 'invoice' or a 'bill' --
* we have to wait until the end!
*/
return set_account (node, pdata, NULL);
} }
static gboolean static gboolean
entry_billto_handler (xmlNodePtr node, gpointer entry_pdata) entry_price_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
struct entry_pdata *pdata = entry_pdata; struct entry_pdata *pdata = entry_pdata;
GncOwner billto; gboolean res;
gboolean ret;
ret = gnc_dom_tree_to_owner (node, &billto, pdata->book); /* just set both.. Don't worry about extra data if it's wrong */
if (ret) res = set_numeric(node, pdata->entry, gncEntrySetInvPrice);
gncEntrySetBillTo (pdata->entry, &billto); if (res)
gncEntrySetBillPrice (pdata->entry, gncEntryGetInvPrice (pdata->entry));
return ret; return res;
} }
static struct dom_tree_handler entry_handlers_v2[] = { static struct dom_tree_handler entry_handlers_v2[] = {
@@ -532,21 +621,40 @@ static struct dom_tree_handler entry_handlers_v2[] = {
{ entry_action_string, entry_action_handler, 0, 0 }, { entry_action_string, entry_action_handler, 0, 0 },
{ entry_notes_string, entry_notes_handler, 0, 0 }, { entry_notes_string, entry_notes_handler, 0, 0 },
{ entry_qty_string, entry_qty_handler, 0, 0 }, { entry_qty_string, entry_qty_handler, 0, 0 },
{ entry_price_string, entry_price_handler, 0, 0 },
{ entry_discount_string, entry_discount_handler, 0, 0 }, /* cust invoice */
{ entry_disctype_string, entry_disctype_handler, 0, 0 },
{ entry_dischow_string, entry_dischow_handler, 0, 0 },
{ "entry:acct", entry_acct_handler, 0, 0 },
{ entry_invacct_string, entry_invacct_handler, 0, 0 }, { entry_invacct_string, entry_invacct_handler, 0, 0 },
{ entry_iprice_string, entry_iprice_handler, 0, 0 },
{ entry_idiscount_string, entry_idiscount_handler, 0, 0 },
{ entry_idisctype_string, entry_idisctype_handler, 0, 0 },
{ entry_idischow_string, entry_idischow_handler, 0, 0 },
{ entry_itaxable_string, entry_itaxable_handler, 0, 0 },
{ entry_itaxincluded_string, entry_itaxincluded_handler, 0, 0 },
{ entry_itaxtable_string, entry_itaxtable_handler, 0, 0 },
/* vendor invoice */
{ entry_billacct_string, entry_billacct_handler, 0, 0 }, { entry_billacct_string, entry_billacct_handler, 0, 0 },
{ entry_taxable_string, entry_taxable_handler, 0, 0 }, { entry_bprice_string, entry_bprice_handler, 0, 0 },
{ entry_taxincluded_string, entry_taxincluded_handler, 0, 0 }, { entry_btaxable_string, entry_btaxable_handler, 0, 0 },
{ entry_taxtable_string, entry_taxtable_handler, 0, 0 }, { entry_btaxincluded_string, entry_btaxincluded_handler, 0, 0 },
{ entry_btaxtable_string, entry_btaxtable_handler, 0, 0 },
{ entry_billable_string, entry_billable_handler, 0, 0 },
{ entry_billto_string, entry_billto_handler, 0, 0 },
/* Other stuff */
{ entry_order_string, entry_order_handler, 0, 0 }, { entry_order_string, entry_order_handler, 0, 0 },
{ entry_invoice_string, entry_invoice_handler, 0, 0 }, { entry_invoice_string, entry_invoice_handler, 0, 0 },
{ entry_bill_string, entry_bill_handler, 0, 0 }, { entry_bill_string, entry_bill_handler, 0, 0 },
{ entry_billable_string, entry_billable_handler, 0, 0 },
{ entry_billto_string, entry_billto_handler, 0, 0 }, /* Old XML support */
{ "entry:acct", entry_acct_handler, 0, 0 },
{ "entry:price", entry_price_handler, 0, 0 },
{ "entry:discount", entry_idiscount_handler, 0, 0 },
{ "entry:disc-type", entry_idisctype_handler, 0, 0 },
{ "entry:disc-how", entry_idischow_handler, 0, 0 },
{ "entry:taxable", entry_itaxable_handler, 0, 0 },
{ "entry:taxincluded", entry_itaxincluded_handler, 0, 0 },
{ "entry:taxtable", entry_itaxtable_handler, 0, 0 },
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
}; };

View File

@@ -32,17 +32,23 @@ struct _gncEntry {
char * action; char * action;
char * notes; char * notes;
gnc_numeric quantity; gnc_numeric quantity;
gnc_numeric price;
gnc_numeric discount;
GncAmountType disc_type;
GncDiscountHow disc_how;
Account * invaccount;
Account * bilaccount;
gboolean taxable; /* customer invoice data */
gboolean taxincluded; Account * i_account;
GncTaxTable * tax_table; gnc_numeric i_price;
gboolean i_taxable;
gboolean i_taxincluded;
GncTaxTable * i_tax_table;
gnc_numeric i_discount;
GncAmountType i_disc_type;
GncDiscountHow i_disc_how;
/* vendor bill data */
Account * b_account;
gnc_numeric b_price;
gboolean b_taxable;
gboolean b_taxincluded;
GncTaxTable * b_tax_table;
gboolean billable; gboolean billable;
GncOwner billto; GncOwner billto;
@@ -50,17 +56,29 @@ struct _gncEntry {
GncInvoice * invoice; GncInvoice * invoice;
GncInvoice * bill; GncInvoice * bill;
gnc_numeric value;
gnc_numeric value_rounded;
GList * tax_values;
gnc_numeric tax_value;
gnc_numeric tax_value_rounded;
gnc_numeric disc_value;
gnc_numeric disc_value_rounded;
gboolean values_dirty;
Timespec taxtable_modtime;
gboolean dirty; gboolean dirty;
/* CACHED VALUES */
gboolean values_dirty;
/* customer invoice */
gnc_numeric i_value;
gnc_numeric i_value_rounded;
GList * i_tax_values;
gnc_numeric i_tax_value;
gnc_numeric i_tax_value_rounded;
gnc_numeric i_disc_value;
gnc_numeric i_disc_value_rounded;
Timespec i_taxtable_modtime;
/* vendor bill */
gnc_numeric b_value;
gnc_numeric b_value_rounded;
GList * b_tax_values;
gnc_numeric b_tax_value;
gnc_numeric b_tax_value_rounded;
Timespec b_taxtable_modtime;
}; };
/* You must edit the functions in this block in tandem. KEEP THEM IN /* You must edit the functions in this block in tandem. KEEP THEM IN
@@ -127,6 +145,7 @@ mark_entry (GncEntry *entry)
GncEntry *gncEntryCreate (GNCBook *book) GncEntry *gncEntryCreate (GNCBook *book)
{ {
GncEntry *entry; GncEntry *entry;
gnc_numeric zero = gnc_numeric_zero ();
if (!book) return NULL; if (!book) return NULL;
@@ -136,20 +155,20 @@ GncEntry *gncEntryCreate (GNCBook *book)
entry->desc = CACHE_INSERT (""); entry->desc = CACHE_INSERT ("");
entry->action = CACHE_INSERT (""); entry->action = CACHE_INSERT ("");
entry->notes = CACHE_INSERT (""); entry->notes = CACHE_INSERT ("");
entry->quantity = zero;
{ entry->i_price = zero;
gnc_numeric zero = gnc_numeric_zero (); entry->i_taxable = TRUE;
entry->quantity = zero; entry->i_discount = zero;
entry->price = zero; entry->i_disc_type = GNC_AMT_TYPE_PERCENT;
entry->discount = zero; entry->i_disc_how = GNC_DISC_PRETAX;
}
entry->disc_type = GNC_AMT_TYPE_PERCENT; entry->b_price = zero;
entry->disc_how = GNC_DISC_PRETAX; entry->b_taxable = TRUE;
entry->taxable = TRUE;
entry->dirty = FALSE;
entry->values_dirty = TRUE;
entry->billto.type = GNC_OWNER_CUSTOMER; entry->billto.type = GNC_OWNER_CUSTOMER;
entry->values_dirty = TRUE;
xaccGUIDNew (&entry->guid, book); xaccGUIDNew (&entry->guid, book);
addObj (entry); addObj (entry);
@@ -167,8 +186,10 @@ void gncEntryDestroy (GncEntry *entry)
CACHE_REMOVE (entry->desc); CACHE_REMOVE (entry->desc);
CACHE_REMOVE (entry->action); CACHE_REMOVE (entry->action);
CACHE_REMOVE (entry->notes); CACHE_REMOVE (entry->notes);
if (entry->tax_values) if (entry->i_tax_values)
gncAccountValueDestroy (entry->tax_values); gncAccountValueDestroy (entry->i_tax_values);
if (entry->b_tax_values)
gncAccountValueDestroy (entry->b_tax_values);
remObj (entry); remObj (entry);
g_free (entry); g_free (entry);
@@ -232,37 +253,150 @@ void gncEntrySetQuantity (GncEntry *entry, gnc_numeric quantity)
mark_entry (entry); mark_entry (entry);
} }
void gncEntrySetPrice (GncEntry *entry, gnc_numeric price) /* Customer Invoices */
{
if (!entry) return;
if (gnc_numeric_eq (entry->price, price)) return;
entry->price = price;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetDiscount (GncEntry *entry, gnc_numeric discount)
{
if (!entry) return;
if (gnc_numeric_eq (entry->discount, discount)) return;
entry->discount = discount;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetInvAccount (GncEntry *entry, Account *acc) void gncEntrySetInvAccount (GncEntry *entry, Account *acc)
{ {
if (!entry) return; if (!entry) return;
if (entry->invaccount == acc) return; if (entry->i_account == acc) return;
entry->invaccount = acc; entry->i_account = acc;
mark_entry (entry); mark_entry (entry);
} }
void gncEntrySetInvPrice (GncEntry *entry, gnc_numeric price)
{
if (!entry) return;
if (gnc_numeric_eq (entry->i_price, price)) return;
entry->i_price = price;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetInvTaxable (GncEntry *entry, gboolean taxable)
{
if (!entry) return;
if (entry->i_taxable == taxable) return;
entry->i_taxable = taxable;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetInvTaxIncluded (GncEntry *entry, gboolean taxincluded)
{
if (!entry) return;
if (entry->i_taxincluded == taxincluded) return;
entry->i_taxincluded = taxincluded;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetInvTaxTable (GncEntry *entry, GncTaxTable *table)
{
if (!entry) return;
if (entry->i_tax_table == table) return;
if (entry->i_tax_table)
gncTaxTableDecRef (entry->i_tax_table);
if (table)
gncTaxTableIncRef (table);
entry->i_tax_table = table;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetInvDiscount (GncEntry *entry, gnc_numeric discount)
{
if (!entry) return;
if (gnc_numeric_eq (entry->i_discount, discount)) return;
entry->i_discount = discount;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetInvDiscountType (GncEntry *entry, GncAmountType type)
{
if (!entry) return;
if (entry->i_disc_type == type) return;
entry->i_disc_type = type;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetInvDiscountHow (GncEntry *entry, GncDiscountHow how)
{
if (!entry) return;
if (entry->i_disc_how == how) return;
entry->i_disc_how = how;
entry->values_dirty = TRUE;
mark_entry (entry);
}
/* Vendor Bills */
void gncEntrySetBillAccount (GncEntry *entry, Account *acc) void gncEntrySetBillAccount (GncEntry *entry, Account *acc)
{ {
if (!entry) return; if (!entry) return;
if (entry->bilaccount == acc) return; if (entry->b_account == acc) return;
entry->bilaccount = acc; entry->b_account = acc;
mark_entry (entry);
}
void gncEntrySetBillPrice (GncEntry *entry, gnc_numeric price)
{
if (!entry) return;
if (gnc_numeric_eq (entry->b_price, price)) return;
entry->b_price = price;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetBillTaxable (GncEntry *entry, gboolean taxable)
{
if (!entry) return;
if (entry->b_taxable == taxable) return;
entry->b_taxable = taxable;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetBillTaxIncluded (GncEntry *entry, gboolean taxincluded)
{
if (!entry) return;
if (entry->b_taxincluded == taxincluded) return;
entry->b_taxincluded = taxincluded;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetBillTaxTable (GncEntry *entry, GncTaxTable *table)
{
if (!entry) return;
if (entry->b_tax_table == table) return;
if (entry->b_tax_table)
gncTaxTableDecRef (entry->b_tax_table);
if (table)
gncTaxTableIncRef (table);
entry->b_tax_table = table;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetBillable (GncEntry *entry, gboolean billable)
{
if (!entry) return;
if (entry->billable == billable) return;
entry->billable = billable;
mark_entry (entry);
}
void gncEntrySetBillTo (GncEntry *entry, GncOwner *billto)
{
if (!entry || !billto) return;
if (gncOwnerEqual (&entry->billto, billto)) return;
gncOwnerCopy (billto, &entry->billto);
mark_entry (entry); mark_entry (entry);
} }
@@ -297,75 +431,6 @@ void gncEntrySetBill (GncEntry *entry, GncInvoice *bill)
mark_entry (entry); mark_entry (entry);
} }
void gncEntrySetTaxable (GncEntry *entry, gboolean taxable)
{
if (!entry) return;
if (entry->taxable == taxable) return;
entry->taxable = taxable;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetTaxIncluded (GncEntry *entry, gboolean taxincluded)
{
if (!entry) return;
if (entry->taxincluded == taxincluded) return;
entry->taxincluded = taxincluded;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetTaxTable (GncEntry *entry, GncTaxTable *table)
{
if (!entry) return;
if (entry->tax_table == table) return;
if (entry->tax_table)
gncTaxTableDecRef (entry->tax_table);
if (table)
gncTaxTableIncRef (table);
entry->tax_table = table;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetDiscountType (GncEntry *entry, GncAmountType type)
{
if (!entry) return;
if (entry->disc_type == type) return;
entry->disc_type = type;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetDiscountHow (GncEntry *entry, GncDiscountHow how)
{
if (!entry) return;
if (entry->disc_how == how) return;
entry->disc_how = how;
entry->values_dirty = TRUE;
mark_entry (entry);
}
void gncEntrySetBillable (GncEntry *entry, gboolean billable)
{
if (!entry) return;
if (entry->billable == billable) return;
entry->billable = billable;
mark_entry (entry);
}
void gncEntrySetBillTo (GncEntry *entry, GncOwner *billto)
{
if (!entry || !billto) return;
if (gncOwnerEqual (&entry->billto, billto)) return;
gncOwnerCopy (billto, &entry->billto);
mark_entry (entry);
}
void gncEntrySetDirty (GncEntry *entry, gboolean dirty) void gncEntrySetDirty (GncEntry *entry, gboolean dirty)
{ {
if (!entry) return; if (!entry) return;
@@ -382,18 +447,28 @@ void gncEntryCopy (const GncEntry *src, GncEntry *dest)
gncEntrySetAction (dest, src->action); gncEntrySetAction (dest, src->action);
gncEntrySetNotes (dest, src->notes); gncEntrySetNotes (dest, src->notes);
dest->quantity = src->quantity; dest->quantity = src->quantity;
dest->price = src->price;
dest->discount = src->discount; dest->i_account = src->i_account;
dest->disc_type = src->disc_type; dest->i_price = src->i_price;
dest->invaccount = src->invaccount; dest->i_taxable = src->i_taxable;
dest->bilaccount = src->bilaccount; dest->i_taxincluded = src->i_taxincluded;
dest->taxable = src->taxable; dest->i_discount = src->i_discount;
dest->taxincluded = src->taxincluded; dest->i_disc_type = src->i_disc_type;
dest->i_disc_how = src->i_disc_how;
/* vendor bill data */
dest->b_account = src->b_account;
dest->b_price = src->b_price;
dest->b_taxable = src->b_taxable;
dest->b_taxincluded = src->b_taxincluded;
dest->billable = src->billable; dest->billable = src->billable;
dest->billto = src->billto; dest->billto = src->billto;
if (src->tax_table) if (src->i_tax_table)
gncEntrySetTaxTable (dest, src->tax_table); gncEntrySetInvTaxTable (dest, src->i_tax_table);
if (src->b_tax_table)
gncEntrySetBillTaxTable (dest, src->b_tax_table);
if (src->order) if (src->order)
gncOrderAddEntry (src->order, dest); gncOrderAddEntry (src->order, dest);
@@ -459,28 +534,98 @@ gnc_numeric gncEntryGetQuantity (GncEntry *entry)
return entry->quantity; return entry->quantity;
} }
gnc_numeric gncEntryGetPrice (GncEntry *entry) /* Customer Invoice */
{
if (!entry) return gnc_numeric_zero();
return entry->price;
}
gnc_numeric gncEntryGetDiscount (GncEntry *entry)
{
if (!entry) return gnc_numeric_zero();
return entry->discount;
}
Account * gncEntryGetInvAccount (GncEntry *entry) Account * gncEntryGetInvAccount (GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->invaccount; return entry->i_account;
} }
gnc_numeric gncEntryGetInvPrice (GncEntry *entry)
{
if (!entry) return gnc_numeric_zero();
return entry->i_price;
}
gnc_numeric gncEntryGetInvDiscount (GncEntry *entry)
{
if (!entry) return gnc_numeric_zero();
return entry->i_discount;
}
GncAmountType gncEntryGetInvDiscountType (GncEntry *entry)
{
if (!entry) return 0;
return entry->i_disc_type;
}
GncDiscountHow gncEntryGetInvDiscountHow (GncEntry *entry)
{
if (!entry) return 0;
return entry->i_disc_how;
}
gboolean gncEntryGetInvTaxable (GncEntry *entry)
{
if (!entry) return FALSE;
return entry->i_taxable;
}
gboolean gncEntryGetInvTaxIncluded (GncEntry *entry)
{
if (!entry) return FALSE;
return entry->i_taxincluded;
}
GncTaxTable * gncEntryGetInvTaxTable (GncEntry *entry)
{
if (!entry) return NULL;
return entry->i_tax_table;
}
/* vendor bills */
Account * gncEntryGetBillAccount (GncEntry *entry) Account * gncEntryGetBillAccount (GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->bilaccount; return entry->b_account;
}
gnc_numeric gncEntryGetBillPrice (GncEntry *entry)
{
if (!entry) return gnc_numeric_zero();
return entry->b_price;
}
gboolean gncEntryGetBillTaxable (GncEntry *entry)
{
if (!entry) return FALSE;
return entry->b_taxable;
}
gboolean gncEntryGetBillTaxIncluded (GncEntry *entry)
{
if (!entry) return FALSE;
return entry->b_taxincluded;
}
GncTaxTable * gncEntryGetBillTaxTable (GncEntry *entry)
{
if (!entry) return NULL;
return entry->b_tax_table;
}
gboolean gncEntryGetBillable (GncEntry *entry)
{
if (!entry) return FALSE;
return entry->billable;
}
GncOwner * gncEntryGetBillTo (GncEntry *entry)
{
if (!entry) return NULL;
return &entry->billto;
} }
GncInvoice * gncEntryGetInvoice (GncEntry *entry) GncInvoice * gncEntryGetInvoice (GncEntry *entry)
@@ -501,48 +646,6 @@ GncOrder * gncEntryGetOrder (GncEntry *entry)
return entry->order; return entry->order;
} }
GncAmountType gncEntryGetDiscountType (GncEntry *entry)
{
if (!entry) return 0;
return entry->disc_type;
}
GncDiscountHow gncEntryGetDiscountHow (GncEntry *entry)
{
if (!entry) return 0;
return entry->disc_how;
}
gboolean gncEntryGetTaxable (GncEntry *entry)
{
if (!entry) return FALSE;
return entry->taxable;
}
gboolean gncEntryGetTaxIncluded (GncEntry *entry)
{
if (!entry) return FALSE;
return entry->taxincluded;
}
GncTaxTable * gncEntryGetTaxTable (GncEntry *entry)
{
if (!entry) return NULL;
return entry->tax_table;
}
gboolean gncEntryGetBillable (GncEntry *entry)
{
if (!entry) return FALSE;
return entry->billable;
}
GncOwner * gncEntryGetBillTo (GncEntry *entry)
{
if (!entry) return NULL;
return &entry->billto;
}
GncEntry * gncEntryLookup (GNCBook *book, const GUID *guid) GncEntry * gncEntryLookup (GNCBook *book, const GUID *guid)
{ {
if (!book || !guid) return NULL; if (!book || !guid) return NULL;
@@ -775,84 +878,110 @@ gncEntryRecomputeValues (GncEntry *entry)
{ {
int denom; int denom;
/* See if the tax table changed since we last computed values */ /* See if either tax table changed since we last computed values */
if (entry->tax_table) { if (entry->i_tax_table) {
Timespec modtime = gncTaxTableLastModified (entry->tax_table); Timespec modtime = gncTaxTableLastModified (entry->i_tax_table);
if (timespec_cmp (&entry->taxtable_modtime, &modtime)) { if (timespec_cmp (&entry->i_taxtable_modtime, &modtime)) {
entry->values_dirty = TRUE; entry->values_dirty = TRUE;
entry->taxtable_modtime = modtime; entry->i_taxtable_modtime = modtime;
}
}
if (entry->b_tax_table) {
Timespec modtime = gncTaxTableLastModified (entry->b_tax_table);
if (timespec_cmp (&entry->b_taxtable_modtime, &modtime)) {
entry->values_dirty = TRUE;
entry->b_taxtable_modtime = modtime;
} }
} }
if (!entry->values_dirty) if (!entry->values_dirty)
return; return;
if (entry->tax_values) { /* Clear the last-computed tax values */
gncAccountValueDestroy (entry->tax_values); if (entry->i_tax_values) {
entry->tax_values = NULL; gncAccountValueDestroy (entry->i_tax_values);
entry->i_tax_values = NULL;
}
if (entry->b_tax_values) {
gncAccountValueDestroy (entry->b_tax_values);
entry->b_tax_values = NULL;
} }
gncEntryComputeValue (entry->quantity, entry->price, /* Compute the invoice values */
(entry->taxable ? entry->tax_table : NULL), gncEntryComputeValue (entry->quantity, entry->i_price,
entry->taxincluded, (entry->i_taxable ? entry->i_tax_table : NULL),
entry->discount, entry->disc_type, entry->i_taxincluded,
entry->disc_how, entry->i_discount, entry->i_disc_type,
&(entry->value), &(entry->disc_value), entry->i_disc_how,
&(entry->tax_values)); &(entry->i_value), &(entry->i_disc_value),
&(entry->i_tax_values));
/* Compute the bill values */
gncEntryComputeValue (entry->quantity, entry->b_price,
(entry->b_taxable ? entry->b_tax_table : NULL),
entry->b_taxincluded,
gnc_numeric_zero(), GNC_AMT_TYPE_VALUE, GNC_DISC_PRETAX,
&(entry->b_value), NULL, &(entry->b_tax_values));
denom = get_commodity_denom (entry); denom = get_commodity_denom (entry);
entry->value_rounded = gnc_numeric_convert (entry->value, denom, entry->i_value_rounded = gnc_numeric_convert (entry->i_value, denom,
GNC_RND_ROUND); GNC_RND_ROUND);
entry->disc_value_rounded = gnc_numeric_convert (entry->disc_value, denom, entry->i_disc_value_rounded = gnc_numeric_convert (entry->i_disc_value, denom,
GNC_RND_ROUND); GNC_RND_ROUND);
entry->tax_value = gncAccountValueTotal (entry->tax_values); entry->i_tax_value = gncAccountValueTotal (entry->i_tax_values);
entry->tax_value_rounded = gnc_numeric_convert (entry->tax_value, denom, entry->i_tax_value_rounded = gnc_numeric_convert (entry->i_tax_value, denom,
GNC_RND_ROUND); GNC_RND_ROUND);
entry->b_value_rounded = gnc_numeric_convert (entry->b_value, denom,
GNC_RND_ROUND);
entry->b_tax_value = gncAccountValueTotal (entry->b_tax_values);
entry->b_tax_value_rounded = gnc_numeric_convert (entry->b_tax_value, denom,
GNC_RND_ROUND);
entry->values_dirty = FALSE; entry->values_dirty = FALSE;
} }
void gncEntryGetValue (GncEntry *entry, gnc_numeric *value, void gncEntryGetValue (GncEntry *entry, gboolean is_inv, gnc_numeric *value,
gnc_numeric *discount_value, gnc_numeric *tax_value, gnc_numeric *discount_value, gnc_numeric *tax_value,
GList **tax_values) GList **tax_values)
{ {
if (!entry) return; if (!entry) return;
gncEntryRecomputeValues (entry); gncEntryRecomputeValues (entry);
if (value) if (value)
*value = entry->value; *value = (is_inv ? entry->i_value : entry->b_value);
if (discount_value) if (discount_value)
*discount_value = entry->disc_value; *discount_value = (is_inv ? entry->i_disc_value : gnc_numeric_zero());
if (tax_value) if (tax_value)
*tax_value = entry->tax_value; *tax_value = (is_inv ? entry->i_tax_value : entry->b_tax_value);
if (tax_values) if (tax_values)
*tax_values = entry->tax_values; *tax_values = (is_inv ? entry->i_tax_values : entry->b_tax_values);
} }
gnc_numeric gncEntryReturnValue (GncEntry *entry) gnc_numeric gncEntryReturnValue (GncEntry *entry, gboolean is_inv)
{ {
if (!entry) return gnc_numeric_zero(); if (!entry) return gnc_numeric_zero();
gncEntryRecomputeValues (entry); gncEntryRecomputeValues (entry);
return entry->value_rounded; return (is_inv ? entry->i_value_rounded : entry->b_value_rounded);
} }
gnc_numeric gncEntryReturnTaxValue (GncEntry *entry) gnc_numeric gncEntryReturnTaxValue (GncEntry *entry, gboolean is_inv)
{ {
if (!entry) return gnc_numeric_zero(); if (!entry) return gnc_numeric_zero();
gncEntryRecomputeValues (entry); gncEntryRecomputeValues (entry);
return entry->tax_value_rounded; return (is_inv ? entry->i_tax_value_rounded : entry->b_tax_value_rounded);
} }
GList * gncEntryReturnTaxValues (GncEntry *entry) GList * gncEntryReturnTaxValues (GncEntry *entry, gboolean is_inv)
{ {
if (!entry) return NULL; if (!entry) return NULL;
gncEntryRecomputeValues (entry); gncEntryRecomputeValues (entry);
return entry->tax_values; return (is_inv ? entry->i_tax_values : entry->b_tax_values);
} }
gnc_numeric gncEntryReturnDiscountValue (GncEntry *entry) gnc_numeric gncEntryReturnDiscountValue (GncEntry *entry, gboolean is_inv)
{ {
if (!entry) return gnc_numeric_zero(); if (!entry) return gnc_numeric_zero();
gncEntryRecomputeValues (entry); gncEntryRecomputeValues (entry);
return entry->disc_value_rounded; return (is_inv ? entry->i_disc_value_rounded : gnc_numeric_zero());
} }
void gncEntryCommitEdit (GncEntry *entry) void gncEntryCommitEdit (GncEntry *entry)
@@ -946,7 +1075,8 @@ gboolean gncEntryRegister (void)
{ ENTRY_ACTION, QUERYCORE_STRING, (QueryAccess)gncEntryGetAction }, { ENTRY_ACTION, QUERYCORE_STRING, (QueryAccess)gncEntryGetAction },
{ ENTRY_NOTES, QUERYCORE_STRING, (QueryAccess)gncEntryGetNotes }, { ENTRY_NOTES, QUERYCORE_STRING, (QueryAccess)gncEntryGetNotes },
{ ENTRY_QTY, QUERYCORE_NUMERIC, (QueryAccess)gncEntryGetQuantity }, { ENTRY_QTY, QUERYCORE_NUMERIC, (QueryAccess)gncEntryGetQuantity },
{ ENTRY_PRICE, QUERYCORE_NUMERIC, (QueryAccess)gncEntryGetPrice }, { ENTRY_IPRICE, QUERYCORE_NUMERIC, (QueryAccess)gncEntryGetInvPrice },
{ ENTRY_BPRICE, QUERYCORE_NUMERIC, (QueryAccess)gncEntryGetBillPrice },
{ ENTRY_INVOICE, GNC_INVOICE_MODULE_NAME, (QueryAccess)gncEntryGetInvoice }, { ENTRY_INVOICE, GNC_INVOICE_MODULE_NAME, (QueryAccess)gncEntryGetInvoice },
{ ENTRY_BILL, GNC_INVOICE_MODULE_NAME, (QueryAccess)gncEntryGetBill }, { ENTRY_BILL, GNC_INVOICE_MODULE_NAME, (QueryAccess)gncEntryGetBill },
{ ENTRY_BILLABLE, QUERYCORE_BOOLEAN, (QueryAccess)gncEntryGetBillable }, { ENTRY_BILLABLE, QUERYCORE_BOOLEAN, (QueryAccess)gncEntryGetBillable },

View File

@@ -40,29 +40,37 @@ gboolean gncEntryDiscountStringToHow (const char *str, GncDiscountHow *how);
GncEntry *gncEntryCreate (GNCBook *book); GncEntry *gncEntryCreate (GNCBook *book);
void gncEntryDestroy (GncEntry *entry); void gncEntryDestroy (GncEntry *entry);
/* Set Functions */ /* SET FUNCTIONS */
/* Generic (shared) data */
void gncEntrySetDate (GncEntry *entry, Timespec date); void gncEntrySetDate (GncEntry *entry, Timespec date);
void gncEntrySetDateEntered (GncEntry *entry, Timespec date); void gncEntrySetDateEntered (GncEntry *entry, Timespec date);
void gncEntrySetDescription (GncEntry *entry, const char *desc); void gncEntrySetDescription (GncEntry *entry, const char *desc);
void gncEntrySetAction (GncEntry *entry, const char *action); void gncEntrySetAction (GncEntry *entry, const char *action);
void gncEntrySetNotes (GncEntry *entry, const char *notes); void gncEntrySetNotes (GncEntry *entry, const char *notes);
void gncEntrySetQuantity (GncEntry *entry, gnc_numeric quantity); void gncEntrySetQuantity (GncEntry *entry, gnc_numeric quantity);
void gncEntrySetPrice (GncEntry *entry, gnc_numeric price);
void gncEntrySetDiscount (GncEntry *entry, gnc_numeric discount); /* Customer Invoices */
void gncEntrySetDiscountType (GncEntry *entry, GncAmountType type); void gncEntrySetInvAccount (GncEntry *entry, Account *acc);
void gncEntrySetDiscountHow (GncEntry *entry, GncDiscountHow how); void gncEntrySetInvPrice (GncEntry *entry, gnc_numeric price);
void gncEntrySetTaxable (GncEntry *entry, gboolean taxable); void gncEntrySetInvTaxable (GncEntry *entry, gboolean taxable);
void gncEntrySetTaxIncluded (GncEntry *entry, gboolean tax_included); void gncEntrySetInvTaxIncluded (GncEntry *entry, gboolean tax_included);
void gncEntrySetTaxTable (GncEntry *entry, GncTaxTable *table); void gncEntrySetInvTaxTable (GncEntry *entry, GncTaxTable *table);
void gncEntrySetInvDiscount (GncEntry *entry, gnc_numeric discount);
void gncEntrySetInvDiscountType (GncEntry *entry, GncAmountType type);
void gncEntrySetInvDiscountHow (GncEntry *entry, GncDiscountHow how);
/* Vendor Bills (and Employee Expenses) */
void gncEntrySetBillAccount (GncEntry *entry, Account *acc);
void gncEntrySetBillPrice (GncEntry *entry, gnc_numeric price);
void gncEntrySetBillTaxable (GncEntry *entry, gboolean taxable);
void gncEntrySetBillTaxIncluded (GncEntry *entry, gboolean tax_included);
void gncEntrySetBillTaxTable (GncEntry *entry, GncTaxTable *table);
void gncEntrySetBillable (GncEntry *entry, gboolean billable); void gncEntrySetBillable (GncEntry *entry, gboolean billable);
void gncEntrySetBillTo (GncEntry *entry, GncOwner *billto); void gncEntrySetBillTo (GncEntry *entry, GncOwner *billto);
void gncEntrySetInvAccount (GncEntry *entry, Account *acc); /* GET FUNCTIONS */
void gncEntrySetBillAccount (GncEntry *entry, Account *acc); /* Generic (shared) data */
/* Get Functions */
GNCBook * gncEntryGetBook (GncEntry *entry); GNCBook * gncEntryGetBook (GncEntry *entry);
const GUID * gncEntryGetGUID (GncEntry *entry); const GUID * gncEntryGetGUID (GncEntry *entry);
Timespec gncEntryGetDate (GncEntry *entry); Timespec gncEntryGetDate (GncEntry *entry);
@@ -71,26 +79,37 @@ const char * gncEntryGetDescription (GncEntry *entry);
const char * gncEntryGetAction (GncEntry *entry); const char * gncEntryGetAction (GncEntry *entry);
const char * gncEntryGetNotes (GncEntry *notes); const char * gncEntryGetNotes (GncEntry *notes);
gnc_numeric gncEntryGetQuantity (GncEntry *entry); gnc_numeric gncEntryGetQuantity (GncEntry *entry);
gnc_numeric gncEntryGetPrice (GncEntry *entry);
gnc_numeric gncEntryGetDiscount (GncEntry *entry); /* Customer Invoices */
GncAmountType gncEntryGetDiscountType (GncEntry *entry); Account * gncEntryGetInvAccount (GncEntry *entry);
GncDiscountHow gncEntryGetDiscountHow (GncEntry *entry); gnc_numeric gncEntryGetInvPrice (GncEntry *entry);
gboolean gncEntryGetTaxable (GncEntry *entry); gnc_numeric gncEntryGetInvDiscount (GncEntry *entry);
gboolean gncEntryGetTaxIncluded (GncEntry *entry); GncAmountType gncEntryGetInvDiscountType (GncEntry *entry);
GncTaxTable * gncEntryGetTaxTable (GncEntry *entry); GncDiscountHow gncEntryGetInvDiscountHow (GncEntry *entry);
gboolean gncEntryGetInvTaxable (GncEntry *entry);
gboolean gncEntryGetInvTaxIncluded (GncEntry *entry);
GncTaxTable * gncEntryGetInvTaxTable (GncEntry *entry);
/* Vendor Bills (and Employee Expenses) */
Account * gncEntryGetBillAccount (GncEntry *entry);
gnc_numeric gncEntryGetBillPrice (GncEntry *entry);
gboolean gncEntryGetBillTaxable (GncEntry *entry);
gboolean gncEntryGetBillTaxIncluded (GncEntry *entry);
GncTaxTable * gncEntryGetBillTaxTable (GncEntry *entry);
gboolean gncEntryGetBillable (GncEntry *entry); gboolean gncEntryGetBillable (GncEntry *entry);
GncOwner *gncEntryGetBillTo (GncEntry *entry); GncOwner *gncEntryGetBillTo (GncEntry *entry);
void gncEntryCopy (const GncEntry *src, GncEntry *dest); void gncEntryCopy (const GncEntry *src, GncEntry *dest);
/* The first three return the rounded values -- the last returns the /* The first three return the rounded values -- the last returns the
* list of unrounded account-values. The list belongs to the entry * list of unrounded account-values. The list belongs to the entry
* and will be destroyed, so use it quickly. * and will be destroyed, so use it quickly.
*/ */
gnc_numeric gncEntryReturnValue (GncEntry *entry); gnc_numeric gncEntryReturnValue (GncEntry *entry, gboolean is_inv);
gnc_numeric gncEntryReturnDiscountValue (GncEntry *entry); gnc_numeric gncEntryReturnDiscountValue (GncEntry *entry, gboolean is_inv);
gnc_numeric gncEntryReturnTaxValue (GncEntry *entry); gnc_numeric gncEntryReturnTaxValue (GncEntry *entry, gboolean is_inv);
GList * gncEntryReturnTaxValues (GncEntry *entry); GList * gncEntryReturnTaxValues (GncEntry *entry, gboolean is_inv);
/* Compute the Entry value, tax-value, and discount_value, based on /* Compute the Entry value, tax-value, and discount_value, based on
* the quantity, price, discount, tax-table, and types. The value is * the quantity, price, discount, tax-table, and types. The value is
@@ -101,9 +120,10 @@ GList * gncEntryReturnTaxValues (GncEntry *entry);
* destroyed automatically, so use it quickly. Note that all return * destroyed automatically, so use it quickly. Note that all return
* values from these two functions are NOT rounded. * values from these two functions are NOT rounded.
*/ */
void gncEntryGetValue (GncEntry *entry, gnc_numeric *value, void gncEntryGetValue (GncEntry *entry, gboolean is_inv, gnc_numeric *value,
gnc_numeric *discount, gnc_numeric *tax_value, gnc_numeric *discount, gnc_numeric *tax_value,
GList **tax_values); GList **tax_values);
void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price, void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price,
GncTaxTable *tax_table, gboolean tax_included, GncTaxTable *tax_table, gboolean tax_included,
gnc_numeric discount, GncAmountType discount_type, gnc_numeric discount, GncAmountType discount_type,
@@ -112,9 +132,6 @@ void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price,
gnc_numeric *value, gnc_numeric *discount_value, gnc_numeric *value, gnc_numeric *discount_value,
GList **tax_values); GList **tax_values);
Account * gncEntryGetInvAccount (GncEntry *entry);
Account * gncEntryGetBillAccount (GncEntry *entry);
GncOrder * gncEntryGetOrder (GncEntry *entry); GncOrder * gncEntryGetOrder (GncEntry *entry);
GncInvoice * gncEntryGetInvoice (GncEntry *entry); GncInvoice * gncEntryGetInvoice (GncEntry *entry);
GncInvoice * gncEntryGetBill (GncEntry *entry); GncInvoice * gncEntryGetBill (GncEntry *entry);
@@ -130,7 +147,9 @@ int gncEntryCompare (GncEntry *a, GncEntry *b);
#define ENTRY_ACTION "action" #define ENTRY_ACTION "action"
#define ENTRY_NOTES "notes" #define ENTRY_NOTES "notes"
#define ENTRY_QTY "qty" #define ENTRY_QTY "qty"
#define ENTRY_PRICE "price"
#define ENTRY_IPRICE "iprice"
#define ENTRY_BPRICE "bprice"
#define ENTRY_BILLABLE "billable?" #define ENTRY_BILLABLE "billable?"
#define ENTRY_BILLTO "bill-to" #define ENTRY_BILLTO "bill-to"

View File

@@ -626,12 +626,20 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
Account *this_acc; Account *this_acc;
/* Stabilize the TaxTable in this entry */ /* Stabilize the TaxTable in this entry */
gncEntrySetTaxTable (entry, if (reverse)
gncTaxTableReturnChild (gncEntryGetTaxTable (entry), gncEntrySetInvTaxTable
TRUE)); (entry, gncTaxTableReturnChild (gncEntryGetInvTaxTable (entry), TRUE));
else {
gncEntrySetBillTaxTable
(entry, gncTaxTableReturnChild (gncEntryGetBillTaxTable (entry), TRUE));
/* If this is a bill, and the entry is billable, copy the price */
if (gncEntryGetBillable (entry))
gncEntrySetInvPrice (entry, gncEntryGetBillPrice (entry));
}
/* Obtain the Entry's Value and TaxValues */ /* Obtain the Entry's Value and TaxValues */
gncEntryGetValue (entry, &value, NULL, &tax, &taxes); gncEntryGetValue (entry, reverse, &value, NULL, &tax, &taxes);
/* add the value for the account split */ /* add the value for the account split */
this_acc = (reverse ? gncEntryGetInvAccount (entry) : this_acc = (reverse ? gncEntryGetInvAccount (entry) :

View File

@@ -379,34 +379,42 @@
(gw:wrap-function (gw:wrap-function
ws ws
'gnc:entry-get-price 'gnc:entry-get-inv-price
'<gnc:numeric> '<gnc:numeric>
"gncEntryGetPrice" "gncEntryGetInvPrice"
'((<gnc:GncEntry*> entry)) '((<gnc:GncEntry*> entry))
"Return the Entry's Price") "Return the Entry's Price")
(gw:wrap-function (gw:wrap-function
ws ws
'gnc:entry-get-discount 'gnc:entry-get-inv-discount
'<gnc:numeric> '<gnc:numeric>
"gncEntryGetDiscount" "gncEntryGetInvDiscount"
'((<gnc:GncEntry*> entry)) '((<gnc:GncEntry*> entry))
"Return the Entry's Discount") "Return the Entry's Discount")
(gw:wrap-function (gw:wrap-function
ws ws
'gnc:entry-get-discount-type 'gnc:entry-get-inv-discount-type
'<gw:int> '<gw:int>
"gncEntryGetDiscountType" "gncEntryGetInvDiscountType"
'((<gnc:GncEntry*> entry)) '((<gnc:GncEntry*> entry))
"Return the Entry's discount type") "Return the Entry's discount type")
(gw:wrap-function
ws
'gnc:entry-get-bill-price
'<gnc:numeric>
"gncEntryGetBillPrice"
'((<gnc:GncEntry*> entry))
"Return the Entry's Price")
(gw:wrap-function (gw:wrap-function
ws ws
'gnc:entry-get-value 'gnc:entry-get-value
'<gnc:numeric> '<gnc:numeric>
"gncEntryReturnValue" "gncEntryReturnValue"
'((<gnc:GncEntry*> entry)) '((<gnc:GncEntry*> entry) (<gw:bool> invoice?))
"Return the Entry's computed Value (after discount)") "Return the Entry's computed Value (after discount)")
(gw:wrap-function (gw:wrap-function
@@ -414,7 +422,7 @@
'gnc:entry-get-tax-value 'gnc:entry-get-tax-value
'<gnc:numeric> '<gnc:numeric>
"gncEntryReturnTaxValue" "gncEntryReturnTaxValue"
'((<gnc:GncEntry*> entry)) '((<gnc:GncEntry*> entry) (<gw:bool> invoice?))
"Return the Entry's computed Tax Value") "Return the Entry's computed Tax Value")
(gw:wrap-function (gw:wrap-function
@@ -422,7 +430,7 @@
'gnc:entry-get-discount-value 'gnc:entry-get-discount-value
'<gnc:numeric> '<gnc:numeric>
"gncEntryReturnDiscountValue" "gncEntryReturnDiscountValue"
'((<gnc:GncEntry*> entry)) '((<gnc:GncEntry*> entry) (<gw:bool> invoice?))
"Return the Entry's computed Discount Value") "Return the Entry's computed Discount Value")
(gw:wrap-function (gw:wrap-function

View File

@@ -40,9 +40,17 @@
(gnc:register-configuration-option (gnc:register-configuration-option
(gnc:make-simple-boolean-option (gnc:make-simple-boolean-option
gnc:*business-label* (N_ "Tax Included?") gnc:*business-label* (N_ "Invoice Tax Included?")
"f" (N_ (string-append "f1" (N_ (string-append
"Whether tax is included by default in entries. " "Whether tax is included by default in entries on Invoices. "
"This setting is inherited by new customers and vendors"))
#f))
(gnc:register-configuration-option
(gnc:make-simple-boolean-option
gnc:*business-label* (N_ "Bill Tax Included?")
"f2" (N_ (string-append
"Whether tax is included by default in entries on Bills. "
"This setting is inherited by new customers and vendors")) "This setting is inherited by new customers and vendors"))
#f)) #f))

View File

@@ -699,7 +699,8 @@ gnc_invoice_window_sort (InvoiceWindow *iw, sort_type_t sort_code)
p2 = standard; p2 = standard;
break; break;
case BY_PRICE: case BY_PRICE:
p1 = g_slist_prepend (p1, ENTRY_PRICE); p1 = g_slist_prepend (p1, ((iw->owner.type == GNC_OWNER_CUSTOMER) ?
ENTRY_IPRICE : ENTRY_BPRICE));
p2 = standard; p2 = standard;
break; break;
default: default:

View File

@@ -209,6 +209,21 @@ GncEntryLedger * gnc_entry_ledger_new (GNCBook *book, GncEntryLedgerType type)
ledger->type = type; ledger->type = type;
ledger->book = book; ledger->book = book;
/* Orders and Invoices are "invoices" for lookups */
switch (type) {
case GNCENTRY_ORDER_ENTRY:
case GNCENTRY_ORDER_VIEWER:
case GNCENTRY_INVOICE_ENTRY:
case GNCENTRY_INVOICE_VIEWER:
ledger->is_invoice = TRUE;
break;
case GNCENTRY_BILL_ENTRY:
case GNCENTRY_BILL_VIEWER:
case GNCENTRY_NUM_REGISTER_TYPES:
ledger->is_invoice = FALSE;
break;
}
ledger->blank_entry_guid = *xaccGUIDNULL(); ledger->blank_entry_guid = *xaccGUIDNULL();
ledger->blank_entry_edited = FALSE; ledger->blank_entry_edited = FALSE;

View File

@@ -110,7 +110,7 @@ static void gnc_entry_ledger_layout_add_cursors (GncEntryLedger *ledger,
break; break;
case GNCENTRY_BILL_ENTRY: case GNCENTRY_BILL_ENTRY:
case GNCENTRY_BILL_VIEWER: case GNCENTRY_BILL_VIEWER:
num_cols = 9; num_cols = 12;
break; break;
default: default:
g_assert (FALSE); g_assert (FALSE);
@@ -166,8 +166,11 @@ static void gnc_entry_ledger_set_cells (GncEntryLedger *ledger,
gnc_table_layout_set_cell (layout, curs, ENTRY_BACCT_CELL, 0, 4); gnc_table_layout_set_cell (layout, curs, ENTRY_BACCT_CELL, 0, 4);
gnc_table_layout_set_cell (layout, curs, ENTRY_QTY_CELL, 0, 5); gnc_table_layout_set_cell (layout, curs, ENTRY_QTY_CELL, 0, 5);
gnc_table_layout_set_cell (layout, curs, ENTRY_PRIC_CELL, 0, 6); gnc_table_layout_set_cell (layout, curs, ENTRY_PRIC_CELL, 0, 6);
gnc_table_layout_set_cell (layout, curs, ENTRY_VALUE_CELL, 0, 7); gnc_table_layout_set_cell (layout, curs, ENTRY_TAXABLE_CELL, 0, 7);
gnc_table_layout_set_cell (layout, curs, ENTRY_BILLABLE_CELL, 0, 8); gnc_table_layout_set_cell (layout, curs, ENTRY_TAXINCLUDED_CELL, 0, 8);
gnc_table_layout_set_cell (layout, curs, ENTRY_TAXTABLE_CELL, 0, 9);
gnc_table_layout_set_cell (layout, curs, ENTRY_VALUE_CELL, 0, 10);
gnc_table_layout_set_cell (layout, curs, ENTRY_BILLABLE_CELL, 0, 11);
break; break;

View File

@@ -231,13 +231,20 @@ void gnc_entry_ledger_load (GncEntryLedger *ledger, GList *entry_list)
break; break;
case GNC_TAXINCLUDED_USEGLOBAL: case GNC_TAXINCLUDED_USEGLOBAL:
taxincluded = gnc_lookup_boolean_option ("Business", taxincluded = gnc_lookup_boolean_option ("Business",
"Tax Included?", FALSE); (ledger->is_invoice ?
"Invoice Tax Included?" :
"Bill Tax Included?"), FALSE);
break; break;
} }
gncEntrySetTaxTable (blank_entry, table); if (ledger->is_invoice) {
gncEntrySetTaxIncluded (blank_entry, taxincluded); gncEntrySetInvTaxTable (blank_entry, table);
gncEntrySetDiscount (blank_entry, discount); gncEntrySetInvTaxIncluded (blank_entry, taxincluded);
gncEntrySetInvDiscount (blank_entry, discount);
} else {
gncEntrySetBillTaxTable (blank_entry, table);
gncEntrySetBillTaxIncluded (blank_entry, taxincluded);
}
} }
break; break;
default: default:

View File

@@ -200,7 +200,7 @@ static const char * get_disc_entry (VirtualLocation virt_loc,
gnc_numeric discount; gnc_numeric discount;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc); entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
discount = gncEntryGetDiscount (entry); discount = gncEntryGetInvDiscount (entry);
if (gnc_numeric_zero_p (discount)) if (gnc_numeric_zero_p (discount))
return NULL; return NULL;
@@ -217,7 +217,7 @@ static const char * get_distype_entry (VirtualLocation virt_loc,
char type; char type;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc); entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
type = gncEntryGetDiscountType (entry); type = gncEntryGetInvDiscountType (entry);
if (translate) { if (translate) {
return gnc_entry_ledger_type_string_getter (type + '0'); return gnc_entry_ledger_type_string_getter (type + '0');
@@ -239,7 +239,7 @@ static const char * get_dishow_entry (VirtualLocation virt_loc,
char type; char type;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc); entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
type = gncEntryGetDiscountHow (entry); type = gncEntryGetInvDiscountHow (entry);
if (translate) { if (translate) {
return gnc_entry_ledger_how_string_getter (type + '0'); return gnc_entry_ledger_how_string_getter (type + '0');
@@ -261,7 +261,10 @@ static const char * get_pric_entry (VirtualLocation virt_loc,
gnc_numeric price; gnc_numeric price;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc); entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
price = gncEntryGetPrice (entry); if (ledger->is_invoice)
price = gncEntryGetInvPrice (entry);
else
price = gncEntryGetBillPrice (entry);
if (gnc_numeric_zero_p (price)) if (gnc_numeric_zero_p (price))
return NULL; return NULL;
@@ -294,10 +297,16 @@ static const char * get_taxable_entry (VirtualLocation virt_loc,
{ {
GncEntryLedger *ledger = user_data; GncEntryLedger *ledger = user_data;
GncEntry *entry; GncEntry *entry;
gboolean taxable;
static char s[2] = { ' ', '\0' }; static char s[2] = { ' ', '\0' };
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc); entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
if (gncEntryGetTaxable (entry)) if (ledger->is_invoice)
taxable = gncEntryGetInvTaxable (entry);
else
taxable = gncEntryGetBillTaxable (entry);
if (taxable)
s[0] = 'X'; s[0] = 'X';
else else
s[0] = ' '; s[0] = ' ';
@@ -348,7 +357,10 @@ static const char * get_taxtable_entry (VirtualLocation virt_loc,
} }
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc); entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
table = gncEntryGetTaxTable (entry); if (ledger->is_invoice)
table = gncEntryGetInvTaxTable (entry);
else
table = gncEntryGetBillTaxTable (entry);
return gncTaxTableGetName (table); return gncTaxTableGetName (table);
} }
@@ -361,7 +373,7 @@ static const char * get_taxincluded_entry (VirtualLocation virt_loc,
GncEntryLedger *ledger = user_data; GncEntryLedger *ledger = user_data;
GncEntry *entry; GncEntry *entry;
static char s[2] = { ' ', '\0' }; static char s[2] = { ' ', '\0' };
gboolean taxable; gboolean taxable, taxincluded;
/* load the cell properly; just shadow the value */ /* load the cell properly; just shadow the value */
if (!conditionally_changed) { if (!conditionally_changed) {
@@ -373,7 +385,12 @@ static const char * get_taxincluded_entry (VirtualLocation virt_loc,
} }
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc); entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
if (gncEntryGetTaxIncluded (entry)) if (ledger->is_invoice)
taxincluded = gncEntryGetInvTaxIncluded (entry);
else
taxincluded = gncEntryGetBillTaxIncluded (entry);
if (taxincluded)
s[0] = 'X'; s[0] = 'X';
else else
s[0] = ' '; s[0] = ' ';
@@ -423,7 +440,7 @@ static const char * get_value_entry (VirtualLocation virt_loc,
if (entry == gnc_entry_ledger_get_blank_entry (ledger)) if (entry == gnc_entry_ledger_get_blank_entry (ledger))
return NULL; return NULL;
value = gncEntryReturnValue (entry); value = gncEntryReturnValue (entry, ledger->is_invoice);
} }
return xaccPrintAmount (value, gnc_default_print_info (TRUE)); return xaccPrintAmount (value, gnc_default_print_info (TRUE));
} }
@@ -446,7 +463,7 @@ static const char * get_taxval_entry (VirtualLocation virt_loc,
if (entry == gnc_entry_ledger_get_blank_entry (ledger)) if (entry == gnc_entry_ledger_get_blank_entry (ledger))
return NULL; return NULL;
value = gncEntryReturnTaxValue (entry); value = gncEntryReturnTaxValue (entry, ledger->is_invoice);
} }
return xaccPrintAmount (value, gnc_default_print_info (TRUE)); return xaccPrintAmount (value, gnc_default_print_info (TRUE));
@@ -790,6 +807,26 @@ static CellIOFlags get_taxincluded_io_flags (VirtualLocation virt_loc,
return flags | XACC_CELL_ALLOW_EXACT_ONLY; return flags | XACC_CELL_ALLOW_EXACT_ONLY;
} }
static CellIOFlags get_qty_io_flags (VirtualLocation virt_loc, gpointer user_data)
{
GncEntryLedger *ledger = user_data;
GncEntry *entry;
CellIOFlags flags = get_standard_io_flags (virt_loc, user_data);
/* If this isn't an invoice, or the flags are already read-only ... */
if (!ledger->is_invoice || flags == XACC_CELL_ALLOW_SHADOW)
return flags;
/* ok, if this is an invoice ledger AND this entry is attached to a
* bill (i.e. it's billable), freeze the quantity
*/
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
if (gncEntryGetBillable (entry))
return XACC_CELL_ALLOW_SHADOW;
return flags;
}
/* GET BG_COLORS */ /* GET BG_COLORS */
static guint32 static guint32
@@ -900,7 +937,7 @@ static void gnc_entry_ledger_save_cells (gpointer save_data,
gnc_numeric amount; gnc_numeric amount;
if (gnc_entry_ledger_get_numeric (ledger, ENTRY_DISC_CELL, &amount)) if (gnc_entry_ledger_get_numeric (ledger, ENTRY_DISC_CELL, &amount))
gncEntrySetDiscount (entry, amount); gncEntrySetInvDiscount (entry, amount);
} }
if (gnc_table_layout_get_cell_changed (ledger->table->layout, if (gnc_table_layout_get_cell_changed (ledger->table->layout,
@@ -910,7 +947,7 @@ static void gnc_entry_ledger_save_cells (gpointer save_data,
type = gnc_entry_ledger_get_type (ledger, ENTRY_DISTYPE_CELL); type = gnc_entry_ledger_get_type (ledger, ENTRY_DISTYPE_CELL);
if (type != -1) if (type != -1)
gncEntrySetDiscountType (entry, type); gncEntrySetInvDiscountType (entry, type);
} }
if (gnc_table_layout_get_cell_changed (ledger->table->layout, if (gnc_table_layout_get_cell_changed (ledger->table->layout,
@@ -920,15 +957,7 @@ static void gnc_entry_ledger_save_cells (gpointer save_data,
type = gnc_entry_ledger_get_type (ledger, ENTRY_DISHOW_CELL); type = gnc_entry_ledger_get_type (ledger, ENTRY_DISHOW_CELL);
if (type != -1) if (type != -1)
gncEntrySetDiscountHow (entry, type); gncEntrySetInvDiscountHow (entry, type);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_PRIC_CELL, TRUE)) {
gnc_numeric amount;
if (gnc_entry_ledger_get_numeric (ledger, ENTRY_PRIC_CELL, &amount))
gncEntrySetPrice (entry, amount);
} }
if (gnc_table_layout_get_cell_changed (ledger->table->layout, if (gnc_table_layout_get_cell_changed (ledger->table->layout,
@@ -939,12 +968,35 @@ static void gnc_entry_ledger_save_cells (gpointer save_data,
gncEntrySetQuantity (entry, amount); gncEntrySetQuantity (entry, amount);
} }
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_BILLABLE_CELL, TRUE)) {
gboolean billable;
billable = gnc_entry_ledger_get_checkmark (ledger, ENTRY_BILLABLE_CELL);
gncEntrySetBillable (entry, billable);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_PRIC_CELL, TRUE)) {
gnc_numeric amount;
if (gnc_entry_ledger_get_numeric (ledger, ENTRY_PRIC_CELL, &amount)) {
if (ledger->is_invoice)
gncEntrySetInvPrice (entry, amount);
else
gncEntrySetBillPrice (entry, amount);
}
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout, if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_TAXABLE_CELL, TRUE)) { ENTRY_TAXABLE_CELL, TRUE)) {
gboolean taxable; gboolean taxable;
taxable = gnc_entry_ledger_get_checkmark (ledger, ENTRY_TAXABLE_CELL); taxable = gnc_entry_ledger_get_checkmark (ledger, ENTRY_TAXABLE_CELL);
gncEntrySetTaxable (entry, taxable); if (ledger->is_invoice)
gncEntrySetInvTaxable (entry, taxable);
else
gncEntrySetBillTaxable (entry, taxable);
} }
/* XXX: Only (re-set) these if taxable is TRUE? */ /* XXX: Only (re-set) these if taxable is TRUE? */
@@ -953,8 +1005,12 @@ static void gnc_entry_ledger_save_cells (gpointer save_data,
GncTaxTable *table; GncTaxTable *table;
table = gnc_entry_ledger_get_taxtable (ledger, ENTRY_TAXTABLE_CELL); table = gnc_entry_ledger_get_taxtable (ledger, ENTRY_TAXTABLE_CELL);
if (table) if (table) {
gncEntrySetTaxTable (entry, table); if (ledger->is_invoice)
gncEntrySetInvTaxTable (entry, table);
else
gncEntrySetBillTaxTable (entry, table);
}
} }
if (gnc_table_layout_get_cell_changed (ledger->table->layout, if (gnc_table_layout_get_cell_changed (ledger->table->layout,
@@ -963,15 +1019,10 @@ static void gnc_entry_ledger_save_cells (gpointer save_data,
taxincluded = gnc_entry_ledger_get_checkmark (ledger, taxincluded = gnc_entry_ledger_get_checkmark (ledger,
ENTRY_TAXINCLUDED_CELL); ENTRY_TAXINCLUDED_CELL);
gncEntrySetTaxIncluded (entry, taxincluded); if (ledger->is_invoice)
} gncEntrySetInvTaxIncluded (entry, taxincluded);
else
if (gnc_table_layout_get_cell_changed (ledger->table->layout, gncEntrySetBillTaxIncluded (entry, taxincluded);
ENTRY_BILLABLE_CELL, TRUE)) {
gboolean billable;
billable = gnc_entry_ledger_get_checkmark (ledger, ENTRY_BILLABLE_CELL);
gncEntrySetBillable (entry, billable);
} }
if (ledger->type == GNCENTRY_INVOICE_ENTRY) { if (ledger->type == GNCENTRY_INVOICE_ENTRY) {
@@ -1020,7 +1071,7 @@ static void gnc_entry_ledger_model_new_handlers (TableModel *model,
{ ENTRY_DISTYPE_CELL, get_distype_entry, get_distype_label, get_distype_help, get_typecell_io_flags }, { ENTRY_DISTYPE_CELL, get_distype_entry, get_distype_label, get_distype_help, get_typecell_io_flags },
{ ENTRY_DISHOW_CELL, get_dishow_entry, get_dishow_label, get_dishow_help, get_typecell_io_flags }, { ENTRY_DISHOW_CELL, get_dishow_entry, get_dishow_label, get_dishow_help, get_typecell_io_flags },
{ ENTRY_PRIC_CELL, get_pric_entry, get_pric_label, get_pric_help, get_standard_io_flags }, { ENTRY_PRIC_CELL, get_pric_entry, get_pric_label, get_pric_help, get_standard_io_flags },
{ ENTRY_QTY_CELL, get_qty_entry, get_qty_label, get_qty_help, get_standard_io_flags }, { ENTRY_QTY_CELL, get_qty_entry, get_qty_label, get_qty_help, get_qty_io_flags },
{ ENTRY_TAXABLE_CELL, get_taxable_entry, get_taxable_label, get_taxable_help, get_typecell_io_flags }, { ENTRY_TAXABLE_CELL, get_taxable_entry, get_taxable_label, get_taxable_help, get_typecell_io_flags },
{ ENTRY_TAXTABLE_CELL, get_taxtable_entry, get_taxtable_label, get_taxtable_help, get_tax_io_flags }, { ENTRY_TAXTABLE_CELL, get_taxtable_entry, get_taxtable_label, get_taxtable_help, get_tax_io_flags },
{ ENTRY_TAXINCLUDED_CELL, get_taxincluded_entry, get_taxincluded_label, get_taxincluded_help, get_taxincluded_io_flags }, { ENTRY_TAXINCLUDED_CELL, get_taxincluded_entry, get_taxincluded_label, get_taxincluded_help, get_taxincluded_io_flags },

View File

@@ -33,6 +33,8 @@ struct GncEntryLedger_s {
QueryNew * query; QueryNew * query;
GncEntryLedgerType type; GncEntryLedgerType type;
gboolean is_invoice; /* is this an invoice (or a bill)? */
}; };
GncEntry * gnc_entry_ledger_get_entry (GncEntryLedger *ledger, GncEntry * gnc_entry_ledger_get_entry (GncEntryLedger *ledger,

View File

@@ -123,15 +123,15 @@
table) table)
(gnc:make-gnc-monetary currency numeric))) (gnc:make-gnc-monetary currency numeric)))
(define (add-entry-row table entry column-vector row-style) (define (add-entry-row table entry column-vector row-style invoice?)
(let* ((row-contents '()) (let* ((row-contents '())
(currency (gnc:default-currency)) ; XXX: FIXME (currency (gnc:default-currency)) ; XXX: FIXME
(entry-value (gnc:make-gnc-monetary (entry-value (gnc:make-gnc-monetary
currency currency
(gnc:entry-get-value entry))) (gnc:entry-get-value entry invoice?)))
(entry-tax-value (gnc:make-gnc-monetary (entry-tax-value (gnc:make-gnc-monetary
currency currency
(gnc:entry-get-tax-value entry)))) (gnc:entry-get-tax-value entry invoice?))))
(if (date-col column-vector) (if (date-col column-vector)
(addto! row-contents (addto! row-contents
@@ -156,23 +156,32 @@
(gnc:make-html-table-cell/markup (gnc:make-html-table-cell/markup
"number-cell" "number-cell"
(gnc:make-gnc-monetary (gnc:make-gnc-monetary
currency (gnc:entry-get-price entry))))) currency (if invoice? (gnc:entry-get-inv-price entry)
(gnc:entry-get-bill-price entry))))))
(if (discount-col column-vector) (if (discount-col column-vector)
(addto! row-contents (addto! row-contents
(gnc:make-html-table-cell/markup (if invoice?
"number-cell" (gnc:make-html-table-cell/markup
(monetary-or-percent (gnc:entry-get-discount entry) "number-cell"
currency (monetary-or-percent (gnc:entry-get-inv-discount entry)
(gnc:entry-get-discount-type entry))))) currency
(gnc:entry-get-inv-discount-type entry)))
"")))
(if (tax-col column-vector) (if (tax-col column-vector)
(addto! row-contents (addto! row-contents
(gnc:make-html-table-cell/markup (gnc:make-html-table-cell/markup
"number-cell" "number-cell"
(monetary-or-percent (gnc:entry-get-tax entry) (if #t ""
currency (if invoice?
(gnc:entry-get-tax-type entry))))) (monetary-or-percent (gnc:entry-get-inv-tax entry)
currency
(gnc:entry-get-inv-tax-type entry))
(monetary-or-percent (gnc:entry-get-bill-tax entry)
currency
(gnc:entry-get-bill-tax-type entry))))))
)
(if (taxvalue-col column-vector) (if (taxvalue-col column-vector)
(addto! row-contents (addto! row-contents
@@ -293,7 +302,7 @@
gnc:*report-options*) gnc:*report-options*)
(define (make-entry-table invoice options add-order) (define (make-entry-table invoice options add-order invoice?)
(let ((show-payments (gnc:option-value (let ((show-payments (gnc:option-value
(gnc:lookup-option options (N_ "Display") (gnc:lookup-option options (N_ "Display")
(N_ "Payments")))) (N_ "Payments"))))
@@ -403,7 +412,8 @@
(entry-values (add-entry-row table (entry-values (add-entry-row table
current current
used-columns used-columns
current-row-style))) current-row-style
invoice?)))
(value-collector 'add (value-collector 'add
(gnc:gnc-monetary-commodity (car entry-values)) (gnc:gnc-monetary-commodity (car entry-values))
@@ -558,7 +568,8 @@
(invoice (opt-val invoice-page invoice-name)) (invoice (opt-val invoice-page invoice-name))
(owner #f) (owner #f)
(references? (opt-val "Display" "References")) (references? (opt-val "Display" "References"))
(title (_ "Invoice"))) (title (_ "Invoice"))
(invoice? #f))
(define (add-order o) (define (add-order o)
(if (and references? (not (member o orders))) (if (and references? (not (member o orders)))
@@ -567,6 +578,14 @@
(if invoice (if invoice
(begin (begin
(set! owner (gnc:invoice-get-owner invoice)) (set! owner (gnc:invoice-get-owner invoice))
(let ((type (gw:enum-<gnc:GncOwnerType>-val->sym
(gnc:owner-get-type
(gnc:owner-get-end-owner owner)) #f)))
(case type
((gnc-owner-customer)
(set! invoice? #t))
((gnc-owner-vendor)
(set! title (_ "Bill")))))
(set! title (string-append title " #" (set! title (string-append title " #"
(gnc:invoice-get-id invoice))))) (gnc:invoice-get-id invoice)))))
@@ -576,7 +595,7 @@
(let ((book (gnc:invoice-get-book invoice))) (let ((book (gnc:invoice-get-book invoice)))
(set! table (make-entry-table invoice (set! table (make-entry-table invoice
(gnc:report-options report-obj) (gnc:report-options report-obj)
add-order)) add-order invoice?))
(gnc:html-table-set-style! (gnc:html-table-set-style!
table "table" table "table"