- register the GncOwner as another queriable type

- add to EntryLedger query for invoices; moving from an order->invoice
  will show the appropriate entries for the customer/vendor.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6682 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Derek Atkins 2002-02-04 02:53:13 +00:00
parent 2a0f766c34
commit b7fb090444
8 changed files with 118 additions and 9 deletions

View File

@ -40,6 +40,7 @@ noinst_HEADERS = \
gncOrder.h \
gncOrderP.h \
gncOwner.h \
gncOwnerP.h \
gncVendor.h \
gncVendorP.h

View File

@ -19,6 +19,7 @@
#include "gncInvoiceP.h"
#include "gncJobP.h"
#include "gncOrderP.h"
#include "gncOwnerP.h"
#include "gncVendorP.h"
/* version of the gnc module system interface we require */
@ -58,6 +59,7 @@ gnc_module_init(int refcount)
gncInvoiceRegister ();
gncJobRegister ();
gncOrderRegister ();
gncOwnerRegister ();
gncVendorRegister ();
}

View File

@ -342,6 +342,7 @@ gboolean gncOrderRegister (void)
{
static QueryObjectDef params[] = {
{ ORDER_GUID, QUERYCORE_GUID, (QueryAccess)gncOrderGetGUID },
{ ORDER_OWNER, GNC_OWNER_MODULE_NAME, (QueryAccess)gncOrderGetOwner },
{ QUERY_PARAM_BOOK, GNC_ID_BOOK, (QueryAccess)gncOrderGetBook },
{ NULL },
};

View File

@ -54,5 +54,6 @@ void gncOrderCommitEdit (GncOrder *order);
int gncOrderCompare (GncOrder *a, GncOrder *b);
#define ORDER_GUID "guid"
#define ORDER_OWNER "owner"
#endif /* GNC_ORDER_H_ */

View File

@ -9,7 +9,12 @@
#include <glib.h>
#include <string.h> /* for memcpy() */
#include "QueryObject.h"
#include "gncOwner.h"
#include "gncOwnerP.h"
#define _GNC_MOD_NAME GNC_OWNER_MODULE_NAME
void gncOwnerInitUndefined (GncOwner *owner, gpointer obj)
{
@ -104,4 +109,63 @@ const char * gncOwnerGetName (GncOwner *owner)
}
}
const GUID * gncOwnerGetGUID (GncOwner *owner)
{
if (!owner) return NULL;
switch (owner->type) {
case GNC_OWNER_NONE:
case GNC_OWNER_UNDEFINED:
default:
return NULL;
case GNC_OWNER_CUSTOMER:
return gncCustomerGetGUID (owner->owner.customer);
case GNC_OWNER_JOB:
return gncJobGetGUID (owner->owner.job);
case GNC_OWNER_VENDOR:
return gncVendorGetGUID (owner->owner.vendor);
}
}
GncOwner * gncOwnerGetEndOwner (GncOwner *owner)
{
if (!owner) return NULL;
switch (owner->type) {
case GNC_OWNER_NONE:
case GNC_OWNER_UNDEFINED:
default:
return NULL;
case GNC_OWNER_CUSTOMER:
case GNC_OWNER_VENDOR:
return owner;
case GNC_OWNER_JOB:
return gncJobGetOwner (owner->owner.job);
}
}
const GUID * gncOwnerGetEndGUID (GncOwner *owner)
{
if (!owner) return NULL;
owner = gncOwnerGetEndOwner (owner);
return gncOwnerGetGUID (owner);
}
gboolean gncOwnerRegister (void)
{
static QueryObjectDef params[] = {
{ OWNER_TYPE, QUERYCORE_INT64, (QueryAccess)gncOwnerGetType },
{ OWNER_CUSTOMER, GNC_CUSTOMER_MODULE_NAME,
(QueryAccess)gncOwnerGetCustomer },
{ OWNER_JOB, GNC_JOB_MODULE_NAME, (QueryAccess)gncOwnerGetJob },
{ OWNER_VENDOR, GNC_VENDOR_MODULE_NAME, (QueryAccess)gncOwnerGetVendor },
{ OWNER_GUID, QUERYCORE_GUID, (QueryAccess)gncOwnerGetGUID },
{ OWNER_PARENT, _GNC_MOD_NAME, (QueryAccess)gncOwnerGetEndOwner },
{ OWNER_PARENTG, QUERYCORE_GUID, (QueryAccess)gncOwnerGetEndGUID },
{ OWNER_NAME, QUERYCORE_STRING, (QueryAccess)gncOwnerGetName },
{ NULL },
};
gncQueryObjectRegister (_GNC_MOD_NAME, (QuerySort)gncCustomerCompare,params);
return TRUE;
}

