add qofinstance to vendor

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@9504 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas 2003-10-14 13:46:24 +00:00
parent a15de4f933
commit c1935ea584
9 changed files with 163 additions and 113 deletions

View File

@ -89,7 +89,7 @@ customer_dom_tree_create (GncCustomer *cust)
xmlSetProp(ret, "version", customer_version_string);
xmlAddChild(ret, guid_to_dom_tree(cust_guid_string,
gncCustomerGetGUID (cust)));
qof_instance_get_guid(QOF_INSTANCE(cust))));
xmlAddChild(ret, text_to_dom_tree(cust_name_string,
gncCustomerGetName (cust)));

View File

@ -91,7 +91,7 @@ ttentry_dom_tree_create (GncTaxTableEntry *entry)
account = gncTaxTableEntryGetAccount (entry);
if (account)
xmlAddChild(ret, guid_to_dom_tree (ttentry_account_string,
xaccAccountGetGUID (account)));
qof_instance_get_guid (QOF_INSTANCE(account))));
amount = gncTaxTableEntryGetAmount (entry);
xmlAddChild (ret, gnc_numeric_to_dom_tree (ttentry_amount_string, &amount));

View File

@ -85,7 +85,7 @@ vendor_dom_tree_create (GncVendor *vendor)
xmlSetProp(ret, "version", vendor_version_string);
xmlAddChild(ret, guid_to_dom_tree(vendor_guid_string,
gncVendorGetGUID (vendor)));
qof_instance_get_guid (QOF_INSTANCE(vendor))));
xmlAddChild(ret, text_to_dom_tree(vendor_name_string,
gncVendorGetName (vendor)));

View File

