r17782 - gnucash/trunk/src/gnome - Bug #563565: Reconcile Window: Add new action for balancing entry

Christian Stimming cstim at cvs.gnucash.org
Sat Dec 20 16:21:48 EST 2008


Author: cstim
Date: 2008-12-20 16:21:47 -0500 (Sat, 20 Dec 2008)
New Revision: 17782
Trac: http://svn.gnucash.org/trac/changeset/17782

Modified:
   gnucash/trunk/src/gnome/gnc-split-reg.c
   gnucash/trunk/src/gnome/gnc-split-reg.h
   gnucash/trunk/src/gnome/ui/gnc-reconcile-window-ui.xml
   gnucash/trunk/src/gnome/window-reconcile.c
Log:
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.

Modified: gnucash/trunk/src/gnome/gnc-split-reg.c
===================================================================
--- gnucash/trunk/src/gnome/gnc-split-reg.c	2008-12-20 21:16:23 UTC (rev 17781)
+++ gnucash/trunk/src/gnome/gnc-split-reg.c	2008-12-20 21:21:47 UTC (rev 17782)
@@ -86,6 +86,9 @@
 
 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 );
@@ -1337,6 +1340,72 @@
 }
 
 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 )
 {
   SplitRegister *reg;

Modified: gnucash/trunk/src/gnome/gnc-split-reg.h
===================================================================
--- gnucash/trunk/src/gnome/gnc-split-reg.h	2008-12-20 21:16:23 UTC (rev 17781)
+++ gnucash/trunk/src/gnome/gnc-split-reg.h	2008-12-20 21:21:47 UTC (rev 17782)
@@ -222,6 +222,16 @@
 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 );

Modified: gnucash/trunk/src/gnome/ui/gnc-reconcile-window-ui.xml
===================================================================
--- gnucash/trunk/src/gnome/ui/gnc-reconcile-window-ui.xml	2008-12-20 21:16:23 UTC (rev 17781)
+++ gnucash/trunk/src/gnome/ui/gnc-reconcile-window-ui.xml	2008-12-20 21:21:47 UTC (rev 17782)
@@ -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"/>

Modified: gnucash/trunk/src/gnome/window-reconcile.c
===================================================================
--- gnucash/trunk/src/gnome/window-reconcile.c	2008-12-20 21:16:23 UTC (rev 17781)
+++ gnucash/trunk/src/gnome/window-reconcile.c	2008-12-20 21:21:47 UTC (rev 17782)
@@ -298,6 +298,10 @@
 					"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;
 }
 
@@ -1120,6 +1124,35 @@
 }
 
 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)
 {
   RecnWindow *recnData = data;
@@ -2070,6 +2103,9 @@
 	{ "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)},



More information about the gnucash-changes mailing list