* change gncEntry->account into gncEntry->invAccount and

gncEntry->billAccount.  Change the register so that Bills use
	  the BillAccount and Invoices use the InvoiceAccount.  This
	  allows the same Entry to have both an "expense" and "income"
	  account to offset each other.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7117 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Derek Atkins 2002-07-11 15:11:33 +00:00
parent 1f559cc1ae
commit 7a4f46c88f
10 changed files with 179 additions and 41 deletions

View File

@ -1,3 +1,11 @@
2002-07-11 Derek Atkins <derek@ihtfp.com>
* change gncEntry->account into gncEntry->invAccount and
gncEntry->billAccount. Change the register so that Bills use
the BillAccount and Invoices use the InvoiceAccount. This
allows the same Entry to have both an "expense" and "income"
account to offset each other.
2002-07-10 Joshua Sled <jsled@asynchronous.org> 2002-07-10 Joshua Sled <jsled@asynchronous.org>
* src/gnome/druid-loan.[ch]: Added; Initial implementation of * src/gnome/druid-loan.[ch]: Added; Initial implementation of

View File

@ -70,7 +70,8 @@ const gchar *entry_version_string = "2.0.0";
#define entry_discount_string "entry:discount" #define entry_discount_string "entry:discount"
#define entry_disctype_string "entry:disc-type" #define entry_disctype_string "entry:disc-type"
#define entry_dischow_string "entry:disc-how" #define entry_dischow_string "entry:disc-how"
#define entry_acct_string "entry:acct" #define entry_invacct_string "entry:i-acct"
#define entry_billacct_string "entry:b-acct"
#define entry_taxable_string "entry:taxable" #define entry_taxable_string "entry:taxable"
#define entry_taxincluded_string "entry:taxincluded" #define entry_taxincluded_string "entry:taxincluded"
#define entry_taxtable_string "entry:taxtable" #define entry_taxtable_string "entry:taxtable"
@ -132,9 +133,14 @@ entry_dom_tree_create (GncEntry *entry)
gncEntryDiscountHowToString ( gncEntryDiscountHowToString (
gncEntryGetDiscountHow (entry)))); gncEntryGetDiscountHow (entry))));
acc = gncEntryGetAccount (entry); acc = gncEntryGetInvAccount (entry);
if (acc) if (acc)
xmlAddChild (ret, guid_to_dom_tree (entry_acct_string, xmlAddChild (ret, guid_to_dom_tree (entry_invacct_string,
xaccAccountGetGUID (acc)));
acc = gncEntryGetBillAccount (entry);
if (acc)
xmlAddChild (ret, guid_to_dom_tree (entry_billacct_string,
xaccAccountGetGUID (acc))); xaccAccountGetGUID (acc)));
xmlAddChild(ret, int_to_dom_tree(entry_taxable_string, xmlAddChild(ret, int_to_dom_tree(entry_taxable_string,
@ -177,6 +183,7 @@ struct entry_pdata
{ {
GncEntry *entry; GncEntry *entry;
GNCBook *book; GNCBook *book;
Account *acc;
}; };
static gboolean static gboolean
@ -227,6 +234,26 @@ set_boolean(xmlNodePtr node, GncEntry* entry,
return TRUE; return TRUE;
} }
static gboolean
set_account(xmlNodePtr node, struct entry_pdata *pdata,
void (*func)(GncEntry *entry, Account *acc))
{
GUID *guid;
Account * acc;
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
acc = xaccAccountLookup (guid, pdata->book);
g_free (guid);
g_return_val_if_fail (acc, FALSE);
if (func)
func (pdata->entry, acc);
else
pdata->acc = acc;
return TRUE;
}
static gboolean static gboolean
entry_guid_handler (xmlNodePtr node, gpointer entry_pdata) entry_guid_handler (xmlNodePtr node, gpointer entry_pdata)
{ {
@ -357,17 +384,25 @@ static gboolean
entry_acct_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;
GUID *guid; /* XXX: try to figure out if this is an 'invoice' or a 'bill' --
Account * acc; * we have to wait until the end!
*/
guid = dom_tree_to_guid (node); return set_account (node, pdata, NULL);
g_return_val_if_fail (guid, FALSE); }
acc = xaccAccountLookup (guid, pdata->book);
g_free (guid);
g_return_val_if_fail (acc, FALSE);
gncEntrySetAccount (pdata->entry, acc); static gboolean
return TRUE; entry_invacct_handler (xmlNodePtr node, gpointer entry_pdata)
{
struct entry_pdata *pdata = entry_pdata;
return set_account (node, pdata, gncEntrySetInvAccount);
}
static gboolean
entry_billacct_handler (xmlNodePtr node, gpointer entry_pdata)
{
struct entry_pdata *pdata = entry_pdata;
return set_account (node, pdata, gncEntrySetBillAccount);
} }
static gboolean static gboolean
@ -501,7 +536,9 @@ static struct dom_tree_handler entry_handlers_v2[] = {
{ entry_discount_string, entry_discount_handler, 0, 0 }, { entry_discount_string, entry_discount_handler, 0, 0 },
{ entry_disctype_string, entry_disctype_handler, 0, 0 }, { entry_disctype_string, entry_disctype_handler, 0, 0 },
{ entry_dischow_string, entry_dischow_handler, 0, 0 }, { entry_dischow_string, entry_dischow_handler, 0, 0 },
{ entry_acct_string, entry_acct_handler, 0, 0 }, { "entry:acct", entry_acct_handler, 0, 0 },
{ entry_invacct_string, entry_invacct_handler, 0, 0 },
{ entry_billacct_string, entry_billacct_handler, 0, 0 },
{ entry_taxable_string, entry_taxable_handler, 0, 0 }, { entry_taxable_string, entry_taxable_handler, 0, 0 },
{ entry_taxincluded_string, entry_taxincluded_handler, 0, 0 }, { entry_taxincluded_string, entry_taxincluded_handler, 0, 0 },
{ entry_taxtable_string, entry_taxtable_handler, 0, 0 }, { entry_taxtable_string, entry_taxtable_handler, 0, 0 },
@ -521,9 +558,16 @@ dom_tree_to_entry (xmlNodePtr node, GNCBook *book)
entry_pdata.entry = gncEntryCreate(book); entry_pdata.entry = gncEntryCreate(book);
entry_pdata.book = book; entry_pdata.book = book;
entry_pdata.acc = NULL;
successful = dom_tree_generic_parse (node, entry_handlers_v2, successful = dom_tree_generic_parse (node, entry_handlers_v2,
&entry_pdata); &entry_pdata);
if (entry_pdata.acc != NULL) {
if (gncEntryGetBill (entry_pdata.entry))
gncEntrySetBillAccount (entry_pdata.entry, entry_pdata.acc);
else
gncEntrySetInvAccount (entry_pdata.entry, entry_pdata.acc);
}
gncEntryCommitEdit (entry_pdata.entry); gncEntryCommitEdit (entry_pdata.entry);
if (!successful) if (!successful)

View File

@ -36,7 +36,8 @@ struct _gncEntry {
gnc_numeric discount; gnc_numeric discount;
GncAmountType disc_type; GncAmountType disc_type;
GncDiscountHow disc_how; GncDiscountHow disc_how;
Account * account; Account * invaccount;
Account * bilaccount;
gboolean taxable; gboolean taxable;
gboolean taxincluded; gboolean taxincluded;
@ -249,11 +250,19 @@ void gncEntrySetDiscount (GncEntry *entry, gnc_numeric discount)
mark_entry (entry); mark_entry (entry);
} }
void gncEntrySetAccount (GncEntry *entry, Account *acc) void gncEntrySetInvAccount (GncEntry *entry, Account *acc)
{ {
if (!entry) return; if (!entry) return;
if (entry->account == acc) return; if (entry->invaccount == acc) return;
entry->account = acc; entry->invaccount = acc;
mark_entry (entry);
}
void gncEntrySetBillAccount (GncEntry *entry, Account *acc)
{
if (!entry) return;
if (entry->bilaccount == acc) return;
entry->bilaccount = acc;
mark_entry (entry); mark_entry (entry);
} }
@ -376,7 +385,8 @@ void gncEntryCopy (const GncEntry *src, GncEntry *dest)
dest->price = src->price; dest->price = src->price;
dest->discount = src->discount; dest->discount = src->discount;
dest->disc_type = src->disc_type; dest->disc_type = src->disc_type;
dest->account = src->account; dest->invaccount = src->invaccount;
dest->bilaccount = src->bilaccount;
dest->taxable = src->taxable; dest->taxable = src->taxable;
dest->taxincluded = src->taxincluded; dest->taxincluded = src->taxincluded;
dest->billable = src->billable; dest->billable = src->billable;
@ -461,10 +471,16 @@ gnc_numeric gncEntryGetDiscount (GncEntry *entry)
return entry->discount; return entry->discount;
} }
Account * gncEntryGetAccount (GncEntry *entry) Account * gncEntryGetInvAccount (GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->account; return entry->invaccount;
}
Account * gncEntryGetBillAccount (GncEntry *entry)
{
if (!entry) return NULL;
return entry->bilaccount;
} }
GncInvoice * gncEntryGetInvoice (GncEntry *entry) GncInvoice * gncEntryGetInvoice (GncEntry *entry)