@ -1,16 +1,41 @@
XXX TODO:
-- billterm and taxtermss are incompletely cloned, not sure
-- instance should somehow reference the qoftype, so that
things like gnc_engine_generate_event wouldn't
need three args ...
(in fact, so that many things wouldn't need to pass type explicitly)
entity node already stores type, so entity_node should be merged
with instance (or be parent of instance ?!)
-- bus obj has per-type hash tables that are identical to the entity
per-type hash tables, should be merged together.
-- bus object foreach should be made into a for-each by type
(requires modes to book for each to be a type-foreach).
(this would also add a per-type edit/commmit-edit, clone, dirty,
etc. functions!) Yahoo!
-- billterm and taxtables are incompletely cloned, not sure
what to do with refcount, ask warlord, need to explore.
-- jobs incomplete cloned, neeed to handle owners
-- onwers incomplete cloned, neeed to handle remaining 'owners'
-- turn clone into a generic object callback, so that
the ObtainTwin could be qof_instance_obtain_twin,
a generic function. (right now its copied everywhere)
-- most of the busienss objects have an id/name/desc
-- The following busines objects have an id/name/desc/active
this could be abstracted into an common object.
vendor (customer)
bill term (but bill terms doesn't have id or active)
job
-- gnVendor should be a base class to gncCustomer (they're
identical, but customer adds more stuff).
Enployee could be base class for vendor, its got some of the
things (name, addr, active, currency)
-- TaxTable and BillTerm have common parent/child code.
this could be abstracted into common code.

View File

@ -58,22 +58,24 @@
struct _gncCustomer
{
QofInstance inst;
/* The following fields are identical to 'vendor' */
char * id;
char * name;
char * notes;
GncBillTerm * terms;
GncAddress * addr;
GncAddress * shipaddr;
gnc_commodity * currency;
gnc_numeric discount;
gnc_numeric credit;
GncTaxTable* taxtable;
gboolean taxtable_override;
GncTaxIncluded taxincluded;
gboolean active;
GList * jobs;
GncTaxTable* taxtable;
gboolean taxtable_override;
/* The following fields aer unique to 'customer' */
gnc_numeric credit;
gnc_numeric discount;
GncAddress * shipaddr;
};
static short module = MOD_BUSINESS;
@ -117,17 +119,19 @@ GncCustomer *gncCustomerCreate (QofBook *book)
cust = g_new0 (GncCustomer, 1);
qof_instance_init (&cust->inst, book);
cust->id = CACHE_INSERT ("");
cust->name = CACHE_INSERT ("");
cust->notes = CACHE_INSERT ("");
cust->addr = gncAddressCreate (book, &cust->inst.guid, _GNC_MOD_NAME);
cust->shipaddr = gncAddressCreate (book, &cust->inst.guid, _GNC_MOD_NAME);
cust->discount = gnc_numeric_zero();
cust->credit = gnc_numeric_zero();
cust->taxincluded = GNC_TAXINCLUDED_USEGLOBAL;
cust->active = TRUE;
cust->jobs = NULL;
cust->discount = gnc_numeric_zero();
cust->credit = gnc_numeric_zero();
cust->shipaddr = gncAddressCreate (book, &cust->inst.guid, _GNC_MOD_NAME);
addObj (cust);
gnc_engine_generate_event (&cust->inst.guid, _GNC_MOD_NAME, GNC_EVENT_CREATE);
@ -416,20 +420,19 @@ void gncCustomerBeginEdit (GncCustomer *cust)
GNC_BEGIN_EDIT (&cust->inst, _GNC_MOD_NAME);
}
static void gncCustomerOnError (QofInstance *inst, QofBackendError errcode)
static inline void gncCustomerOnError (QofInstance *inst, QofBackendError errcode)
{
PERR("Customer QofBackend Failure: %d", errcode);
}
static void gncCustomerOnDone (QofInstance *inst)
static inline void gncCustomerOnDone (QofInstance *inst)
{
GncCustomer *cust = (GncCustomer *) inst;
cust->inst.dirty = FALSE;
gncAddressClearDirty (cust->addr);
gncAddressClearDirty (cust->shipaddr);
}
static void cust_free (QofInstance *inst)
static inline void cust_free (QofInstance *inst)
{
GncCustomer *cust = (GncCustomer *) inst;
gncCustomerFree (cust);

View File

@ -232,7 +232,7 @@ const GUID * gncOwnerGetGUID (GncOwner *owner)
case GNC_OWNER_JOB:
return qof_instance_get_guid (QOF_INSTANCE(owner->owner.job));
case GNC_OWNER_VENDOR:
return gncVendorGetGUID (owner->owner.vendor);
return qof_instance_get_guid (QOF_INSTANCE(owner->owner.vendor));
case GNC_OWNER_EMPLOYEE:
return gncEmployeeGetGUID (owner->owner.employee);
}

View File

@ -1,5 +1,26 @@
/********************************************************************\
* gncVendor.c -- the Core Vendor Interface *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 59 Temple Place - Suite 330 Fax: +1-617-542-2652 *
* Boston, MA 02111-1307, USA gnu@gnu.org *
* *
\********************************************************************/
/*
* gncVendor.c -- the Core Vendor Interface
* Copyright (C) 2001, 2002 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
@ -11,63 +32,71 @@
#include "guid.h"
#include "messages.h"
#include "gnc-book.h"
#include "gnc-commodity.h"
#include "gnc-engine-util.h"
#include "gnc-event-p.h"
#include "qofid.h"
#include "qofquerycore.h"
#include "qofquery.h"
#include "qofclass.h"
#include "gnc-be-utils.h"
#include "qofbook.h"
#include "qofclass.h"
#include "qofid.h"
#include "qofid-p.h"
#include "qofinstance.h"
#include "qofquery.h"
#include "qofquerycore.h"
#include "gncBusiness.h"
#include "gncVendor.h"
#include "gncVendorP.h"
#include "gncAddress.h"
struct _gncVendor {
QofBook * book;
GUID guid;
char * id;
char * name;
char * notes;
GncBillTerm * terms;
GncAddress * addr;
struct _gncVendor
{
QofInstance inst;
char * id;
char * name;
char * notes;
GncBillTerm * terms;
GncAddress * addr;
gnc_commodity * currency;
GncTaxIncluded taxincluded;
gboolean active;
GList * jobs;
GncTaxTable* taxtable;
gboolean taxtable_override;
int editlevel;
gboolean do_free;
gboolean dirty;
GncTaxTable* taxtable;
gboolean taxtable_override;
GncTaxIncluded taxincluded;
gboolean active;
GList * jobs;
};
static short module = MOD_BUSINESS;
static short module = MOD_BUSINESS;
#define _GNC_MOD_NAME GNC_VENDOR_MODULE_NAME
#define _GNC_MOD_NAME GNC_VENDOR_MODULE_NAME
/* ============================================================ */
/* Misc inline funcs */
#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));
static void addObj (GncVendor *vendor);
static void remObj (GncVendor *vendor);
static inline void addObj (GncVendor *vendor)
{
gncBusinessAddObject (vendor->inst.book, _GNC_MOD_NAME, vendor, &vendor->inst.guid);
}
static inline void remObj (GncVendor *vendor)
{
gncBusinessRemoveObject (vendor->inst.book, _GNC_MOD_NAME, &vendor->inst.guid);
}
G_INLINE_FUNC void mark_vendor (GncVendor *vendor);
G_INLINE_FUNC void
mark_vendor (GncVendor *vendor)
{
vendor->dirty = TRUE;
gncBusinessSetDirtyFlag (vendor->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&vendor->guid, _GNC_MOD_NAME, GNC_EVENT_MODIFY);
vendor->inst.dirty = TRUE;
gncBusinessSetDirtyFlag (vendor->inst.book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&vendor->inst.guid, _GNC_MOD_NAME, GNC_EVENT_MODIFY);
}
/* ============================================================== */
/* Create/Destroy Functions */
GncVendor *gncVendorCreate (QofBook *book)
@ -77,19 +106,18 @@ GncVendor *gncVendorCreate (QofBook *book)
if (!book) return NULL;
vendor = g_new0 (GncVendor, 1);
vendor->book = book;
vendor->dirty = FALSE;
qof_instance_init (&vendor->inst, book);
vendor->id = CACHE_INSERT ("");
vendor->name = CACHE_INSERT ("");
vendor->notes = CACHE_INSERT ("");
vendor->addr = gncAddressCreate (book, &vendor->guid, _GNC_MOD_NAME);
vendor->addr = gncAddressCreate (book, &vendor->inst.guid, _GNC_MOD_NAME);
vendor->taxincluded = GNC_TAXINCLUDED_USEGLOBAL;
vendor->active = TRUE;
vendor->jobs = NULL;
qof_entity_guid_new (qof_book_get_entity_table (book), &vendor->guid);
addObj (vendor);
gnc_engine_generate_event (&vendor->guid, _GNC_MOD_NAME, GNC_EVENT_CREATE);
gnc_engine_generate_event (&vendor->inst.guid, _GNC_MOD_NAME, GNC_EVENT_CREATE);
return vendor;
}
@ -97,7 +125,7 @@ GncVendor *gncVendorCreate (QofBook *book)
void gncVendorDestroy (GncVendor *vendor)
{
if (!vendor) return;
vendor->do_free = TRUE;
vendor->inst.do_free = TRUE;
gncVendorCommitEdit (vendor);
}
@ -105,7 +133,7 @@ static void gncVendorFree (GncVendor *vendor)
{
if (!vendor) return;
gnc_engine_generate_event (&vendor->guid, _GNC_MOD_NAME, GNC_EVENT_DESTROY);
gnc_engine_generate_event (&vendor->inst.guid, _GNC_MOD_NAME, GNC_EVENT_DESTROY);
CACHE_REMOVE (vendor->id);
CACHE_REMOVE (vendor->name);
@ -123,17 +151,18 @@ static void gncVendorFree (GncVendor *vendor)
g_free (vendor);
}
/* ============================================================== */
/* Set Functions */
#define SET_STR(obj, member, str) { \
char * tmp; \
\
if (!safe_strcmp (member, str)) return; \
gncVendorBeginEdit (obj); \
tmp = CACHE_INSERT (str); \
CACHE_REMOVE (member); \
member = tmp; \
}
char * tmp; \
\
if (!safe_strcmp (member, str)) return; \
gncVendorBeginEdit (obj); \
tmp = CACHE_INSERT (str); \
CACHE_REMOVE (member); \
member = tmp; \
}
void gncVendorSetID (GncVendor *vendor, const char *id)
{
@ -165,11 +194,12 @@ void gncVendorSetNotes (GncVendor *vendor, const char *notes)
void gncVendorSetGUID (GncVendor *vendor, const GUID *guid)
{
if (!vendor || !guid) return;
if (guid_equal (guid, &vendor->guid)) return;
if (guid_equal (guid, &vendor->inst.guid)) return;
/* XXX this looks fishy to me, this can't possibly be right */
gncVendorBeginEdit (vendor);
remObj (vendor);
vendor->guid = *guid;
vendor->inst.guid = *guid;
addObj (vendor);
gncVendorCommitEdit (vendor);
}
@ -245,20 +275,9 @@ void gncVendorSetTaxTable (GncVendor *vendor, GncTaxTable *table)
gncVendorCommitEdit (vendor);
}
/* ============================================================== */
/* Get Functions */
QofBook * gncVendorGetBook (GncVendor *vendor)
{
if (!vendor) return NULL;
return vendor->book;
}
const GUID * gncVendorGetGUID (GncVendor *vendor)
{
if (!vendor) return NULL;
return &vendor->guid;
}
const char * gncVendorGetID (GncVendor *vendor)
{
if (!vendor) return NULL;
@ -327,9 +346,9 @@ void gncVendorAddJob (GncVendor *vendor, GncJob *job)
if (g_list_index(vendor->jobs, job) == -1)
vendor->jobs = g_list_insert_sorted (vendor->jobs, job,
(GCompareFunc)gncJobCompare);
(GCompareFunc)gncJobCompare);
gnc_engine_generate_event (&vendor->guid, _GNC_MOD_NAME, GNC_EVENT_MODIFY);
gnc_engine_generate_event (&vendor->inst.guid, _GNC_MOD_NAME, GNC_EVENT_MODIFY);
}
void gncVendorRemoveJob (GncVendor *vendor, GncJob *job)
@ -347,32 +366,39 @@ void gncVendorRemoveJob (GncVendor *vendor, GncJob *job)
g_list_free_1 (node);
}
gnc_engine_generate_event (&vendor->guid, _GNC_MOD_NAME, GNC_EVENT_MODIFY);
gnc_engine_generate_event (&vendor->inst.guid, _GNC_MOD_NAME, GNC_EVENT_MODIFY);
}
void gncVendorBeginEdit (GncVendor *vendor)
{
GNC_BEGIN_EDIT (vendor, _GNC_MOD_NAME);
GNC_BEGIN_EDIT (&vendor->inst, _GNC_MOD_NAME);
}
static void gncVendorOnError (GncVendor *vendor, QofBackendError errcode)
static inline void gncVendorOnError (QofInstance *vendor, QofBackendError errcode)
{
PERR("Vendor QofBackend Failure: %d", errcode);
}
static void gncVendorOnDone (GncVendor *vendor)
static inline void gncVendorOnDone (QofInstance *inst)
{
vendor->dirty = FALSE;
GncVendor *vendor = (GncVendor *) inst;
gncAddressClearDirty (vendor->addr);
}
static inline void vendor_free (QofInstance *inst)
{
GncVendor *vendor = (GncVendor *) inst;
gncVendorFree (vendor);
}
void gncVendorCommitEdit (GncVendor *vendor)
{
GNC_COMMIT_EDIT_PART1 (vendor);
GNC_COMMIT_EDIT_PART2 (vendor, _GNC_MOD_NAME, gncVendorOnError,
gncVendorOnDone, gncVendorFree);
GNC_COMMIT_EDIT_PART1 (&vendor->inst);
GNC_COMMIT_EDIT_PART2 (&vendor->inst, _GNC_MOD_NAME, gncVendorOnError,
gncVendorOnDone, vendor_free);
}
/* ============================================================== */
/* Other functions */
int gncVendorCompare (GncVendor *a, GncVendor *b)
@ -395,7 +421,7 @@ GList * gncVendorGetJoblist (GncVendor *vendor, gboolean show_all)
for (iterator = vendor->jobs; iterator; iterator=iterator->next) {
GncJob *j = iterator->data;
if (gncJobGetActive (j))
list = g_list_append (list, j);
list = g_list_append (list, j);
}
return list;
}
@ -406,7 +432,7 @@ GUID gncVendorRetGUID (GncVendor *vendor)
if (!vendor)
return *guid_null();
return vendor->guid;
return vendor->inst.guid;
}
GncVendor * gncVendorLookupDirect (GUID guid, QofBook *book)
@ -419,27 +445,18 @@ GncVendor * gncVendorLookup (QofBook *book, const GUID *guid)
{
if (!book || !guid) return NULL;
return qof_entity_lookup (gnc_book_get_entity_table (book),
guid, _GNC_MOD_NAME);
guid, _GNC_MOD_NAME);
}
gboolean gncVendorIsDirty (GncVendor *vendor)
{
if (!vendor) return FALSE;
return (vendor->dirty || gncAddressIsDirty (vendor->addr));
return (vendor->inst.dirty || gncAddressIsDirty (vendor->addr));
}
/* ============================================================== */
/* Package-Private functions */
static void addObj (GncVendor *vendor)
{
gncBusinessAddObject (vendor->book, _GNC_MOD_NAME, vendor, &vendor->guid);
}
static void remObj (GncVendor *vendor)
{
gncBusinessRemoveObject (vendor->book, _GNC_MOD_NAME, &vendor->guid);
}
static void _gncVendorCreate (QofBook *book)
{
gncBusinessCreate (book, _GNC_MOD_NAME);
@ -461,7 +478,7 @@ static void _gncVendorMarkClean (QofBook *book)
}
static void _gncVendorForeach (QofBook *book, QofEntityForeachCB cb,
gpointer user_data)
gpointer user_data)
{
gncBusinessForeach (book, _GNC_MOD_NAME, cb, user_data);
}
@ -494,8 +511,8 @@ gboolean gncVendorRegister (void)
{ VENDOR_ID, QOF_TYPE_STRING, (QofAccessFunc)gncVendorGetID, NULL },
{ VENDOR_NAME, QOF_TYPE_STRING, (QofAccessFunc)gncVendorGetName, NULL },
{ VENDOR_ADDR, GNC_ADDRESS_MODULE_NAME, (QofAccessFunc)gncVendorGetAddr, NULL },
{ QOF_QUERY_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc)gncVendorGetBook, NULL },
{ QOF_QUERY_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc)gncVendorGetGUID, NULL },
{ QOF_QUERY_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc)qof_instance_get_book, NULL },
{ QOF_QUERY_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc)qof_instance_get_guid, NULL },
{ QOF_QUERY_PARAM_ACTIVE, QOF_TYPE_BOOLEAN, (QofAccessFunc)gncVendorGetActive, NULL },
{ NULL },
};

