mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
* 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:
parent
1f559cc1ae
commit
7a4f46c88f
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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"
|
||||
|
@ -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)++;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 },
|
||||
|
Loading…
Reference in New Issue
Block a user