r22645 - gnucash/trunk/src/engine - Better detection of unbalanced transactions with trading accounts.

Mike Alexander mta at code.gnucash.org
Thu Dec 13 00:13:42 EST 2012


Author: mta
Date: 2012-12-13 00:13:42 -0500 (Thu, 13 Dec 2012)
New Revision: 22645
Trac: http://svn.gnucash.org/trac/changeset/22645

Modified:
   gnucash/trunk/src/engine/Transaction.c
Log:
Better detection of unbalanced transactions with trading accounts.
A transaction's value should be balanced independently in trading and
non-trading splits to be considered balanced.  Incorrect adjustment
of exchange rates on existing splits can cause this to be an issue.

Modified: gnucash/trunk/src/engine/Transaction.c
===================================================================
--- gnucash/trunk/src/engine/Transaction.c	2012-12-13 05:13:34 UTC (rev 22644)
+++ gnucash/trunk/src/engine/Transaction.c	2012-12-13 05:13:42 UTC (rev 22645)
@@ -949,7 +949,33 @@
 {
     MonetaryList *imbal_list;
     gboolean result;
-    if (! gnc_numeric_zero_p(xaccTransGetImbalanceValue(trans)))
+    gnc_numeric imbal = gnc_numeric_zero();
+    gnc_numeric imbal_trading = gnc_numeric_zero();
+    
+    if (xaccTransUseTradingAccounts(trans))
+    {
+        /* Transaction is imbalanced if the value is imbalanced in either 
+           trading or non-trading splits.  One can't be used to balance
+           the other. */
+        FOR_EACH_SPLIT(trans, 
+        {
+            if (xaccAccountGetType(xaccSplitGetAccount(s)) != ACCT_TYPE_TRADING)
+            {
+                imbal = gnc_numeric_add(imbal, xaccSplitGetValue(s),
+                                        GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT);
+            }
+            else
+            {
+                imbal_trading = gnc_numeric_add(imbal_trading, xaccSplitGetValue(s),
+                                                GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT);
+            }
+        } 
+        );
+    }
+    else
+        imbal = xaccTransGetImbalanceValue(trans);
+    
+    if (! gnc_numeric_zero_p(imbal) || ! gnc_numeric_zero_p(imbal_trading))
         return FALSE;
 
     if (!xaccTransUseTradingAccounts (trans))



More information about the gnucash-changes mailing list