View File

@ -43,8 +43,6 @@ void gncVendorCommitEdit (GncVendor *vendor);
/* Get Functions */
QofBook * gncVendorGetBook (GncVendor *vendor);
const GUID * gncVendorGetGUID (GncVendor *vendor);
const char * gncVendorGetID (GncVendor *vendor);
const char * gncVendorGetName (GncVendor *vendor);
GncAddress * gncVendorGetAddr (GncVendor *vendor);
@ -57,6 +55,9 @@ gboolean gncVendorGetActive (GncVendor *vendor);
gboolean gncVendorGetTaxTableOverride (GncVendor *vendor);
GncTaxTable* gncVendorGetTaxTable (GncVendor *vendor);
/** XXX should be renamed to RetJobList to be consistent with
* other usage, since caller must free the copied list
*/
GList * gncVendorGetJoblist (GncVendor *vendor, gboolean show_all);
GUID gncVendorRetGUID (GncVendor *vendor);
@ -70,4 +71,8 @@ int gncVendorCompare (GncVendor *a, GncVendor *b);
#define VENDOR_NAME "name"
#define VENDOR_ADDR "addr"
/** deprecated functions */
#define gncVendorGetBook(X) qof_instance_get_book (QOF_INSTANCE(X))
#define gncVendorGetGUID(X) qof_instance_get_guid (QOF_INSTANCE(X))
#endif /* GNC_VENDOR_H_ */

View File

@ -49,7 +49,7 @@ test_vendor (void)
do_test (gncVendorCreate (NULL) == NULL, "vendor create NULL");
vendor = gncVendorCreate (book);
do_test (vendor != NULL, "vendor create");
do_test (gncVendorGetBook (vendor) == book,
do_test (qof_instance_get_book (QOF_INSTANCE(vendor)) == book,
"getbook");
gncVendorBeginEdit (vendor);
@ -75,7 +75,7 @@ test_vendor (void)
guid_new (&guid);
vendor = gncVendorCreate (book); count++;
gncVendorSetGUID (vendor, &guid);
do_test (guid_equal (&guid, gncVendorGetGUID (vendor)), "guid compare");
do_test (guid_equal (&guid, qof_instance_get_guid(QOF_INSTANCE(vendor))), "guid compare");
}
#if 0
{