* 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>
* 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_disctype_string "entry:disc-type"
#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_taxincluded_string "entry:taxincluded"
#define entry_taxtable_string "entry:taxtable"
@ -132,9 +133,14 @@ entry_dom_tree_create (GncEntry *entry)
gncEntryDiscountHowToString (
gncEntryGetDiscountHow (entry))));
acc = gncEntryGetAccount (entry);
acc = gncEntryGetInvAccount (entry);
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)));
xmlAddChild(ret, int_to_dom_tree(entry_taxable_string,
@ -177,6 +183,7 @@ struct entry_pdata
{
GncEntry *entry;
GNCBook *book;
Account *acc;
};
static gboolean
@ -227,6 +234,26 @@ set_boolean(xmlNodePtr node, GncEntry* entry,
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
entry_guid_handler (xmlNodePtr node, gpointer entry_pdata)
{
@ -357,17 +384,25 @@ static gboolean
entry_acct_handler (xmlNodePtr node, gpointer entry_pdata)
{
struct entry_pdata *pdata = entry_pdata;
GUID *guid;
Account * acc;
/* XXX: try to figure out if this is an 'invoice' or a 'bill' --
* we have to wait until the end!
*/
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);
return set_account (node, pdata, NULL);
}
gncEntrySetAccount (pdata->entry, acc);
return TRUE;
static gboolean
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
@ -501,7 +536,9 @@ static struct dom_tree_handler entry_handlers_v2[] = {
{ entry_discount_string, entry_discount_handler, 0, 0 },
{ entry_disctype_string, entry_disctype_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_taxincluded_string, entry_taxincluded_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.book = book;
entry_pdata.acc = NULL;
successful = dom_tree_generic_parse (node, entry_handlers_v2,
&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);
if (!successful)

View File

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

View File

@ -58,7 +58,8 @@ void gncEntrySetTaxTable (GncEntry *entry, GncTaxTable *table);
void gncEntrySetBillable (GncEntry *entry, gboolean billable);
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 */
@ -111,7 +112,8 @@ void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price,
gnc_numeric *value, gnc_numeric *discount_value,
GList **tax_values);
Account * gncEntryGetAccount (GncEntry *entry);
Account * gncEntryGetInvAccount (GncEntry *entry);
Account * gncEntryGetBillAccount (GncEntry *entry);
GncOrder * gncEntryGetOrder (GncEntry *entry);
GncInvoice * gncEntryGetInvoice (GncEntry *entry);

View File

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

View File

@ -34,7 +34,8 @@ typedef struct entry_ledger_colors
guint32 secondary_active_bg_color;
} 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_DATE_CELL "date"
#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 (! gnc_numeric_zero_p (value)) {
if (!gnc_entry_ledger_verify_acc_cell_ok (ledger, ENTRY_ACCT_CELL,
_("an Account")))
return FALSE;
switch (ledger->type) {
case GNCENTRY_INVOICE_ENTRY:
if (!gnc_entry_ledger_verify_acc_cell_ok (ledger, ENTRY_IACCT_CELL,
_("an Account")))
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;
@ -265,16 +277,34 @@ static gboolean gnc_entry_ledger_traverse (VirtualLocation *p_new_virt_loc,
ComboCell *cell;
Account *account;
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;
if (!gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_ACCT_CELL, FALSE))
cell_name, FALSE))
break;
cell = (ComboCell *) gnc_table_layout_get_cell (ledger->table->layout,
ENTRY_ACCT_CELL);
cell_name);
if (!cell)
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! */
if (!gnc_entry_ledger_verify_can_save (ledger)) {
break;
return TRUE;
}
(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 },
{ ENTRY_DISHOW_CELL, RECN_CELL_TYPE_NAME, N_("sample(DH):+%")+11,
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 },
{ ENTRY_TAXABLE_CELL, RECN_CELL_TYPE_NAME, N_("sample:T?")+7,
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_DESC_CELL, 0, 2);
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_PRIC_CELL, 0, 6);
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_DESC_CELL, 0, 2);
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_PRIC_CELL, 0, 6);
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;
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);
load_xfer_cell (cell, group);
}

View File

@ -115,7 +115,7 @@ static const char * get_billable_label (VirtualLocation virt_loc, gpointer data)
/* GET_ENTRY */
static const char * get_acct_entry (VirtualLocation virt_loc,
static const char * get_iacct_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
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);
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 ());
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 */
if (gnc_table_layout_get_cell_changed (ledger->table->layout,
ENTRY_ACCT_CELL, TRUE)) {
ENTRY_IACCT_CELL, TRUE)) {
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)
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,
@ -983,7 +1011,8 @@ static void gnc_entry_ledger_model_new_handlers (TableModel *model,
gpointer help_handler;
gpointer io_flags_handler;
} 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_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 },