[Gnucash-changes] r13916 - gnucash/trunk/src - Hide the Transaction's management of the "reverse-by" KVP inside the engine.

Chris Shoemaker chris at cvs.gnucash.org
Wed May 3 20:06:59 EDT 2006


Author: chris
Date: 2006-05-03 20:06:58 -0400 (Wed, 03 May 2006)
New Revision: 13916
Trac: http://svn.gnucash.org/trac/changeset/13916

Modified:
   gnucash/trunk/src/engine/Transaction.c
   gnucash/trunk/src/engine/Transaction.h
   gnucash/trunk/src/gnome/gnc-plugin-page-register.c
   gnucash/trunk/src/gnome/gnc-split-reg.c
Log:
   Hide the Transaction's management of the "reverse-by" KVP inside the engine.
   Add new function xaccTransGetReversedBy() to find the reversing transaction
   if there is one.
   This also ensures that the KVP changes are inside a Begin/Commit block.


Modified: gnucash/trunk/src/engine/Transaction.c
===================================================================
--- gnucash/trunk/src/engine/Transaction.c	2006-05-03 20:46:53 UTC (rev 13915)
+++ gnucash/trunk/src/engine/Transaction.c	2006-05-04 00:06:58 UTC (rev 13916)
@@ -169,6 +169,7 @@
 #define TRANS_DATE_DUE_KVP       "trans-date-due"
 #define TRANS_TXN_TYPE_KVP       "trans-txn-type"
 #define TRANS_READ_ONLY_REASON   "trans-read-only"
+#define TRANS_REVERSED_BY        "reversed-by"
 
 #define ISO_DATELENGTH 32 /* length of an iso 8601 date string. */
 
@@ -1797,11 +1798,14 @@
   xaccTransCommitEdit(trans);
 }
 
-void
-xaccTransReverse (Transaction *trans)
+Transaction *
+xaccTransReverse (Transaction *orig)
 {
-  g_return_if_fail(trans);
+  Transaction *trans;
+  kvp_value *kvp_val;
+  g_return_val_if_fail(orig, NULL);
 
+  trans = xaccTransClone(orig);
   xaccTransBeginEdit(trans);
 
   /* Reverse the values on each split. Clear per-split info. */
@@ -1812,9 +1816,24 @@
           qof_instance_set_dirty(QOF_INSTANCE(trans));
       });
 
+  /* Now update the original with a pointer to the new one */
+  kvp_val = kvp_value_new_guid(xaccTransGetGUID(trans));
+  kvp_frame_set_slot_nc(orig->inst.kvp_data, TRANS_REVERSED_BY, kvp_val);
+
   xaccTransCommitEdit(trans);
+  return trans;
 }
 
