2001-11-21 19:23:07 -06:00
|
|
|
/*
|
|
|
|
* gncEntry.c -- the Core Business Entry Interface
|
2002-01-20 20:27:02 -06:00
|
|
|
* Copyright (C) 2001,2002 Derek Atkins
|
2001-11-21 19:23:07 -06:00
|
|
|
* Author: Derek Atkins <warlord@MIT.EDU>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#include <glib.h>
|
|
|
|
|
|
|
|
#include "messages.h"
|
2001-11-24 23:34:34 -06:00
|
|
|
#include "gnc-book-p.h"
|
2003-06-11 11:22:26 -05:00
|
|
|
#include "gnc-commodity.h"
|
|
|
|
#include "gnc-engine-util.h"
|
|
|
|
#include "gnc-event-p.h"
|
|
|
|
#include "gnc-numeric.h"
|
2001-11-24 23:34:34 -06:00
|
|
|
#include "GNCIdP.h"
|
2002-02-03 14:01:08 -06:00
|
|
|
#include "QueryObject.h"
|
2002-11-03 14:21:42 -06:00
|
|
|
#include "gnc-be-utils.h"
|
2001-11-21 19:23:07 -06:00
|
|
|
|
|
|
|
#include "gncBusiness.h"
|
|
|
|
#include "gncEntry.h"
|
|
|
|
#include "gncEntryP.h"
|
|
|
|
#include "gncInvoice.h"
|
|
|
|
#include "gncOrder.h"
|
|
|
|
|
|
|
|
struct _gncEntry {
|
2001-11-24 23:34:34 -06:00
|
|
|
GNCBook * book;
|
2001-11-21 19:23:07 -06:00
|
|
|
|
|
|
|
GUID guid;
|
|
|
|
Timespec date;
|
2002-02-27 23:10:07 -06:00
|
|
|
Timespec date_entered;
|
2001-11-21 19:23:07 -06:00
|
|
|
char * desc;
|
|
|
|
char * action;
|
2002-06-16 23:04:05 -05:00
|
|
|
char * notes;
|
2001-11-21 19:23:07 -06:00
|
|
|
gnc_numeric quantity;
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* customer invoice data */
|
|
|
|
Account * i_account;
|
|
|
|
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;
|
2002-07-10 12:32:59 -05:00
|
|
|
gboolean billable;
|
|
|
|
GncOwner billto;
|
|
|
|
|
2003-03-02 22:58:55 -06:00
|
|
|
/* employee bill data */
|
|
|
|
GncEntryPaymentType b_payment;
|
|
|
|
|
|
|
|
/* my parent(s) */
|
2001-11-21 19:23:07 -06:00
|
|
|
GncOrder * order;
|
|
|
|
GncInvoice * invoice;
|
2002-07-09 23:12:19 -05:00
|
|
|
GncInvoice * bill;
|
2001-11-21 19:23:07 -06:00
|
|
|
|
2002-11-03 14:21:42 -06:00
|
|
|
int editlevel;
|
|
|
|
gboolean do_free;
|
2002-09-14 00:32:37 -05:00
|
|
|
gboolean dirty;
|
|
|
|
|
|
|
|
/* CACHED VALUES */
|
|
|
|
|
2002-05-27 13:17:31 -05:00
|
|
|
gboolean values_dirty;
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* 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;
|
2001-11-21 19:23:07 -06:00
|
|
|
};
|
|
|
|
|
2002-11-03 14:21:42 -06:00
|
|
|
static short module = MOD_BUSINESS;
|
|
|
|
|
2002-07-01 13:31:48 -05:00
|
|
|
/* You must edit the functions in this block in tandem. KEEP THEM IN
|
|
|
|
SYNC! */
|
|
|
|
|
|
|
|
#define GNC_RETURN_ENUM_AS_STRING(x,s) case (x): return (s);
|
|
|
|
const char *
|
|
|
|
gncEntryDiscountHowToString (GncDiscountHow how)
|
|
|
|
{
|
|
|
|
switch(how)
|
|
|
|
{
|
|
|
|
GNC_RETURN_ENUM_AS_STRING(GNC_DISC_PRETAX, "PRETAX");
|
|
|
|
GNC_RETURN_ENUM_AS_STRING(GNC_DISC_SAMETIME, "SAMETIME");
|
|
|
|
GNC_RETURN_ENUM_AS_STRING(GNC_DISC_POSTTAX, "POSTTAX");
|
|
|
|
default:
|
|
|
|
g_warning ("asked to translate unknown discount-how %d.\n", how);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return(NULL);
|
|
|
|
}
|
2003-03-02 22:58:55 -06:00
|
|
|
|
|
|
|
const char * gncEntryPaymentTypeToString (GncEntryPaymentType type)
|
|
|
|
{
|
|
|
|
switch(type)
|
|
|
|
{
|
|
|
|
GNC_RETURN_ENUM_AS_STRING(GNC_PAYMENT_CASH, "CASH");
|
|
|
|
GNC_RETURN_ENUM_AS_STRING(GNC_PAYMENT_CARD, "CARD");
|
|
|
|
default:
|
|
|
|
g_warning ("asked to translate unknown payment type %d.\n", type);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return(NULL);
|
|
|
|
}
|
2002-07-01 13:31:48 -05:00
|
|
|
#undef GNC_RETURN_ENUM_AS_STRING
|
2003-03-02 22:58:55 -06:00
|
|
|
#define GNC_RETURN_ON_MATCH(s,x,r) \
|
|
|
|
if(safe_strcmp((s), (str)) == 0) { *(r) = x; return(TRUE); }
|
2002-07-01 13:31:48 -05:00
|
|
|
gboolean gncEntryDiscountStringToHow (const char *str, GncDiscountHow *how)
|
|
|
|
{
|
2003-03-02 22:58:55 -06:00
|
|
|
GNC_RETURN_ON_MATCH ("PRETAX", GNC_DISC_PRETAX, how);
|
|
|
|
GNC_RETURN_ON_MATCH ("SAMETIME", GNC_DISC_SAMETIME, how);
|
|
|
|
GNC_RETURN_ON_MATCH ("POSTTAX", GNC_DISC_POSTTAX, how);
|
|
|
|
g_warning ("asked to translate unknown discount-how string %s.\n",
|
|
|
|
str ? str : "(null)");
|
|
|
|
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
gboolean gncEntryPaymentStringToType (const char *str, GncEntryPaymentType *type)
|
|
|
|
{
|
|
|
|
GNC_RETURN_ON_MATCH ("CASH", GNC_PAYMENT_CASH, type);
|
|
|
|
GNC_RETURN_ON_MATCH ("CARD", GNC_PAYMENT_CARD, type);
|
2002-07-01 13:31:48 -05:00
|
|
|
g_warning ("asked to translate unknown discount-how string %s.\n",
|
|
|
|
str ? str : "(null)");
|
|
|
|
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
#undef GNC_RETURN_ON_MATCH
|
|
|
|
|
2001-11-24 23:34:34 -06:00
|
|
|
#define _GNC_MOD_NAME GNC_ENTRY_MODULE_NAME
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
|
|
|
|
#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
|
|
|
|
|
2002-11-03 18:41:01 -06:00
|
|
|
#define SET_STR(obj, member, str) { \
|
2001-11-21 19:23:07 -06:00
|
|
|
char * tmp; \
|
|
|
|
\
|
|
|
|
if (!safe_strcmp (member, str)) return; \
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (obj); \
|
2001-11-21 19:23:07 -06:00
|
|
|
tmp = CACHE_INSERT (str); \
|
|
|
|
CACHE_REMOVE (member); \
|
|
|
|
member = tmp; \
|
|
|
|
}
|
|
|
|
|
2001-11-24 23:34:34 -06:00
|
|
|
static void addObj (GncEntry *entry);
|
|
|
|
static void remObj (GncEntry *entry);
|
|
|
|
|
2002-02-28 22:15:01 -06:00
|
|
|
G_INLINE_FUNC void mark_entry (GncEntry *entry);
|
|
|
|
G_INLINE_FUNC void
|
|
|
|
mark_entry (GncEntry *entry)
|
|
|
|
{
|
|
|
|
entry->dirty = TRUE;
|
2002-11-03 14:21:42 -06:00
|
|
|
gncBusinessSetDirtyFlag (entry->book, _GNC_MOD_NAME, TRUE);
|
2002-02-28 22:15:01 -06:00
|
|
|
|
|
|
|
gnc_engine_generate_event (&entry->guid, GNC_EVENT_MODIFY);
|
|
|
|
}
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
/* Create/Destroy Functions */
|
|
|
|
|
2001-11-24 23:34:34 -06:00
|
|
|
GncEntry *gncEntryCreate (GNCBook *book)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
GncEntry *entry;
|
2002-09-14 00:32:37 -05:00
|
|
|
gnc_numeric zero = gnc_numeric_zero ();
|
2001-11-21 19:23:07 -06:00
|
|
|
|
2001-11-24 23:34:34 -06:00
|
|
|
if (!book) return NULL;
|
2001-11-21 19:23:07 -06:00
|
|
|
|
|
|
|
entry = g_new0 (GncEntry, 1);
|
2001-11-24 23:34:34 -06:00
|
|
|
entry->book = book;
|
2001-11-21 19:23:07 -06:00
|
|
|
|
|
|
|
entry->desc = CACHE_INSERT ("");
|
|
|
|
entry->action = CACHE_INSERT ("");
|
2002-06-16 23:04:05 -05:00
|
|
|
entry->notes = CACHE_INSERT ("");
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->quantity = zero;
|
2001-11-21 19:23:07 -06:00
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_price = zero;
|
|
|
|
entry->i_taxable = TRUE;
|
|
|
|
entry->i_discount = zero;
|
|
|
|
entry->i_disc_type = GNC_AMT_TYPE_PERCENT;
|
|
|
|
entry->i_disc_how = GNC_DISC_PRETAX;
|
|
|
|
|
|
|
|
entry->b_price = zero;
|
|
|
|
entry->b_taxable = TRUE;
|
2002-07-11 00:20:52 -05:00
|
|
|
entry->billto.type = GNC_OWNER_CUSTOMER;
|
2003-03-02 22:58:55 -06:00
|
|
|
entry->b_payment = GNC_PAYMENT_CASH;
|
2001-11-21 19:23:07 -06:00
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->values_dirty = TRUE;
|
|
|
|
|
2001-11-24 23:34:34 -06:00
|
|
|
xaccGUIDNew (&entry->guid, book);
|
|
|
|
addObj (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
|
2002-02-28 22:15:01 -06:00
|
|
|
gnc_engine_generate_event (&entry->guid, GNC_EVENT_CREATE);
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
return entry;
|
|
|
|
}
|
|
|
|
|
|
|
|
void gncEntryDestroy (GncEntry *entry)
|
2002-11-03 14:21:42 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
entry->do_free = TRUE;
|
|
|
|
gncEntryCommitEdit(entry);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void gncEntryFree (GncEntry *entry)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
|
2002-02-28 22:15:01 -06:00
|
|
|
gnc_engine_generate_event (&entry->guid, GNC_EVENT_DESTROY);
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
CACHE_REMOVE (entry->desc);
|
|
|
|
CACHE_REMOVE (entry->action);
|
2002-06-16 23:04:05 -05:00
|
|
|
CACHE_REMOVE (entry->notes);
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->i_tax_values)
|
|
|
|
gncAccountValueDestroy (entry->i_tax_values);
|
|
|
|
if (entry->b_tax_values)
|
|
|
|
gncAccountValueDestroy (entry->b_tax_values);
|
2001-11-24 23:34:34 -06:00
|
|
|
remObj (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
|
|
|
|
g_free (entry);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set Functions */
|
|
|
|
|
|
|
|
void gncEntrySetGUID (GncEntry *entry, const GUID *guid)
|
|
|
|
{
|
|
|
|
if (!entry || !guid) return;
|
2001-11-24 23:34:34 -06:00
|
|
|
if (guid_equal (guid, &entry->guid)) return;
|
|
|
|
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2001-11-24 23:34:34 -06:00
|
|
|
remObj (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
entry->guid = *guid;
|
2001-11-24 23:34:34 -06:00
|
|
|
addObj (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-02-27 23:10:07 -06:00
|
|
|
void gncEntrySetDate (GncEntry *entry, Timespec date)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
2002-02-27 23:10:07 -06:00
|
|
|
if (!entry) return;
|
2002-06-21 14:00:34 -05:00
|
|
|
if (timespec_equal (&entry->date, &date)) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-02-27 23:10:07 -06:00
|
|
|
entry->date = date;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-02-27 23:10:07 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void gncEntrySetDateEntered (GncEntry *entry, Timespec date)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-06-21 14:00:34 -05:00
|
|
|
if (timespec_equal (&entry->date_entered, &date)) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-02-27 23:10:07 -06:00
|
|
|
entry->date_entered = date;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void gncEntrySetDescription (GncEntry *entry, const char *desc)
|
|
|
|
{
|
|
|
|
if (!entry || !desc) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
SET_STR (entry, entry->desc, desc);
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void gncEntrySetAction (GncEntry *entry, const char *action)
|
|
|
|
{
|
|
|
|
if (!entry || !action) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
SET_STR (entry,entry->action, action);
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-06-16 23:04:05 -05:00
|
|
|
void gncEntrySetNotes (GncEntry *entry, const char *notes)
|
|
|
|
{
|
|
|
|
if (!entry || !notes) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
SET_STR (entry, entry->notes, notes);
|
2002-06-16 23:04:05 -05:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-06-16 23:04:05 -05:00
|
|
|
}
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
void gncEntrySetQuantity (GncEntry *entry, gnc_numeric quantity)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-06-21 14:00:34 -05:00
|
|
|
if (gnc_numeric_eq (entry->quantity, quantity)) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
entry->quantity = quantity;
|
2002-05-27 13:17:31 -05:00
|
|
|
entry->values_dirty = TRUE;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* Customer Invoices */
|
|
|
|
|
|
|
|
void gncEntrySetInvAccount (GncEntry *entry, Account *acc)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->i_account == acc) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_account = acc;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetInvPrice (GncEntry *entry, gnc_numeric price)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (gnc_numeric_eq (entry->i_price, price)) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_price = price;
|
2002-05-27 13:17:31 -05:00
|
|
|
entry->values_dirty = TRUE;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetInvTaxable (GncEntry *entry, gboolean taxable)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->i_taxable == taxable) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_taxable = taxable;
|
|
|
|
entry->values_dirty = TRUE;
|
2002-07-11 10:11:33 -05:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-07-11 10:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetInvTaxIncluded (GncEntry *entry, gboolean taxincluded)
|
2002-07-11 10:11:33 -05:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->i_taxincluded == taxincluded) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_taxincluded = taxincluded;
|
|
|
|
entry->values_dirty = TRUE;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetInvTaxTable (GncEntry *entry, GncTaxTable *table)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->i_tax_table == table) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->i_tax_table)
|
|
|
|
gncTaxTableDecRef (entry->i_tax_table);
|
|
|
|
if (table)
|
|
|
|
gncTaxTableIncRef (table);
|
|
|
|
entry->i_tax_table = table;
|
|
|
|
entry->values_dirty = TRUE;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetInvDiscount (GncEntry *entry, gnc_numeric discount)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (gnc_numeric_eq (entry->i_discount, discount)) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_discount = discount;
|
|
|
|
entry->values_dirty = TRUE;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetInvDiscountType (GncEntry *entry, GncAmountType type)
|
2002-07-09 23:12:19 -05:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->i_disc_type == type) return;
|
|
|
|
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_disc_type = type;
|
|
|
|
entry->values_dirty = TRUE;
|
2002-07-09 23:12:19 -05:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-07-09 23:12:19 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetInvDiscountHow (GncEntry *entry, GncDiscountHow how)
|
2002-06-16 00:11:33 -05:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->i_disc_how == how) return;
|
|
|
|
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_disc_how = how;
|
2002-06-16 00:11:33 -05:00
|
|
|
entry->values_dirty = TRUE;
|
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* Vendor Bills */
|
|
|
|
|
|
|
|
void gncEntrySetBillAccount (GncEntry *entry, Account *acc)
|
2001-11-23 23:35:08 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->b_account == acc) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->b_account = acc;
|
2002-06-16 00:11:33 -05:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
2001-11-23 23:35:08 -06:00
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetBillPrice (GncEntry *entry, gnc_numeric price)
|
2002-06-16 00:11:33 -05:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (gnc_numeric_eq (entry->b_price, price)) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->b_price = price;
|
2002-05-27 13:17:31 -05:00
|
|
|
entry->values_dirty = TRUE;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-23 23:35:08 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetBillTaxable (GncEntry *entry, gboolean taxable)
|
2001-11-23 23:35:08 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->b_taxable == taxable) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->b_taxable = taxable;
|
2002-05-27 13:17:31 -05:00
|
|
|
entry->values_dirty = TRUE;
|
2002-02-28 22:15:01 -06:00
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2001-11-23 23:35:08 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetBillTaxIncluded (GncEntry *entry, gboolean taxincluded)
|
2002-06-16 00:11:33 -05:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->b_taxincluded == taxincluded) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->b_taxincluded = taxincluded;
|
|
|
|
entry->values_dirty = TRUE;
|
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
}
|
2002-06-16 00:11:33 -05:00
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntrySetBillTaxTable (GncEntry *entry, GncTaxTable *table)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
if (entry->b_tax_table == table) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
if (entry->b_tax_table)
|
|
|
|
gncTaxTableDecRef (entry->b_tax_table);
|
|
|
|
if (table)
|
|
|
|
gncTaxTableIncRef (table);
|
|
|
|
entry->b_tax_table = table;
|
2002-06-16 00:11:33 -05:00
|
|
|
entry->values_dirty = TRUE;
|
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-07-10 12:32:59 -05:00
|
|
|
void gncEntrySetBillable (GncEntry *entry, gboolean billable)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
if (entry->billable == billable) return;
|
|
|
|
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-07-10 12:32:59 -05:00
|
|
|
entry->billable = billable;
|
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-07-10 12:32:59 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void gncEntrySetBillTo (GncEntry *entry, GncOwner *billto)
|
|
|
|
{
|
|
|
|
if (!entry || !billto) return;
|
|
|
|
if (gncOwnerEqual (&entry->billto, billto)) return;
|
|
|
|
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-07-10 12:32:59 -05:00
|
|
|
gncOwnerCopy (billto, &entry->billto);
|
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-07-10 12:32:59 -05:00
|
|
|
}
|
|
|
|
|
2003-03-02 22:58:55 -06:00
|
|
|
void gncEntrySetBillPayment (GncEntry *entry, GncEntryPaymentType type)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
if (entry->b_payment == type) return;
|
|
|
|
gncEntryBeginEdit (entry);
|
|
|
|
entry->b_payment = type;
|
|
|
|
mark_entry (entry);
|
|
|
|
gncEntryCommitEdit (entry);
|
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* Called from gncOrder when we're added to the Order */
|
|
|
|
void gncEntrySetOrder (GncEntry *entry, GncOrder *order)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
if (entry->order == order) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->order = order;
|
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
|
|
|
|
/* Generate an event modifying the Order's end-owner */
|
|
|
|
gnc_engine_generate_event (gncOwnerGetEndGUID (gncOrderGetOwner (order)),
|
|
|
|
GNC_EVENT_MODIFY);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* called from gncInvoice when we're added to the Invoice */
|
|
|
|
void gncEntrySetInvoice (GncEntry *entry, GncInvoice *invoice)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
if (entry->invoice == invoice) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->invoice = invoice;
|
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/* called from gncInvoice when we're added to the Invoice/Bill */
|
|
|
|
void gncEntrySetBill (GncEntry *entry, GncInvoice *bill)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
if (entry->bill == bill) return;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->bill = bill;
|
|
|
|
mark_entry (entry);
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
}
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
void gncEntrySetDirty (GncEntry *entry, gboolean dirty)
|
|
|
|
{
|
|
|
|
if (!entry) return;
|
|
|
|
entry->dirty = dirty;
|
|
|
|
}
|
|
|
|
|
2002-05-18 15:10:27 -05:00
|
|
|
void gncEntryCopy (const GncEntry *src, GncEntry *dest)
|
|
|
|
{
|
|
|
|
if (!src || !dest) return;
|
|
|
|
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryBeginEdit (dest);
|
2002-05-18 15:10:27 -05:00
|
|
|
dest->date = src->date;
|
|
|
|
dest->date_entered = src->date_entered; /* ??? */
|
|
|
|
gncEntrySetDescription (dest, src->desc);
|
|
|
|
gncEntrySetAction (dest, src->action);
|
2002-06-16 23:04:05 -05:00
|
|
|
gncEntrySetNotes (dest, src->notes);
|
2002-05-18 15:10:27 -05:00
|
|
|
dest->quantity = src->quantity;
|
2002-09-14 00:32:37 -05:00
|
|
|
|
|
|
|
dest->i_account = src->i_account;
|
|
|
|
dest->i_price = src->i_price;
|
|
|
|
dest->i_taxable = src->i_taxable;
|
|
|
|
dest->i_taxincluded = src->i_taxincluded;
|
|
|
|
dest->i_discount = src->i_discount;
|
|
|
|
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;
|
2002-07-10 12:32:59 -05:00
|
|
|
dest->billable = src->billable;
|
|
|
|
dest->billto = src->billto;
|
2002-06-16 00:11:33 -05:00
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
if (src->i_tax_table)
|
|
|
|
gncEntrySetInvTaxTable (dest, src->i_tax_table);
|
|
|
|
|
|
|
|
if (src->b_tax_table)
|
|
|
|
gncEntrySetBillTaxTable (dest, src->b_tax_table);
|
2002-05-18 15:10:27 -05:00
|
|
|
|
|
|
|
if (src->order)
|
|
|
|
gncOrderAddEntry (src->order, dest);
|
|
|
|
|
|
|
|
if (src->invoice)
|
|
|
|
gncInvoiceAddEntry (src->invoice, dest);
|
2002-05-27 13:17:31 -05:00
|
|
|
|
2002-07-09 23:12:19 -05:00
|
|
|
if (src->bill)
|
|
|
|
gncBillAddEntry (src->bill, dest);
|
|
|
|
|
2002-05-27 13:17:31 -05:00
|
|
|
dest->values_dirty = TRUE;
|
2002-11-03 18:41:01 -06:00
|
|
|
gncEntryCommitEdit (dest);
|
2002-05-18 15:10:27 -05:00
|
|
|
}
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
/* Get Functions */
|
|
|
|
|
2001-11-24 23:34:34 -06:00
|
|
|
GNCBook * gncEntryGetBook (GncEntry *entry)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
2001-11-24 23:34:34 -06:00
|
|
|
return entry->book;
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
const GUID * gncEntryGetGUID (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return &(entry->guid);
|
|
|
|
}
|
|
|
|
|
|
|
|
Timespec gncEntryGetDate (GncEntry *entry)
|
|
|
|
{
|
|
|
|
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
|
|
|
|
if (!entry) return ts;
|
|
|
|
return entry->date;
|
|
|
|
}
|
|
|
|
|
2002-02-27 23:10:07 -06:00
|
|
|
Timespec gncEntryGetDateEntered (GncEntry *entry)
|
|
|
|
{
|
|
|
|
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
|
|
|
|
if (!entry) return ts;
|
|
|
|
return entry->date_entered;
|
|
|
|
}
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
const char * gncEntryGetDescription (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return entry->desc;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char * gncEntryGetAction (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return entry->action;
|
|
|
|
}
|
|
|
|
|
2002-06-16 23:04:05 -05:00
|
|
|
const char * gncEntryGetNotes (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return entry->notes;
|
|
|
|
}
|
|
|
|
|
2001-11-21 19:23:07 -06:00
|
|
|
gnc_numeric gncEntryGetQuantity (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return gnc_numeric_zero();
|
|
|
|
return entry->quantity;
|
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* Customer Invoice */
|
|
|
|
|
|
|
|
Account * gncEntryGetInvAccount (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return entry->i_account;
|
|
|
|
}
|
|
|
|
|
|
|
|
gnc_numeric gncEntryGetInvPrice (GncEntry *entry)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return gnc_numeric_zero();
|
2002-09-14 00:32:37 -05:00
|
|
|
return entry->i_price;
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gnc_numeric gncEntryGetInvDiscount (GncEntry *entry)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return gnc_numeric_zero();
|
2002-09-14 00:32:37 -05:00
|
|
|
return entry->i_discount;
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
GncAmountType gncEntryGetInvDiscountType (GncEntry *entry)
|
2002-07-11 10:11:33 -05:00
|
|
|
{
|
2002-09-14 00:32:37 -05:00
|
|
|
if (!entry) return 0;
|
|
|
|
return entry->i_disc_type;
|
2002-07-11 10:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
GncDiscountHow gncEntryGetInvDiscountHow (GncEntry *entry)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
2002-09-14 00:32:37 -05:00
|
|
|
if (!entry) return 0;
|
|
|
|
return entry->i_disc_how;
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gboolean gncEntryGetInvTaxable (GncEntry *entry)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
2002-09-14 00:32:37 -05:00
|
|
|
if (!entry) return FALSE;
|
|
|
|
return entry->i_taxable;
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gboolean gncEntryGetInvTaxIncluded (GncEntry *entry)
|
2002-07-09 23:12:19 -05:00
|
|
|
{
|
2002-09-14 00:32:37 -05:00
|
|
|
if (!entry) return FALSE;
|
|
|
|
return entry->i_taxincluded;
|
2002-07-09 23:12:19 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
GncTaxTable * gncEntryGetInvTaxTable (GncEntry *entry)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
2002-09-14 00:32:37 -05:00
|
|
|
return entry->i_tax_table;
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* vendor bills */
|
|
|
|
|
|
|
|
Account * gncEntryGetBillAccount (GncEntry *entry)
|
2001-11-23 23:35:08 -06:00
|
|
|
{
|
2002-09-14 00:32:37 -05:00
|
|
|
if (!entry) return NULL;
|
|
|
|
return entry->b_account;
|
2001-11-23 23:35:08 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gnc_numeric gncEntryGetBillPrice (GncEntry *entry)
|
2001-11-23 23:35:08 -06:00
|
|
|
{
|
2002-09-14 00:32:37 -05:00
|
|
|
if (!entry) return gnc_numeric_zero();
|
|
|
|
return entry->b_price;
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gboolean gncEntryGetBillTaxable (GncEntry *entry)
|
2002-06-16 00:11:33 -05:00
|
|
|
{
|
|
|
|
if (!entry) return FALSE;
|
2002-09-14 00:32:37 -05:00
|
|
|
return entry->b_taxable;
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gboolean gncEntryGetBillTaxIncluded (GncEntry *entry)
|
2002-06-16 00:11:33 -05:00
|
|
|
{
|
|
|
|
if (!entry) return FALSE;
|
2002-09-14 00:32:37 -05:00
|
|
|
return entry->b_taxincluded;
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
GncTaxTable * gncEntryGetBillTaxTable (GncEntry *entry)
|
2002-06-16 00:11:33 -05:00
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
2002-09-14 00:32:37 -05:00
|
|
|
return entry->b_tax_table;
|
2001-11-23 23:35:08 -06:00
|
|
|
}
|
|
|
|
|
2002-07-10 12:32:59 -05:00
|
|
|
gboolean gncEntryGetBillable (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return FALSE;
|
|
|
|
return entry->billable;
|
|
|
|
}
|
|
|
|
|
|
|
|
GncOwner * gncEntryGetBillTo (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return &entry->billto;
|
|
|
|
}
|
|
|
|
|
2003-03-02 22:58:55 -06:00
|
|
|
GncEntryPaymentType gncEntryGetBillPayment (GncEntry* entry)
|
|
|
|
{
|
|
|
|
if (!entry) return 0;
|
|
|
|
return entry->b_payment;
|
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
GncInvoice * gncEntryGetInvoice (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return entry->invoice;
|
|
|
|
}
|
|
|
|
|
|
|
|
GncInvoice * gncEntryGetBill (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return entry->bill;
|
|
|
|
}
|
|
|
|
|
|
|
|
GncOrder * gncEntryGetOrder (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
return entry->order;
|
|
|
|
}
|
|
|
|
|
2001-11-24 23:34:34 -06:00
|
|
|
GncEntry * gncEntryLookup (GNCBook *book, const GUID *guid)
|
|
|
|
{
|
|
|
|
if (!book || !guid) return NULL;
|
|
|
|
return xaccLookupEntity (gnc_book_get_entity_table (book),
|
|
|
|
guid, _GNC_MOD_NAME);
|
|
|
|
}
|
|
|
|
|
2002-06-16 00:11:33 -05:00
|
|
|
/*
|
|
|
|
* This is the logic of computing the total for an Entry, so you know
|
|
|
|
* what values to put into various Splits or to display in the ledger.
|
|
|
|
* In other words, we combine the quantity, unit-price, discount and
|
|
|
|
* taxes together, depending on various flags.
|
|
|
|
*
|
|
|
|
* There are four potental ways to combine these numbers:
|
|
|
|
* Discount: Pre-Tax Post-Tax
|
|
|
|
* Tax : Included Not-Included
|
|
|
|
*
|
|
|
|
* The process is relatively simple:
|
|
|
|
*
|
|
|
|
* 1) compute the agregate price (price*qty)
|
|
|
|
* 2) if taxincluded, then back-compute the agregate pre-tax price
|
|
|
|
* 3) apply discount and taxes in the appropriate order
|
|
|
|
* 4) return the requested results.
|
|
|
|
*
|
|
|
|
* step 2 can be done with agregate taxes; no need to compute them all
|
|
|
|
* unless the caller asked for the tax_value.
|
|
|
|
*
|
|
|
|
* Note that the returned "value" is such that value + tax == "total
|
|
|
|
* to pay," which means in the case of tax-included that the returned
|
|
|
|
* "value" may be less than the agregate price, even without a
|
|
|
|
* discount. If you want to display the tax-included value, you need
|
|
|
|
* to add the value and taxes together. In other words, the value is
|
|
|
|
* the amount the merchant gets; the taxes are the amount the gov't
|
|
|
|
* gets, and the customer pays the sum or value + taxes.
|
|
|
|
*
|
|
|
|
* The discount return value is just for entertainment -- you may way
|
|
|
|
* to let a consumer know how much they saved.
|
|
|
|
*/
|
2002-01-20 20:27:02 -06:00
|
|
|
void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price,
|
2002-06-16 00:11:33 -05:00
|
|
|
GncTaxTable *tax_table, gboolean tax_included,
|
|
|
|
gnc_numeric discount, GncAmountType discount_type,
|
|
|
|
GncDiscountHow discount_how,
|
|
|
|
gnc_numeric *value, gnc_numeric *discount_value,
|
|
|
|
GList **tax_value)
|
|
|
|
{
|
|
|
|
gnc_numeric aggregate;
|
|
|
|
gnc_numeric pretax;
|
|
|
|
gnc_numeric result;
|
|
|
|
gnc_numeric tax;
|
2002-01-21 16:59:44 -06:00
|
|
|
gnc_numeric percent = gnc_numeric_create (100, 1);
|
2002-06-16 00:11:33 -05:00
|
|
|
gnc_numeric tpercent = gnc_numeric_zero ();
|
|
|
|
gnc_numeric tvalue = gnc_numeric_zero ();
|
2002-01-12 22:25:55 -06:00
|
|
|
|
2002-06-16 00:11:33 -05:00
|
|
|
GList * entries = gncTaxTableGetEntries (tax_table);
|
|
|
|
GList * node;
|
2002-01-12 22:25:55 -06:00
|
|
|
|
2002-06-16 00:11:33 -05:00
|
|
|
/* Step 1: compute the aggregate price */
|
2002-01-12 22:25:55 -06:00
|
|
|
|
2002-06-16 00:11:33 -05:00
|
|
|
aggregate = gnc_numeric_mul (qty, price, GNC_DENOM_AUTO, GNC_DENOM_LCD);
|
|
|
|
|
|
|
|
/* Step 2: compute the pre-tax aggregate */
|
|
|
|
|
|
|
|
/* First, compute the aggregate tpercent and tvalue numbers */
|
|
|
|
for (node = entries; node; node = node->next) {
|
|
|
|
GncTaxTableEntry *entry = node->data;
|
|
|
|
gnc_numeric amount = gncTaxTableEntryGetAmount (entry);
|
|
|
|
|
|
|
|
switch (gncTaxTableEntryGetType (entry)) {
|
|
|
|
case GNC_AMT_TYPE_VALUE:
|
|
|
|
tvalue = gnc_numeric_add (tvalue, amount, GNC_DENOM_AUTO,
|
2002-05-27 13:17:31 -05:00
|
|
|
GNC_DENOM_LCD);
|
2002-06-16 00:11:33 -05:00
|
|
|
break;
|
|
|
|
case GNC_AMT_TYPE_PERCENT:
|
|
|
|
tpercent = gnc_numeric_add (tpercent, amount, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_warning ("Unknown tax type: %d", gncTaxTableEntryGetType (entry));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* now we need to convert from 5% -> .05 */
|
|
|
|
tpercent = gnc_numeric_div (tpercent, percent, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
|
|
|
|
/* Next, actually compute the pre-tax aggregate value based on the
|
|
|
|
* taxincluded flag.
|
|
|
|
*/
|
|
|
|
if (tax_table && tax_included) {
|
|
|
|
/* Back-compute the pre-tax aggregate value.
|
|
|
|
* We know that aggregate = pretax + pretax*tpercent + tvalue, so
|
|
|
|
* pretax = (aggregate-tvalue)/(1+tpercent)
|
|
|
|
*/
|
|
|
|
pretax = gnc_numeric_sub (aggregate, tvalue, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
pretax = gnc_numeric_div (pretax,
|
|
|
|
gnc_numeric_add (tpercent,
|
|
|
|
gnc_numeric_create (1, 1),
|
|
|
|
GNC_DENOM_AUTO, GNC_DENOM_LCD),
|
|
|
|
GNC_DENOM_AUTO, GNC_DENOM_LCD);
|
|
|
|
} else {
|
|
|
|
pretax = aggregate;
|
2002-01-21 16:59:44 -06:00
|
|
|
}
|
2002-01-12 22:25:55 -06:00
|
|
|
|
2002-06-16 00:11:33 -05:00
|
|
|
/* Step 3: apply discount and taxes in the appropriate order */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* There are two ways to apply discounts and taxes. In one way, you
|
|
|
|
* always compute the discount off the pretax number, and compute
|
|
|
|
* the taxes off of either the pretax value or "pretax-discount"
|
|
|
|
* value. In the other way, you always compute the tax on "pretax",
|
|
|
|
* and compute the discount on either "pretax" or "pretax+taxes".
|
|
|
|
*
|
|
|
|
* I don't know which is the "correct" way.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Type: discount tax
|
|
|
|
* PRETAX pretax pretax-discount
|
|
|
|
* SAMETIME pretax pretax
|
|
|
|
* POSTTAX pretax+tax pretax
|
|
|
|
*/
|
|
|
|
|
|
|
|
switch (discount_how) {
|
|
|
|
case GNC_DISC_PRETAX:
|
|
|
|
case GNC_DISC_SAMETIME:
|
|
|
|
/* compute the discount from pretax */
|
|
|
|
|
|
|
|
if (discount_type == GNC_AMT_TYPE_PERCENT) {
|
|
|
|
discount = gnc_numeric_div (discount, percent, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
discount = gnc_numeric_mul (pretax, discount, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
}
|
|
|
|
|
|
|
|
result = gnc_numeric_sub (pretax, discount, GNC_DENOM_AUTO, GNC_DENOM_LCD);
|
2002-01-12 22:25:55 -06:00
|
|
|
|
2002-06-16 00:11:33 -05:00
|
|
|
/* Figure out when to apply the tax, pretax or pretax-discount */
|
|
|
|
if (discount_how == GNC_DISC_PRETAX)
|
|
|
|
pretax = result;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GNC_DISC_POSTTAX:
|
|
|
|
/* compute discount on pretax+taxes */
|
|
|
|
|
|
|
|
if (discount_type == GNC_AMT_TYPE_PERCENT) {
|
|
|
|
gnc_numeric after_tax;
|
|
|
|
|
|
|
|
tax = gnc_numeric_mul (pretax, tpercent, GNC_DENOM_AUTO, GNC_DENOM_LCD);
|
|
|
|
after_tax = gnc_numeric_add (pretax, tax, GNC_DENOM_AUTO, GNC_DENOM_LCD);
|
|
|
|
after_tax = gnc_numeric_add (after_tax, tvalue, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
discount = gnc_numeric_div (discount, percent, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
discount = gnc_numeric_mul (after_tax, discount, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
}
|
|
|
|
|
|
|
|
result = gnc_numeric_sub (pretax, discount, GNC_DENOM_AUTO, GNC_DENOM_LCD);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
g_warning ("unknown DiscountHow value: %d", discount_how);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Step 4: return the requested results. */
|
|
|
|
|
|
|
|
/* result == amount merchant gets
|
|
|
|
* discount == amount of discount
|
|
|
|
* need to compute taxes (based on 'pretax') if the caller wants it.
|
|
|
|
*/
|
2002-05-24 16:19:45 -05:00
|
|
|
|
|
|
|
if (discount_value != NULL)
|
|
|
|
*discount_value = discount;
|
|
|
|
|
2002-01-12 22:25:55 -06:00
|
|
|
if (value != NULL)
|
2002-06-16 00:11:33 -05:00
|
|
|
*value = result;
|
2002-01-12 22:25:55 -06:00
|
|
|
|
2002-06-16 00:11:33 -05:00
|
|
|
/* Now... Compute the list of tax values (if the caller wants it) */
|
2002-01-12 22:25:55 -06:00
|
|
|
|
|
|
|
if (tax_value != NULL) {
|
2002-06-16 00:11:33 -05:00
|
|
|
GList * taxes = NULL;
|
|
|
|
|
|
|
|
for (node = entries; node; node = node->next) {
|
|
|
|
GncTaxTableEntry *entry = node->data;
|
|
|
|
Account *acc = gncTaxTableEntryGetAccount (entry);
|
|
|
|
gnc_numeric amount = gncTaxTableEntryGetAmount (entry);
|
|
|
|
|
|
|
|
g_return_if_fail (acc);
|
|
|
|
|
|
|
|
switch (gncTaxTableEntryGetType (entry)) {
|
|
|
|
case GNC_AMT_TYPE_VALUE:
|
|
|
|
taxes = gncAccountValueAdd (taxes, acc, amount);
|
|
|
|
break;
|
|
|
|
case GNC_AMT_TYPE_PERCENT:
|
|
|
|
amount = gnc_numeric_div (amount, percent, GNC_DENOM_AUTO,
|
|
|
|
GNC_DENOM_LCD);
|
|
|
|
tax = gnc_numeric_mul (pretax, amount, GNC_DENOM_AUTO, GNC_DENOM_LCD);
|
|
|
|
taxes = gncAccountValueAdd (taxes, acc, tax);
|
|
|
|
break;
|
|
|
|
default:
|
2002-11-17 23:05:48 -06:00
|
|
|
break;
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
2002-01-21 16:59:44 -06:00
|
|
|
}
|
2002-06-16 00:11:33 -05:00
|
|
|
*tax_value = taxes;
|
2002-01-12 22:25:55 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2002-05-27 13:17:31 -05:00
|
|
|
static int
|
|
|
|
get_commodity_denom (GncEntry *entry)
|
|
|
|
{
|
2002-07-09 23:12:19 -05:00
|
|
|
gnc_commodity *c;
|
2002-05-27 13:17:31 -05:00
|
|
|
if (!entry)
|
|
|
|
return 0;
|
|
|
|
if (entry->invoice) {
|
2003-01-12 16:07:33 -06:00
|
|
|
c = gncInvoiceGetCurrency (entry->invoice);
|
2002-07-09 23:12:19 -05:00
|
|
|
if (c)
|
|
|
|
return (gnc_commodity_get_fraction (c));
|
|
|
|
}
|
|
|
|
if (entry->bill) {
|
2003-01-12 16:07:33 -06:00
|
|
|
c = gncInvoiceGetCurrency (entry->bill);
|
2002-05-27 13:17:31 -05:00
|
|
|
if (c)
|
|
|
|
return (gnc_commodity_get_fraction (c));
|
|
|
|
}
|
|
|
|
return 100000;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gncEntryRecomputeValues (GncEntry *entry)
|
|
|
|
{
|
|
|
|
int denom;
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* See if either tax table changed since we last computed values */
|
|
|
|
if (entry->i_tax_table) {
|
|
|
|
Timespec modtime = gncTaxTableLastModified (entry->i_tax_table);
|
|
|
|
if (timespec_cmp (&entry->i_taxtable_modtime, &modtime)) {
|
2002-06-16 00:11:33 -05:00
|
|
|
entry->values_dirty = TRUE;
|
2002-09-14 00:32:37 -05:00
|
|
|
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;
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-05-27 13:17:31 -05:00
|
|
|
if (!entry->values_dirty)
|
|
|
|
return;
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* Clear the last-computed tax values */
|
|
|
|
if (entry->i_tax_values) {
|
|
|
|
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;
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
/* Compute the invoice values */
|
|
|
|
gncEntryComputeValue (entry->quantity, entry->i_price,
|
|
|
|
(entry->i_taxable ? entry->i_tax_table : NULL),
|
|
|
|
entry->i_taxincluded,
|
|
|
|
entry->i_discount, entry->i_disc_type,
|
|
|
|
entry->i_disc_how,
|
|
|
|
&(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));
|
2002-05-27 13:17:31 -05:00
|
|
|
|
|
|
|
denom = get_commodity_denom (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
entry->i_value_rounded = gnc_numeric_convert (entry->i_value, denom,
|
|
|
|
GNC_RND_ROUND);
|
|
|
|
entry->i_disc_value_rounded = gnc_numeric_convert (entry->i_disc_value, denom,
|
|
|
|
GNC_RND_ROUND);
|
|
|
|
entry->i_tax_value = gncAccountValueTotal (entry->i_tax_values);
|
|
|
|
entry->i_tax_value_rounded = gnc_numeric_convert (entry->i_tax_value, denom,
|
|
|
|
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);
|
2002-05-27 13:17:31 -05:00
|
|
|
entry->values_dirty = FALSE;
|
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
void gncEntryGetValue (GncEntry *entry, gboolean is_inv, gnc_numeric *value,
|
2002-06-16 00:11:33 -05:00
|
|
|
gnc_numeric *discount_value, gnc_numeric *tax_value,
|
|
|
|
GList **tax_values)
|
2002-01-20 20:27:02 -06:00
|
|
|
{
|
|
|
|
if (!entry) return;
|
2002-05-27 13:17:31 -05:00
|
|
|
gncEntryRecomputeValues (entry);
|
|
|
|
if (value)
|
2002-09-14 00:32:37 -05:00
|
|
|
*value = (is_inv ? entry->i_value : entry->b_value);
|
2002-05-27 13:17:31 -05:00
|
|
|
if (discount_value)
|
2002-09-14 00:32:37 -05:00
|
|
|
*discount_value = (is_inv ? entry->i_disc_value : gnc_numeric_zero());
|
2002-06-16 00:11:33 -05:00
|
|
|
if (tax_value)
|
2002-09-14 00:32:37 -05:00
|
|
|
*tax_value = (is_inv ? entry->i_tax_value : entry->b_tax_value);
|
2002-06-16 00:11:33 -05:00
|
|
|
if (tax_values)
|
2002-09-14 00:32:37 -05:00
|
|
|
*tax_values = (is_inv ? entry->i_tax_values : entry->b_tax_values);
|
2002-01-20 20:27:02 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gnc_numeric gncEntryReturnValue (GncEntry *entry, gboolean is_inv)
|
2002-02-24 23:02:21 -06:00
|
|
|
{
|
2002-05-27 13:17:31 -05:00
|
|
|
if (!entry) return gnc_numeric_zero();
|
|
|
|
gncEntryRecomputeValues (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
return (is_inv ? entry->i_value_rounded : entry->b_value_rounded);
|
2002-02-24 23:02:21 -06:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gnc_numeric gncEntryReturnTaxValue (GncEntry *entry, gboolean is_inv)
|
2002-02-24 23:02:21 -06:00
|
|
|
{
|
2002-05-27 13:17:31 -05:00
|
|
|
if (!entry) return gnc_numeric_zero();
|
|
|
|
gncEntryRecomputeValues (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
return (is_inv ? entry->i_tax_value_rounded : entry->b_tax_value_rounded);
|
2002-05-24 16:19:45 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
GList * gncEntryReturnTaxValues (GncEntry *entry, gboolean is_inv)
|
2002-06-16 00:11:33 -05:00
|
|
|
{
|
|
|
|
if (!entry) return NULL;
|
|
|
|
gncEntryRecomputeValues (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
return (is_inv ? entry->i_tax_values : entry->b_tax_values);
|
2002-06-16 00:11:33 -05:00
|
|
|
}
|
|
|
|
|
2002-09-14 00:32:37 -05:00
|
|
|
gnc_numeric gncEntryReturnDiscountValue (GncEntry *entry, gboolean is_inv)
|
2002-05-24 16:19:45 -05:00
|
|
|
{
|
2002-05-27 13:17:31 -05:00
|
|
|
if (!entry) return gnc_numeric_zero();
|
|
|
|
gncEntryRecomputeValues (entry);
|
2002-09-14 00:32:37 -05:00
|
|
|
return (is_inv ? entry->i_disc_value_rounded : gnc_numeric_zero());
|
2002-02-24 23:02:21 -06:00
|
|
|
}
|
|
|
|
|
2002-11-03 14:21:42 -06:00
|
|
|
gboolean gncEntryIsOpen (GncEntry *entry)
|
|
|
|
{
|
|
|
|
if (!entry) return FALSE;
|
|
|
|
return (entry->editlevel > 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void gncEntryBeginEdit (GncEntry *entry)
|
|
|
|
{
|
|
|
|
GNC_BEGIN_EDIT (entry, _GNC_MOD_NAME);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void gncEntryOnError (GncEntry *entry, GNCBackendError errcode)
|
|
|
|
{
|
|
|
|
PERR("Entry Backend Failure: %d", errcode);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void gncEntryOnDone (GncEntry *entry)
|
2001-11-21 19:23:07 -06:00
|
|
|
{
|
2002-03-04 13:34:52 -06:00
|
|
|
entry->dirty = FALSE;
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|
|
|
|
|
2002-11-03 14:21:42 -06:00
|
|
|
void gncEntryCommitEdit (GncEntry *entry)
|
|
|
|
{
|
|
|
|
GNC_COMMIT_EDIT_PART1 (entry);
|
|
|
|
GNC_COMMIT_EDIT_PART2 (entry, _GNC_MOD_NAME, gncEntryOnError,
|
|
|
|
gncEntryOnDone, gncEntryFree);
|
|
|
|
}
|
|
|
|
|
2002-02-03 14:01:08 -06:00
|
|
|
int gncEntryCompare (GncEntry *a, GncEntry *b)
|
|
|
|
{
|
|
|
|
int compare;
|
|
|
|
|
|
|
|
if (a == b) return 0;
|
|
|
|
if (!a && b) return -1;
|
|
|
|
if (a && !b) return 1;
|
|
|
|
|
|
|
|
compare = timespec_cmp (&(a->date), &(b->date));
|
2002-02-27 23:10:07 -06:00
|
|
|
if (compare) return compare;
|
|
|
|
|
|
|
|
compare = timespec_cmp (&(a->date_entered), &(b->date_entered));
|
|
|
|
if (compare) return compare;
|
2002-02-03 14:01:08 -06:00
|
|
|
|
|
|
|
compare = safe_strcmp (a->desc, b->desc);
|
2002-02-27 23:10:07 -06:00
|
|
|
if (compare) return compare;
|
2002-02-03 14:01:08 -06:00
|
|
|
|
|
|
|
compare = safe_strcmp (a->action, b->action);
|
2002-02-27 23:10:07 -06:00
|
|
|
if (compare) return compare;
|
2002-02-03 14:01:08 -06:00
|
|
|
|
|
|
|
return guid_compare (&(a->guid), &(b->guid));
|
|
|
|
}
|
|
|
|
|
2001-11-24 23:34:34 -06:00
|
|
|
/* Package-Private functions */
|
|
|
|
|
|
|
|
static void addObj (GncEntry *entry)
|
|
|
|
{
|
2002-02-24 16:12:24 -06:00
|
|
|
gncBusinessAddObject (entry->book, _GNC_MOD_NAME, entry, &entry->guid);
|
2001-11-24 23:34:34 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
static void remObj (GncEntry *entry)
|
|
|
|
{
|
2002-02-24 16:12:24 -06:00
|
|
|
gncBusinessRemoveObject (entry->book, _GNC_MOD_NAME, &entry->guid);
|
2001-11-24 23:34:34 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
static void _gncEntryCreate (GNCBook *book)
|
|
|
|
{
|
2002-02-24 16:12:24 -06:00
|
|
|
gncBusinessCreate (book, _GNC_MOD_NAME);
|
2001-11-24 23:34:34 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
static void _gncEntryDestroy (GNCBook *book)
|
|
|
|
{
|
2002-02-24 16:12:24 -06:00
|
|
|
gncBusinessDestroy (book, _GNC_MOD_NAME);
|
|
|
|
}
|
2001-11-24 23:34:34 -06:00
|
|
|
|
2002-02-24 16:12:24 -06:00
|
|
|
static gboolean _gncEntryIsDirty (GNCBook *book)
|
|
|
|
{
|
|
|
|
return gncBusinessIsDirty (book, _GNC_MOD_NAME);
|
2001-11-24 23:34:34 -06:00
|
|
|
}
|
|
|
|
|
2002-03-04 13:34:52 -06:00
|
|
|
static void _gncEntryMarkClean (GNCBook *book)
|
|
|
|
{
|
|
|
|
gncBusinessSetDirtyFlag (book, _GNC_MOD_NAME, FALSE);
|
|
|
|
}
|
|
|
|
|
2002-02-03 14:01:08 -06:00
|
|
|
static void _gncEntryForeach (GNCBook *book, foreachObjectCB cb,
|
|
|
|
gpointer user_data)
|
|
|
|
{
|
|
|
|
gncBusinessForeach (book, _GNC_MOD_NAME, cb, user_data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static GncObject_t gncEntryDesc = {
|
|
|
|
GNC_OBJECT_VERSION,
|
2001-11-24 23:34:34 -06:00
|
|
|
_GNC_MOD_NAME,
|
2002-07-09 23:12:19 -05:00
|
|
|
"Order/Invoice/Bill Entry",
|
2001-11-24 23:34:34 -06:00
|
|
|
_gncEntryCreate,
|
|
|
|
_gncEntryDestroy,
|
2002-02-24 16:12:24 -06:00
|
|
|
_gncEntryIsDirty,
|
2002-03-04 13:34:52 -06:00
|
|
|
_gncEntryMarkClean,
|
2002-02-03 14:01:08 -06:00
|
|
|
_gncEntryForeach,
|
2001-11-21 19:23:07 -06:00
|
|
|
NULL /* printable */
|
|
|
|
};
|
|
|
|
|
|
|
|
gboolean gncEntryRegister (void)
|
|
|
|
{
|
2002-02-03 14:01:08 -06:00
|
|
|
static QueryObjectDef params[] = {
|
|
|
|
{ ENTRY_DATE, QUERYCORE_DATE, (QueryAccess)gncEntryGetDate },
|
2002-07-02 17:08:00 -05:00
|
|
|
{ ENTRY_DATE_ENTERED, QUERYCORE_DATE, (QueryAccess)gncEntryGetDateEntered },
|
2002-02-03 14:01:08 -06:00
|
|
|
{ ENTRY_DESC, QUERYCORE_STRING, (QueryAccess)gncEntryGetDescription },
|
|
|
|
{ ENTRY_ACTION, QUERYCORE_STRING, (QueryAccess)gncEntryGetAction },
|
2002-06-16 23:04:05 -05:00
|
|
|
{ ENTRY_NOTES, QUERYCORE_STRING, (QueryAccess)gncEntryGetNotes },
|
2002-02-03 14:01:08 -06:00
|
|
|
{ ENTRY_QTY, QUERYCORE_NUMERIC, (QueryAccess)gncEntryGetQuantity },
|
2002-09-14 00:32:37 -05:00
|
|
|
{ ENTRY_IPRICE, QUERYCORE_NUMERIC, (QueryAccess)gncEntryGetInvPrice },
|
|
|
|
{ ENTRY_BPRICE, QUERYCORE_NUMERIC, (QueryAccess)gncEntryGetBillPrice },
|
2002-02-03 19:55:33 -06:00
|
|
|
{ ENTRY_INVOICE, GNC_INVOICE_MODULE_NAME, (QueryAccess)gncEntryGetInvoice },
|
2002-07-09 23:12:19 -05:00
|
|
|
{ ENTRY_BILL, GNC_INVOICE_MODULE_NAME, (QueryAccess)gncEntryGetBill },
|
2002-07-10 12:32:59 -05:00
|
|
|
{ ENTRY_BILLABLE, QUERYCORE_BOOLEAN, (QueryAccess)gncEntryGetBillable },
|
|
|
|
{ ENTRY_BILLTO, GNC_OWNER_MODULE_NAME, (QueryAccess)gncEntryGetBillTo },
|
2002-02-03 19:55:33 -06:00
|
|
|
{ ENTRY_ORDER, GNC_ORDER_MODULE_NAME, (QueryAccess)gncEntryGetOrder },
|
2002-02-24 16:12:24 -06:00
|
|
|
{ QUERY_PARAM_BOOK, GNC_ID_BOOK, (QueryAccess)gncEntryGetBook },
|
|
|
|
{ QUERY_PARAM_GUID, QUERYCORE_GUID, (QueryAccess)gncEntryGetGUID },
|
2002-02-03 14:01:08 -06:00
|
|
|
{ NULL },
|
|
|
|
};
|
|
|
|
|
2002-02-03 19:55:33 -06:00
|
|
|
gncQueryObjectRegister (_GNC_MOD_NAME, (QuerySort)gncEntryCompare, params);
|
2002-02-03 14:01:08 -06:00
|
|
|
|
|
|
|
return gncObjectRegister (&gncEntryDesc);
|
2001-11-21 19:23:07 -06:00
|
|
|
}
|