mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Bug 797006 - Balance is misleading in open subaccounts when different currencies are involved
This commit is contained in:
parent
bedc9631f8
commit
01cdcca694
@ -675,12 +675,23 @@ gnc_plugin_page_register_new_common (GNCLedgerDisplay *ledger)
|
|||||||
return plugin_page;
|
return plugin_page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gpointer
|
||||||
|
gnc_plug_page_register_check_commodity(Account *account, void* usr_data)
|
||||||
|
{
|
||||||
|
// Check that account's commodity matches the commodity in usr_data
|
||||||
|
gnc_commodity* com0 = (gnc_commodity*) usr_data;
|
||||||
|
gnc_commodity* com1 = xaccAccountGetCommodity(account);
|
||||||
|
return gnc_commodity_equal(com1, com0) ? NULL : com1;
|
||||||
|
}
|
||||||
|
|
||||||
GncPluginPage *
|
GncPluginPage *
|
||||||
gnc_plugin_page_register_new (Account *account, gboolean subaccounts)
|
gnc_plugin_page_register_new (Account *account, gboolean subaccounts)
|
||||||
{
|
{
|
||||||
GNCLedgerDisplay *ledger;
|
GNCLedgerDisplay *ledger;
|
||||||
GncPluginPage *page;
|
GncPluginPage *page;
|
||||||
GncPluginPageRegisterPrivate *priv;
|
GncPluginPageRegisterPrivate *priv;
|
||||||
|
gnc_commodity* com0;
|
||||||
|
gnc_commodity* com1;
|
||||||
|
|
||||||
/*################## Added for Reg2 #################*/
|
/*################## Added for Reg2 #################*/
|
||||||
const GList *item;
|
const GList *item;
|
||||||
@ -708,9 +719,18 @@ gnc_plugin_page_register_new (Account *account, gboolean subaccounts)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*################## Added for Reg2 #################*/
|
/*################## Added for Reg2 #################*/
|
||||||
|
com0 = gnc_account_get_currency_or_parent(account);
|
||||||
|
com1 = gnc_account_foreach_descendant_until(account,gnc_plug_page_register_check_commodity,com0);
|
||||||
|
if(0 && com1 != NULL)
|
||||||
|
{
|
||||||
|
const gchar* com0_str = gnc_commodity_get_fullname(com0);
|
||||||
|
const gchar* com1_str = gnc_commodity_get_fullname(com1);
|
||||||
|
gnc_info_dialog(NULL,_("Cannot open sub-accounts because sub-accounts and parent account have different commodities or currencies\nFound:\n%s\n%s\n(There may be more mismatches)"),com0_str,com1_str);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (subaccounts)
|
if (subaccounts)
|
||||||
ledger = gnc_ledger_display_subaccounts (account);
|
ledger = gnc_ledger_display_subaccounts (account,com1 != NULL);
|
||||||
else
|
else
|
||||||
ledger = gnc_ledger_display_simple (account);
|
ledger = gnc_ledger_display_simple (account);
|
||||||
|
|
||||||
|
@ -88,7 +88,8 @@ gnc_ledger_display_internal (Account *lead_account, Query *q,
|
|||||||
SplitRegisterType reg_type,
|
SplitRegisterType reg_type,
|
||||||
SplitRegisterStyle style,
|
SplitRegisterStyle style,
|
||||||
gboolean use_double_line,
|
gboolean use_double_line,
|
||||||
gboolean is_template);
|
gboolean is_template,
|
||||||
|
gboolean mismatched_commodities);
|
||||||
|
|
||||||
static void gnc_ledger_display_refresh_internal (GNCLedgerDisplay *ld,
|
static void gnc_ledger_display_refresh_internal (GNCLedgerDisplay *ld,
|
||||||
GList *splits);
|
GList *splits);
|
||||||
@ -370,7 +371,7 @@ gnc_ledger_display_simple (Account *account)
|
|||||||
|
|
||||||
ld = gnc_ledger_display_internal (account, NULL, LD_SINGLE, reg_type,
|
ld = gnc_ledger_display_internal (account, NULL, LD_SINGLE, reg_type,
|
||||||
gnc_get_default_register_style(acc_type),
|
gnc_get_default_register_style(acc_type),
|
||||||
use_double_line, FALSE);
|
use_double_line, FALSE, FALSE);
|
||||||
LEAVE("%p", ld);
|
LEAVE("%p", ld);
|
||||||
return ld;
|
return ld;
|
||||||
}
|
}
|
||||||
@ -378,7 +379,7 @@ gnc_ledger_display_simple (Account *account)
|
|||||||
/* Opens up a register window to display an account, and all of its
|
/* Opens up a register window to display an account, and all of its
|
||||||
* children, in the same window */
|
* children, in the same window */
|
||||||
GNCLedgerDisplay *
|
GNCLedgerDisplay *
|
||||||
gnc_ledger_display_subaccounts (Account *account)
|
gnc_ledger_display_subaccounts (Account *account,gboolean mismatched_commodities)
|
||||||
{
|
{
|
||||||
SplitRegisterType reg_type;
|
SplitRegisterType reg_type;
|
||||||
GNCLedgerDisplay *ld;
|
GNCLedgerDisplay *ld;
|
||||||
@ -389,7 +390,7 @@ gnc_ledger_display_subaccounts (Account *account)
|
|||||||
|
|
||||||
ld = gnc_ledger_display_internal (account, NULL, LD_SUBACCOUNT,
|
ld = gnc_ledger_display_internal (account, NULL, LD_SUBACCOUNT,
|
||||||
reg_type, REG_STYLE_JOURNAL, FALSE,
|
reg_type, REG_STYLE_JOURNAL, FALSE,
|
||||||
FALSE);
|
FALSE,mismatched_commodities);
|
||||||
LEAVE("%p", ld);
|
LEAVE("%p", ld);
|
||||||
return ld;
|
return ld;
|
||||||
}
|
}
|
||||||
@ -439,7 +440,7 @@ gnc_ledger_display_gl (void)
|
|||||||
QOF_QUERY_AND);
|
QOF_QUERY_AND);
|
||||||
|
|
||||||
ld = gnc_ledger_display_internal (NULL, query, LD_GL, GENERAL_JOURNAL,
|
ld = gnc_ledger_display_internal (NULL, query, LD_GL, GENERAL_JOURNAL,
|
||||||
REG_STYLE_JOURNAL, FALSE, FALSE);
|
REG_STYLE_JOURNAL, FALSE, FALSE, FALSE);
|
||||||
LEAVE("%p", ld);
|
LEAVE("%p", ld);
|
||||||
return ld;
|
return ld;
|
||||||
}
|
}
|
||||||
@ -484,7 +485,8 @@ gnc_ledger_display_template_gl (char *id)
|
|||||||
SEARCH_LEDGER,
|
SEARCH_LEDGER,
|
||||||
REG_STYLE_JOURNAL,
|
REG_STYLE_JOURNAL,
|
||||||
FALSE,
|
FALSE,
|
||||||
isTemplateModeTrue);
|
isTemplateModeTrue,
|
||||||
|
FALSE);
|
||||||
|
|
||||||
sr = gnc_ledger_display_get_split_register (ld);
|
sr = gnc_ledger_display_get_split_register (ld);
|
||||||
if ( acct )
|
if ( acct )
|
||||||
@ -697,7 +699,7 @@ gnc_ledger_display_query (Query *query, SplitRegisterType type,
|
|||||||
ENTER("query=%p", query);
|
ENTER("query=%p", query);
|
||||||
|
|
||||||
ld = gnc_ledger_display_internal (NULL, query, LD_GL, type, style,
|
ld = gnc_ledger_display_internal (NULL, query, LD_GL, type, style,
|
||||||
FALSE, FALSE);
|
FALSE, FALSE, FALSE);
|
||||||
LEAVE("%p", ld);
|
LEAVE("%p", ld);
|
||||||
return ld;
|
return ld;
|
||||||
}
|
}
|
||||||
@ -708,7 +710,8 @@ gnc_ledger_display_internal (Account *lead_account, Query *q,
|
|||||||
SplitRegisterType reg_type,
|
SplitRegisterType reg_type,
|
||||||
SplitRegisterStyle style,
|
SplitRegisterStyle style,
|
||||||
gboolean use_double_line,
|
gboolean use_double_line,
|
||||||
gboolean is_template )
|
gboolean is_template,
|
||||||
|
gboolean mismatched_commodities)
|
||||||
{
|
{
|
||||||
GNCLedgerDisplay *ld;
|
GNCLedgerDisplay *ld;
|
||||||
gint limit;
|
gint limit;
|
||||||
@ -808,8 +811,9 @@ gnc_ledger_display_internal (Account *lead_account, Query *q,
|
|||||||
\******************************************************************/
|
\******************************************************************/
|
||||||
|
|
||||||
ld->use_double_line_default = use_double_line;
|
ld->use_double_line_default = use_double_line;
|
||||||
|
|
||||||
ld->reg = gnc_split_register_new (reg_type, style, use_double_line,
|
ld->reg = gnc_split_register_new (reg_type, style, use_double_line,
|
||||||
is_template);
|
is_template,mismatched_commodities);
|
||||||
|
|
||||||
gnc_split_register_set_data (ld->reg, ld, gnc_ledger_display_parent);
|
gnc_split_register_set_data (ld->reg, ld, gnc_ledger_display_parent);
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ GNCLedgerDisplay * gnc_ledger_display_simple (Account *account);
|
|||||||
|
|
||||||
/** opens up a register window to display the parent account and all of
|
/** opens up a register window to display the parent account and all of
|
||||||
* its children. */
|
* its children. */
|
||||||
GNCLedgerDisplay * gnc_ledger_display_subaccounts (Account *account);
|
GNCLedgerDisplay * gnc_ledger_display_subaccounts (Account *account, gboolean mismatched_commodities);
|
||||||
|
|
||||||
/** opens up a general ledger window */
|
/** opens up a general ledger window */
|
||||||
GNCLedgerDisplay * gnc_ledger_display_gl (void);
|
GNCLedgerDisplay * gnc_ledger_display_gl (void);
|
||||||
|
@ -291,9 +291,17 @@ gnc_split_register_set_cells (SplitRegister *reg, TableLayout *layout)
|
|||||||
{
|
{
|
||||||
gnc_table_layout_set_cell (layout, curs, DEBT_CELL, 0, 5);
|
gnc_table_layout_set_cell (layout, curs, DEBT_CELL, 0, 5);
|
||||||
gnc_table_layout_set_cell (layout, curs, CRED_CELL, 0, 6);
|
gnc_table_layout_set_cell (layout, curs, CRED_CELL, 0, 6);
|
||||||
|
if(!reg->mismatched_commodities)
|
||||||
|
{
|
||||||
gnc_table_layout_set_cell (layout, curs, RBALN_CELL, 0, 7);
|
gnc_table_layout_set_cell (layout, curs, RBALN_CELL, 0, 7);
|
||||||
gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 8);
|
gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 8);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Don't display the balance if there are mismatched commodities
|
||||||
|
gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
curs_last = curs;
|
curs_last = curs;
|
||||||
curs = gnc_table_layout_get_cursor (layout,
|
curs = gnc_table_layout_get_cursor (layout,
|
||||||
@ -327,10 +335,18 @@ gnc_split_register_set_cells (SplitRegister *reg, TableLayout *layout)
|
|||||||
if (reg->is_template)
|
if (reg->is_template)
|
||||||
gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 7);
|
gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 7);
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if(!reg->mismatched_commodities)
|
||||||
{
|
{
|
||||||
gnc_table_layout_set_cell (layout, curs, RBALN_CELL, 0, 7);
|
gnc_table_layout_set_cell (layout, curs, RBALN_CELL, 0, 7);
|
||||||
gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 8);
|
gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 8);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Don't display the balance if there are mismatched commodities
|
||||||
|
gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
curs_last = curs;
|
curs_last = curs;
|
||||||
curs = gnc_table_layout_get_cursor (layout,
|
curs = gnc_table_layout_get_cursor (layout,
|
||||||
@ -577,7 +593,7 @@ gnc_split_register_layout_add_cursors (SplitRegister *reg,
|
|||||||
case INCOME_LEDGER:
|
case INCOME_LEDGER:
|
||||||
case GENERAL_JOURNAL:
|
case GENERAL_JOURNAL:
|
||||||
case SEARCH_LEDGER:
|
case SEARCH_LEDGER:
|
||||||
if (reg->is_template)
|
if (reg->is_template || reg->mismatched_commodities)
|
||||||
num_cols = 8;
|
num_cols = 8;
|
||||||
else
|
else
|
||||||
num_cols = 9;
|
num_cols = 9;
|
||||||
|
@ -1352,7 +1352,6 @@ gnc_split_register_get_balance_entry (VirtualLocation virt_loc,
|
|||||||
Account *account;
|
Account *account;
|
||||||
|
|
||||||
split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
|
split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
|
||||||
|
|
||||||
if (split == xaccSplitLookup (&info->blank_split_guid,
|
if (split == xaccSplitLookup (&info->blank_split_guid,
|
||||||
gnc_get_current_book ()))
|
gnc_get_current_book ()))
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1372,7 +1371,7 @@ gnc_split_register_get_balance_entry (VirtualLocation virt_loc,
|
|||||||
if (gnc_reverse_balance (account))
|
if (gnc_reverse_balance (account))
|
||||||
balance = gnc_numeric_neg (balance);
|
balance = gnc_numeric_neg (balance);
|
||||||
|
|
||||||
return xaccPrintAmount (balance, gnc_account_print_info (account, FALSE));
|
return xaccPrintAmount (balance, gnc_account_print_info (account, reg->mismatched_commodities));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
@ -1655,7 +1654,7 @@ gnc_split_register_get_tdebcred_entry (VirtualLocation virt_loc,
|
|||||||
|
|
||||||
total = gnc_numeric_abs (total);
|
total = gnc_numeric_abs (total);
|
||||||
|
|
||||||
return xaccPrintAmount (total, gnc_split_amount_print_info (split, FALSE));
|
return xaccPrintAmount (total, gnc_split_amount_print_info (split, reg->mismatched_commodities));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return TRUE if we have a RATE_CELL; return FALSE if we do not.
|
/* return TRUE if we have a RATE_CELL; return FALSE if we do not.
|
||||||
@ -1811,7 +1810,7 @@ gnc_split_register_get_debcred_entry (VirtualLocation virt_loc,
|
|||||||
GNC_HOW_RND_ROUND_HALF_UP);
|
GNC_HOW_RND_ROUND_HALF_UP);
|
||||||
}
|
}
|
||||||
|
|
||||||
return xaccPrintAmount (imbalance, gnc_account_print_info (acc, FALSE));
|
return xaccPrintAmount (imbalance, gnc_account_print_info (acc, reg->mismatched_commodities));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -1874,22 +1873,20 @@ gnc_split_register_get_debcred_entry (VirtualLocation virt_loc,
|
|||||||
* currency != the account commodity, then use the SplitAmount
|
* currency != the account commodity, then use the SplitAmount
|
||||||
* instead of the SplitValue.
|
* instead of the SplitValue.
|
||||||
*/
|
*/
|
||||||
|
gboolean currency_match;
|
||||||
switch (reg->type)
|
switch (reg->type)
|
||||||
{
|
{
|
||||||
case STOCK_REGISTER:
|
case STOCK_REGISTER:
|
||||||
case CURRENCY_REGISTER:
|
case CURRENCY_REGISTER:
|
||||||
case PORTFOLIO_LEDGER:
|
case PORTFOLIO_LEDGER:
|
||||||
amount = xaccSplitGetValue (split);
|
amount = xaccSplitGetValue (split);
|
||||||
print_info = gnc_commodity_print_info (currency, FALSE);
|
print_info = gnc_commodity_print_info (currency, reg->mismatched_commodities);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (commodity && !gnc_commodity_equal (commodity, currency))
|
|
||||||
/* Convert this to the "local" value */
|
|
||||||
amount = xaccSplitConvertAmount(split, account);
|
|
||||||
else
|
|
||||||
amount = xaccSplitGetValue (split);
|
amount = xaccSplitGetValue (split);
|
||||||
print_info = gnc_account_print_info (account, FALSE);
|
print_info = gnc_account_print_info (account, reg->mismatched_commodities);
|
||||||
|
print_info.commodity = currency;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2421,7 +2418,7 @@ gnc_template_register_get_debcred_entry (VirtualLocation virt_loc,
|
|||||||
|
|
||||||
amount2 = gnc_numeric_abs (*amount);
|
amount2 = gnc_numeric_abs (*amount);
|
||||||
g_free (amount);
|
g_free (amount);
|
||||||
return xaccPrintAmount (amount2, gnc_default_print_info (FALSE));
|
return xaccPrintAmount (amount2, gnc_default_print_info (reg->mismatched_commodities));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2816,7 +2816,8 @@ gnc_split_register_init (SplitRegister *reg,
|
|||||||
SplitRegisterStyle style,
|
SplitRegisterStyle style,
|
||||||
gboolean use_double_line,
|
gboolean use_double_line,
|
||||||
gboolean do_auto_complete,
|
gboolean do_auto_complete,
|
||||||
gboolean is_template)
|
gboolean is_template,
|
||||||
|
gboolean mismatched_commodities)
|
||||||
{
|
{
|
||||||
TableLayout *layout;
|
TableLayout *layout;
|
||||||
TableModel *model;
|
TableModel *model;
|
||||||
@ -2857,6 +2858,7 @@ gnc_split_register_init (SplitRegister *reg,
|
|||||||
reg->use_double_line = use_double_line;
|
reg->use_double_line = use_double_line;
|
||||||
reg->do_auto_complete = do_auto_complete;
|
reg->do_auto_complete = do_auto_complete;
|
||||||
reg->is_template = is_template;
|
reg->is_template = is_template;
|
||||||
|
reg->mismatched_commodities = mismatched_commodities;
|
||||||
reg->use_tran_num_for_num_field =
|
reg->use_tran_num_for_num_field =
|
||||||
(qof_book_use_split_action_for_num_field(gnc_get_current_book())
|
(qof_book_use_split_action_for_num_field(gnc_get_current_book())
|
||||||
? FALSE : TRUE);
|
? FALSE : TRUE);
|
||||||
@ -2914,7 +2916,8 @@ SplitRegister *
|
|||||||
gnc_split_register_new (SplitRegisterType type,
|
gnc_split_register_new (SplitRegisterType type,
|
||||||
SplitRegisterStyle style,
|
SplitRegisterStyle style,
|
||||||
gboolean use_double_line,
|
gboolean use_double_line,
|
||||||
gboolean is_template)
|
gboolean is_template,
|
||||||
|
gboolean mismatched_commodities)
|
||||||
{
|
{
|
||||||
SplitRegister * reg;
|
SplitRegister * reg;
|
||||||
gboolean default_do_auto_complete = TRUE;
|
gboolean default_do_auto_complete = TRUE;
|
||||||
@ -2929,7 +2932,8 @@ gnc_split_register_new (SplitRegisterType type,
|
|||||||
style,
|
style,
|
||||||
use_double_line,
|
use_double_line,
|
||||||
default_do_auto_complete,
|
default_do_auto_complete,
|
||||||
is_template);
|
is_template,
|
||||||
|
mismatched_commodities);
|
||||||
|
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
@ -254,6 +254,8 @@ struct split_register
|
|||||||
|
|
||||||
gboolean is_template;
|
gboolean is_template;
|
||||||
gboolean do_auto_complete; /**< whether to use auto-completion */
|
gboolean do_auto_complete; /**< whether to use auto-completion */
|
||||||
|
gboolean mismatched_commodities; /**< indicates the register includes transactions in
|
||||||
|
mismatched commodities */
|
||||||
|
|
||||||
SplitList *unrecn_splits; /**< list of splits to unreconcile after transaction edit */
|
SplitList *unrecn_splits; /**< list of splits to unreconcile after transaction edit */
|
||||||
|
|
||||||
@ -282,7 +284,8 @@ typedef GtkWidget *(*SRGetParentCallback) (gpointer user_data);
|
|||||||
SplitRegister * gnc_split_register_new (SplitRegisterType type,
|
SplitRegister * gnc_split_register_new (SplitRegisterType type,
|
||||||
SplitRegisterStyle style,
|
SplitRegisterStyle style,
|
||||||
gboolean use_double_line,
|
gboolean use_double_line,
|
||||||
gboolean is_template);
|
gboolean is_template,
|
||||||
|
gboolean mismatched_commodities);
|
||||||
|
|
||||||
/** Destroys a split register.
|
/** Destroys a split register.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user