+Transaction *
+xaccTransGetReversedBy(const Transaction *trans)
+{
+    GUID *guid;
+
+    g_return_val_if_fail(trans, NULL);
+    guid = kvp_frame_get_guid(trans->inst.kvp_data, TRANS_REVERSED_BY);
+    return xaccTransLookup(guid, trans->inst.book);
+}
+
 void
 xaccTransScrubSplits (Transaction *trans)
 {

Modified: gnucash/trunk/src/engine/Transaction.h
===================================================================
--- gnucash/trunk/src/engine/Transaction.h	2006-05-03 20:46:53 UTC (rev 13915)
+++ gnucash/trunk/src/engine/Transaction.h	2006-05-04 00:06:58 UTC (rev 13916)
@@ -478,17 +478,28 @@
  */
 void xaccTransUnvoid(Transaction *transaction);
 
-/** xaccTransReverse inverts all the numerical values on the given
- *  transaction.  This function can be used after xaccTransClone
- *  to create a transaction that cancels out the effect of an
- *  earlier transaction.  This will be needed by write only accounts
- *  as a way to void a previous transaction (since you can't alter
- *  the existing transaction).
+/** xaccTransReverse creates a Transaction that reverses the given
+ *  tranaction by inverting all the numerical values in the given
+ *  transaction.  This function cancels out the effect of an earlier
+ *  transaction.  This will be needed by write only accounts as a way
+ *  to void a previous transaction (since you can't alter the existing
+ *  transaction).
  *
- *  @param transaction The transaction to reverse.
+ *  @param transaction The transaction to create a reverse of.
+ *
+ *  @return a new transaction which reverses the given transaction
  */
-void xaccTransReverse(Transaction *transaction);
+Transaction * xaccTransReverse(Transaction *transaction);
 
+/** Returns the transaction that reversed the given transaction.
+ *
+ *  @param trans a Transaction that has been reversed
+ *
+ *  @param the transaction that reversed the given transaction, or
+ *  NULL if the given transaction has not been reversed.
+ */
+Transaction * xaccTransGetReversedBy(const Transaction *trans);
+
 /** Retrieve information on whether or not a transaction has been voided.
  *
  *  @param transaction The transaction in question.

Modified: gnucash/trunk/src/gnome/gnc-plugin-page-register.c
===================================================================
--- gnucash/trunk/src/gnome/gnc-plugin-page-register.c	2006-05-03 20:46:53 UTC (rev 13915)
+++ gnucash/trunk/src/gnome/gnc-plugin-page-register.c	2006-05-04 00:06:58 UTC (rev 13916)
@@ -2030,10 +2030,7 @@
   SplitRegister *reg;
   GNCSplitReg *gsr;
   Transaction *trans, *new_trans;
-  kvp_frame *txn_frame;
-  kvp_value *kvp_val;
 
-
   ENTER("(action %p, page %p)", action, page);
 
   g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
@@ -2044,28 +2041,19 @@
   if (trans == NULL)
     return;
 
-  txn_frame = xaccTransGetSlots( trans );
-  if ( txn_frame != NULL ) {
-    kvp_val = kvp_frame_get_slot( txn_frame, "reversed-by" );
-    if ( kvp_val ) {
-      // GUID *fromSXId = kvp_value_get_guid( kvp_val );
-      GtkWidget *win = GTK_WIDGET(gnc_window_get_gtk_window(GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window)));
-      gnc_error_dialog(win, _("A reversing entry has already been created for this transaction."));
+  if (xaccTransGetReversedBy(trans)) {
+      gnc_error_dialog(gnc_plugin_page_get_window(GNC_PLUGIN_PAGE(page)),
+        _("A reversing entry has already been created for this transaction."));
       return;
-    }
   }
 
   qof_event_suspend();
-  new_trans = xaccTransClone(trans);
-  xaccTransReverse(new_trans);
+  new_trans = xaccTransReverse(trans);
 
   /* Clear transaction level info */
   xaccTransSetDatePostedSecs(new_trans, time(NULL));
   xaccTransSetDateEnteredSecs(new_trans, time(NULL));
 
-  /* Now update the original with a pointer to the new one */
-  kvp_val = kvp_value_new_guid (xaccTransGetGUID(new_trans));
-  kvp_frame_set_slot_nc(txn_frame, "reversed-by", kvp_val);
   qof_event_resume();
 
   /* Now jump to new trans */

Modified: gnucash/trunk/src/gnome/gnc-split-reg.c
===================================================================
--- gnucash/trunk/src/gnome/gnc-split-reg.c	2006-05-03 20:46:53 UTC (rev 13915)
+++ gnucash/trunk/src/gnome/gnc-split-reg.c	2006-05-04 00:06:58 UTC (rev 13916)
@@ -899,36 +899,24 @@
 {
   SplitRegister *reg;
   Transaction *trans, *new_trans;
-  kvp_frame *txn_frame;
-  kvp_value *kvp_val;
 
   reg = gnc_ledger_display_get_split_register( gsr->ledger );
   trans = gnc_split_register_get_current_trans (reg);
   if (trans == NULL)
     return;
 
-  txn_frame = xaccTransGetSlots( trans );
-  if ( txn_frame != NULL ) {
-    kvp_val = kvp_frame_get_slot( txn_frame, "reversed-by" );
-    if ( kvp_val ) {
-      // GUID *fromSXId = kvp_value_get_guid( kvp_val );
+  if (xaccTransGetReversedBy(trans)) {
       gnc_error_dialog(gsr->window,
-		       _("A reversing entry has already been created for this transaction."));
+        _("A reversing entry has already been created for this transaction."));
       return;
-    }
   }
+  
+  new_trans = xaccTransReverse(trans);
 
-  new_trans = xaccTransClone(trans);
-  xaccTransReverse(new_trans);
-
   /* Clear transaction level info */
   xaccTransSetDatePostedSecs(new_trans, time(NULL));
   xaccTransSetDateEnteredSecs(new_trans, time(NULL));
 
-  /* Now update the original with a pointer to the new one */
-  kvp_val = kvp_value_new_guid (xaccTransGetGUID(new_trans));
-  kvp_frame_set_slot_nc(txn_frame, "reversed-by", kvp_val);
-
   /* Now jump to new trans */
   gnc_split_reg_jump_to_split(gsr, xaccTransGetSplit(new_trans, 0));
 }



More information about the gnucash-changes mailing list