View File

@ -9,6 +9,8 @@
typedef struct gnc_owner_s GncOwner;
#define GNC_OWNER_MODULE_NAME "gncOwner"
#include "gncCustomer.h"
#include "gncJob.h"
#include "gncVendor.h"
@ -47,4 +49,23 @@ gboolean gncOwnerEqual (const GncOwner *a, const GncOwner *b);
const char * gncOwnerGetName (GncOwner *owner);
/* Get the GUID of the immediate owner */
const GUID * gncOwnerGetGUID (GncOwner *owner);
/*
* Get the "parent" Owner or GUID thereof. The "parent" owner
* is the Customer or Vendor, or the Owner of a Job
*/
GncOwner * gncOwnerGetEndOwner (GncOwner *owner);
const GUID * gncOwnerGetEndGUID (GncOwner *owner);
#define OWNER_TYPE "type"
#define OWNER_CUSTOMER "customer"
#define OWNER_JOB "job"
#define OWNER_VENDOR "vendor"
#define OWNER_GUID "guid"
#define OWNER_PARENT "parent"
#define OWNER_PARENTG "parent-guid"
#define OWNER_NAME "name"
#endif /* GNC_OWNER_H_ */

View File

@ -0,0 +1,12 @@
/*
* gncOwnerP.h -- Business Interface: Object OWNERs
* Copyright (C) 2001, 2002 Derek Atkins
* Author: Derek Atkins <warlord@MIT.EDU>
*/
#ifndef GNC_OWNERP_H_
#define GNC_OWNERP_H_
gboolean gncOwnerRegister (void);
#endif /* GNC_OWNERP_H_ */

View File

@ -285,8 +285,8 @@ static void create_invoice_query (GncEntryLedger *ledger)
* 3. ( Entry->Invoice == NULL AND
* Entry->Order->real-parent == Invoice->parent ) )
*
* Note that term 3 is only for Editable invoices, and only when
* we've already got an 'owner'.
* Note that term 3 is only for Editable invoices where the 'owner'
* is valid.
*/
/* Term 1 */
@ -301,20 +301,27 @@ static void create_invoice_query (GncEntryLedger *ledger)
gncInvoiceGetGUID (ledger->invoice), QUERY_OR);
/* Term 3 */
if (ledger->type == GNCENTRY_INVOICE_ENTRY) {
if (ledger->type == GNCENTRY_INVOICE_ENTRY &&
gncOwnerGetEndGUID (gncInvoiceGetOwner (ledger->invoice)) != NULL) {
QueryNew *q2 = gncQueryCreate ();
/* Note that this is a bogus search -- it will find all entries that
* exist (including "blank" entries)
*/
/* entry_invoice->invoice_guid == NULL */
gncQueryAddGUIDMatch (q2,
g_slist_prepend (g_slist_prepend (NULL,
INVOICE_GUID),
ENTRY_INVOICE),
NULL, QUERY_AND);
/* XXX Check entry's order's real-parent matches this invoice's parent */
NULL, QUERY_OR);
/* entry_order->owner->end_guid == invoice->owner->guid */
gncQueryAddGUIDMatch (q2,
g_slist_prepend
(g_slist_prepend
(g_slist_prepend (NULL, OWNER_PARENTG),
ORDER_OWNER), ENTRY_ORDER),
gncOwnerGetGUID (gncInvoiceGetOwner
(ledger->invoice)),
QUERY_AND);
/* Combine terms 2 and 3 */
q1 = gncQueryMerge (q, q2, QUERY_OR);
gncQueryDestroy (q);