Bug #563565: Reconcile Window: Add new action for balancing entry

Add a new action "Balance" to reconcile window. It is only sensitive if the
difference is != 0.
If activated, it creates a new transaction in the account register to adjust
the difference. The corresponding account defaults to the orphan account.
Jump to the new transaction in the register window.

Patch by C. Ernst.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@17782 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Christian Stimming
2008-12-20 21:21:47 +00:00
parent 7baf9f5c75
commit ea7c0f21bb
4 changed files with 123 additions and 6 deletions

View File

@@ -86,6 +86,9 @@ static void gnc_split_reg_refresh_toolbar( GNCSplitReg *gsr );
static void gnc_split_reg_ld_destroy( GNCLedgerDisplay *ledger );
static Transaction* create_balancing_transaction(QofBook *book, Account *account,
time_t statement_date, gnc_numeric balancing_amount);
void gsr_default_enter_handler ( GNCSplitReg *w, gpointer ud );
void gsr_default_cancel_handler ( GNCSplitReg *w, gpointer ud );
void gsr_default_delete_handler ( GNCSplitReg *w, gpointer ud );
@@ -1336,6 +1339,72 @@ gnc_split_reg_jump_to_blank (GNCSplitReg *gsr)
gnc_ledger_display_refresh (gsr->ledger);
}
void
gnc_split_reg_balancing_entry(GNCSplitReg *gsr, Account *account,
time_t statement_date, gnc_numeric balancing_amount) {
Transaction *transaction;
Split *split;
// create transaction
transaction = create_balancing_transaction(gnc_get_current_book(),
account, statement_date, balancing_amount);
// jump to transaction
split = xaccTransFindSplitByAccount(transaction, account);
if (split == NULL) {
// default behaviour: jump to blank split
g_warning("create_balancing_transaction failed");
gnc_split_reg_jump_to_blank(gsr);
} else {
// goto balancing transaction
gnc_split_reg_jump_to_split(gsr, split );
}
}
static Transaction*
create_balancing_transaction(QofBook *book, Account *account,
time_t statement_date, gnc_numeric balancing_amount) {
Transaction *trans;
Split *split;
if (!account)
return NULL;
if (gnc_numeric_zero_p(balancing_amount))
return NULL;
xaccAccountBeginEdit(account);
trans = xaccMallocTransaction(book);
xaccTransBeginEdit(trans);
// fill Transaction
xaccTransSetCurrency(trans, xaccAccountGetCommodity(account));
xaccTransSetDateSecs(trans, statement_date);
xaccTransSetDescription(trans, _("Balancing entry from reconcilation"));
// 1. Split
split = xaccMallocSplit(book);
xaccTransAppendSplit(trans, split);
xaccAccountInsertSplit(account, split);
xaccSplitSetAmount(split, balancing_amount);
xaccSplitSetValue(split, balancing_amount);
// 2. Split (no account is defined: split goes to orphan account)
split = xaccMallocSplit(book);
xaccTransAppendSplit(trans, split);
balancing_amount = gnc_numeric_neg(balancing_amount);
xaccSplitSetAmount(split, balancing_amount);
xaccSplitSetValue(split, balancing_amount);
xaccTransCommitEdit(trans);
xaccAccountCommitEdit(account);
return trans;
}
void
gsr_default_blank_handler( GNCSplitReg *gsr, gpointer data )
{

View File

@@ -222,6 +222,16 @@ void gnc_split_reg_jump_to_blank (GNCSplitReg *gsr);
void gnc_split_reg_jump_to_split(GNCSplitReg *gsr, Split *split);
void gnc_split_reg_jump_to_split_amount(GNCSplitReg *gsr, Split *split);
/*
* Create a transaction entry with given amount and date. One account is
* specified, the other is undefined i.e. it defaults to orphan account.
* Jump to the transaction entry in the register.
* The purpose of this function to create an adjustment entry from the reconcile
* window.
*/
void gnc_split_reg_balancing_entry (GNCSplitReg *gsr, Account *account,
time_t statement_date, gnc_numeric balancing_amount);
void gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data );
void gnc_split_reg_enter( GNCSplitReg *gsr, gboolean next_transaction );
void gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data );

View File

@@ -18,9 +18,10 @@
</menu>
<menu name="Transaction" action="TransactionMenuAction">
<menuitem name="TransNew" action="TransNewAction"/>
<menuitem name="TransEdit" action="TransEditAction"/>
<menuitem name="TransDelete" action="TransDeleteAction"/>
<menuitem name="TransNew" action="TransNewAction"/>
<menuitem name="TransBalance" action="TransBalanceAction"/>
<menuitem name="TransEdit" action="TransEditAction"/>
<menuitem name="TransDelete" action="TransDeleteAction"/>
</menu>
<menu name="Help" action="HelpMenuAction">
@@ -35,9 +36,10 @@
</popup>
<toolbar name="DefaultToolbar">
<toolitem name="TransNew" action="TransNewAction"/>
<toolitem name="TransEdit" action="TransEditAction"/>
<toolitem name="TransDelete" action="TransDeleteAction"/>
<toolitem name="TransNew" action="TransNewAction"/>
<toolitem name="TransBalance" action="TransBalanceAction"/>
<toolitem name="TransEdit" action="TransEditAction"/>
<toolitem name="TransDelete" action="TransDeleteAction"/>
<separator name="ToolbarSep2"/>
<toolitem name="AccountOpenAccount" action="AccountOpenAccountAction"/>
<separator name="ToolbarSep3"/>

View File

@@ -298,6 +298,10 @@ recnRecalculateBalance (RecnWindow *recnData)
"RecnFinishAction");
gtk_action_set_sensitive(action, gnc_numeric_zero_p (diff));
action = gtk_action_group_get_action (recnData->action_group,
"TransBalanceAction");
gtk_action_set_sensitive(action, !gnc_numeric_zero_p (diff));
return diff;
}
@@ -1119,6 +1123,35 @@ gnc_ui_reconcile_window_new_cb(GtkButton *button, gpointer data)
gnc_split_reg_jump_to_blank( gsr );
}
static void
gnc_ui_reconcile_window_balance_cb(GtkButton *button, gpointer data)
{
RecnWindow *recnData = data;
GNCSplitReg *gsr;
Account *account;
gnc_numeric balancing_amount;
time_t statement_date;
gsr = gnc_reconcile_window_open_register(recnData);
if (gsr == NULL)
return;
account = recn_get_account(recnData);
if (account == NULL)
return;
balancing_amount = recnRecalculateBalance(recnData);
if (gnc_numeric_zero_p(balancing_amount))
return;
statement_date = recnData->statement_date;
if (statement_date == 0)
statement_date = time(NULL); // default to 'now'
gnc_split_reg_balancing_entry(gsr, account, statement_date, balancing_amount);
}
static void
gnc_ui_reconcile_window_delete_cb(GtkButton *button, gpointer data)
{
@@ -2070,6 +2103,9 @@ static GtkActionEntry recnWindow_actions [] =
{ "TransNewAction", GTK_STOCK_NEW, N_("_New"), "<control>n",
N_("Add a new transaction to the account"),
G_CALLBACK(gnc_ui_reconcile_window_new_cb)},
{"TransBalanceAction", GTK_STOCK_EXECUTE, N_("_Balance"), "<control>b",
N_("Add a new balancing entry to the account"),
G_CALLBACK(gnc_ui_reconcile_window_balance_cb)},
{ "TransEditAction", GTK_STOCK_PROPERTIES, N_("_Edit"), "<control>e",
N_("Edit the current transaction"),
G_CALLBACK(gnc_ui_reconcile_window_edit_cb)},