View File

@ -58,7 +58,8 @@ void gncEntrySetTaxTable (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 gncEntrySetAccount (GncEntry *entry, Account *acc); void gncEntrySetInvAccount (GncEntry *entry, Account *acc);
void gncEntrySetBillAccount (GncEntry *entry, Account *acc);
/* Get Functions */ /* Get Functions */
@ -111,7 +112,8 @@ 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 * gncEntryGetAccount (GncEntry *entry); Account * gncEntryGetInvAccount (GncEntry *entry);
Account * gncEntryGetBillAccount (GncEntry *entry);
GncOrder * gncEntryGetOrder (GncEntry *entry); GncOrder * gncEntryGetOrder (GncEntry *entry);
GncInvoice * gncEntryGetInvoice (GncEntry *entry); GncInvoice * gncEntryGetInvoice (GncEntry *entry);

View File

@ -634,7 +634,8 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
gncEntryGetValue (entry, &value, NULL, &tax, &taxes); gncEntryGetValue (entry, &value, NULL, &tax, &taxes);
/* add the value for the account split */ /* add the value for the account split */
this_acc = gncEntryGetAccount (entry); this_acc = (reverse ? gncEntryGetInvAccount (entry) :
gncEntryGetBillAccount (entry));
if (this_acc) { if (this_acc) {
if (gnc_numeric_check (value) == GNC_ERROR_OK) { if (gnc_numeric_check (value) == GNC_ERROR_OK) {
splitinfo = gncAccountValueAdd (splitinfo, this_acc, value); splitinfo = gncAccountValueAdd (splitinfo, this_acc, value);

View File

@ -34,7 +34,8 @@ typedef struct entry_ledger_colors
guint32 secondary_active_bg_color; guint32 secondary_active_bg_color;
} GncEntryLedgerColors; } GncEntryLedgerColors;
#define ENTRY_ACCT_CELL "account" #define ENTRY_IACCT_CELL "inv-account"
#define ENTRY_BACCT_CELL "bill-account"
#define ENTRY_ACTN_CELL "action" #define ENTRY_ACTN_CELL "action"
#define ENTRY_DATE_CELL "date" #define ENTRY_DATE_CELL "date"
#define ENTRY_DESC_CELL "description" #define ENTRY_DESC_CELL "description"

View File

@ -137,9 +137,21 @@ gnc_entry_ledger_verify_can_save (GncEntryLedger *ledger)
/* If there is a value, make sure there is an account */ /* If there is a value, make sure there is an account */
if (! gnc_numeric_zero_p (value)) { if (! gnc_numeric_zero_p (value)) {
if (!gnc_entry_ledger_verify_acc_cell_ok (ledger, ENTRY_ACCT_CELL, switch (ledger->type) {
case GNCENTRY_INVOICE_ENTRY:
if (!gnc_entry_ledger_verify_acc_cell_ok (ledger, ENTRY_IACCT_CELL,
_("an Account"))) _("an Account")))
return FALSE; return FALSE;
break;
case GNCENTRY_BILL_ENTRY:
if (!gnc_entry_ledger_verify_acc_cell_ok (ledger, ENTRY_BACCT_CELL,
_("an Account")))
return FALSE;
break;
default:
g_warning ("Unhandled ledger type");
break;
}
} }
return TRUE; return TRUE;
@ -265,16 +277,34 @@ static gboolean gnc_entry_ledger_traverse (VirtualLocation *p_new_virt_loc,
ComboCell *cell; ComboCell *cell;
Account *account; Account *account;
char *name; char *name;
char *cell_name = NULL;
if (!gnc_cell_name_equal (cell_name, ENTRY_ACCT_CELL)) switch (ledger->type) {
case GNCENTRY_INVOICE_ENTRY:
case GNCENTRY_INVOICE_VIEWER:
cell_name = ENTRY_IACCT_CELL;
break;
case GNCENTRY_BILL_ENTRY:
case GNCENTRY_BILL_VIEWER:
cell_name = ENTRY_BACCT_CELL;
break;
default:
g_warning ("Unhandled ledger type");
break;
}
if (!cell_name)
break;
if (!gnc_cell_name_equal (cell_name, cell_name))
break; break;
if (!gnc_table_layout_get_cell_changed (ledger->table->layout, if (!gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_ACCT_CELL, FALSE)) cell_name, FALSE))
break; break;
cell = (ComboCell *) gnc_table_layout_get_cell (ledger->table->layout, cell = (ComboCell *) gnc_table_layout_get_cell (ledger->table->layout,
ENTRY_ACCT_CELL); cell_name);
if (!cell) if (!cell)
break; break;
@ -390,7 +420,7 @@ static gboolean gnc_entry_ledger_traverse (VirtualLocation *p_new_virt_loc,
/* Verify that the cursor is ok. If we can't save the cell, don't move! */ /* Verify that the cursor is ok. If we can't save the cell, don't move! */
if (!gnc_entry_ledger_verify_can_save (ledger)) { if (!gnc_entry_ledger_verify_can_save (ledger)) {
break; return TRUE;
} }
(p_new_virt_loc->vcell_loc.virt_row)++; (p_new_virt_loc->vcell_loc.virt_row)++;

View File

@ -70,7 +70,9 @@ static void gnc_entry_ledger_layout_add_cells (GncEntryLedger *ledger,
CELL_ALIGN_LEFT, FALSE, FALSE }, CELL_ALIGN_LEFT, FALSE, FALSE },
{ ENTRY_DISHOW_CELL, RECN_CELL_TYPE_NAME, N_("sample(DH):+%")+11, { ENTRY_DISHOW_CELL, RECN_CELL_TYPE_NAME, N_("sample(DH):+%")+11,
CELL_ALIGN_LEFT, FALSE, FALSE }, CELL_ALIGN_LEFT, FALSE, FALSE },
{ ENTRY_ACCT_CELL, COMBO_CELL_TYPE_NAME, N_("sample:Xfer:Account")+7, { ENTRY_IACCT_CELL, COMBO_CELL_TYPE_NAME, N_("sample:Xfer:Account")+7,
CELL_ALIGN_RIGHT, FALSE, FALSE },
{ ENTRY_BACCT_CELL, COMBO_CELL_TYPE_NAME, N_("sample:Xfer:Account")+7,
CELL_ALIGN_RIGHT, FALSE, FALSE }, CELL_ALIGN_RIGHT, FALSE, FALSE },
{ ENTRY_TAXABLE_CELL, RECN_CELL_TYPE_NAME, N_("sample:T?")+7, { ENTRY_TAXABLE_CELL, RECN_CELL_TYPE_NAME, N_("sample:T?")+7,
CELL_ALIGN_LEFT, FALSE, FALSE }, CELL_ALIGN_LEFT, FALSE, FALSE },
@ -139,7 +141,7 @@ static void gnc_entry_ledger_set_cells (GncEntryLedger *ledger,
gnc_table_layout_set_cell (layout, curs, ENTRY_DATE_CELL, 0, 1); gnc_table_layout_set_cell (layout, curs, ENTRY_DATE_CELL, 0, 1);
gnc_table_layout_set_cell (layout, curs, ENTRY_DESC_CELL, 0, 2); gnc_table_layout_set_cell (layout, curs, ENTRY_DESC_CELL, 0, 2);
gnc_table_layout_set_cell (layout, curs, ENTRY_ACTN_CELL, 0, 3); gnc_table_layout_set_cell (layout, curs, ENTRY_ACTN_CELL, 0, 3);
gnc_table_layout_set_cell (layout, curs, ENTRY_ACCT_CELL, 0, 4); gnc_table_layout_set_cell (layout, curs, ENTRY_IACCT_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_DISTYPE_CELL, 0, 7); gnc_table_layout_set_cell (layout, curs, ENTRY_DISTYPE_CELL, 0, 7);
@ -161,7 +163,7 @@ static void gnc_entry_ledger_set_cells (GncEntryLedger *ledger,
gnc_table_layout_set_cell (layout, curs, ENTRY_DATE_CELL, 0, 1); gnc_table_layout_set_cell (layout, curs, ENTRY_DATE_CELL, 0, 1);
gnc_table_layout_set_cell (layout, curs, ENTRY_DESC_CELL, 0, 2); gnc_table_layout_set_cell (layout, curs, ENTRY_DESC_CELL, 0, 2);
gnc_table_layout_set_cell (layout, curs, ENTRY_ACTN_CELL, 0, 3); gnc_table_layout_set_cell (layout, curs, ENTRY_ACTN_CELL, 0, 3);
gnc_table_layout_set_cell (layout, curs, ENTRY_ACCT_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_VALUE_CELL, 0, 7);

View File

@ -127,7 +127,12 @@ static void load_xfer_type_cells (GncEntryLedger *ledger)
return; return;
cell = (ComboCell *) cell = (ComboCell *)
gnc_table_layout_get_cell (ledger->table->layout, ENTRY_ACCT_CELL); gnc_table_layout_get_cell (ledger->table->layout, ENTRY_IACCT_CELL);
gnc_combo_cell_clear_menu (cell);
load_xfer_cell (cell, group);
cell = (ComboCell *)
gnc_table_layout_get_cell (ledger->table->layout, ENTRY_BACCT_CELL);
gnc_combo_cell_clear_menu (cell); gnc_combo_cell_clear_menu (cell);
load_xfer_cell (cell, group); load_xfer_cell (cell, group);
} }

View File

@ -115,7 +115,7 @@ static const char * get_billable_label (VirtualLocation virt_loc, gpointer data)
/* GET_ENTRY */ /* GET_ENTRY */
static const char * get_acct_entry (VirtualLocation virt_loc, static const char * get_iacct_entry (VirtualLocation virt_loc,
gboolean translate, gboolean translate,
gboolean *conditionally_changed, gboolean *conditionally_changed,
gpointer user_data) gpointer user_data)
@ -128,7 +128,25 @@ static const char * get_acct_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);
g_free (name); g_free (name);
name = xaccAccountGetFullName (gncEntryGetAccount (entry), name = xaccAccountGetFullName (gncEntryGetInvAccount (entry),
gnc_get_account_separator ());
return name;
}
static const char * get_bacct_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
static char *name = NULL;
GncEntryLedger *ledger = user_data;
GncEntry *entry;
entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
g_free (name);
name = xaccAccountGetFullName (gncEntryGetBillAccount (entry),
gnc_get_account_separator ()); gnc_get_account_separator ());
return name; return name;
} }
@ -826,13 +844,23 @@ static void gnc_entry_ledger_save_cells (gpointer save_data,
/* copy the contents from the cursor to the split */ /* copy the contents from the cursor to the split */
if (gnc_table_layout_get_cell_changed (ledger->table->layout, if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_ACCT_CELL, TRUE)) { ENTRY_IACCT_CELL, TRUE)) {
Account *acc; Account *acc;
acc = gnc_entry_ledger_get_account (ledger, ENTRY_ACCT_CELL); acc = gnc_entry_ledger_get_account (ledger, ENTRY_IACCT_CELL);
if (acc != NULL) if (acc != NULL)
gncEntrySetAccount (entry, acc); gncEntrySetInvAccount (entry, acc);
}
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_BACCT_CELL, TRUE)) {
Account *acc;
acc = gnc_entry_ledger_get_account (ledger, ENTRY_BACCT_CELL);
if (acc != NULL)
gncEntrySetBillAccount (entry, acc);
} }
if (gnc_table_layout_get_cell_changed (ledger->table->layout, if (gnc_table_layout_get_cell_changed (ledger->table->layout,
@ -983,7 +1011,8 @@ static void gnc_entry_ledger_model_new_handlers (TableModel *model,
gpointer help_handler; gpointer help_handler;
gpointer io_flags_handler; gpointer io_flags_handler;
} models[] = { } models[] = {
{ ENTRY_ACCT_CELL, get_acct_entry, get_acct_label, get_acct_help, get_standard_io_flags }, { ENTRY_IACCT_CELL, get_iacct_entry, get_acct_label, get_acct_help, get_standard_io_flags },
{ ENTRY_BACCT_CELL, get_bacct_entry, get_acct_label, get_acct_help, get_standard_io_flags },
{ ENTRY_ACTN_CELL, get_actn_entry, get_actn_label, get_actn_help, get_standard_io_flags }, { ENTRY_ACTN_CELL, get_actn_entry, get_actn_label, get_actn_help, get_standard_io_flags },
{ ENTRY_DATE_CELL, get_date_entry, get_date_label, get_date_help, get_standard_io_flags }, { ENTRY_DATE_CELL, get_date_entry, get_date_label, get_date_help, get_standard_io_flags },
{ ENTRY_DESC_CELL, get_desc_entry, get_desc_label, get_desc_help, get_standard_io_flags }, { ENTRY_DESC_CELL, get_desc_entry, get_desc_label, get_desc_help, get_standard_io_flags },