[Gnucash-changes] r14246 - gnucash/branches/register-rewrite/src - Some convenient engine api changes/additions.

Chris Shoemaker chris at cvs.gnucash.org
Mon May 29 16:48:59 EDT 2006


Author: chris
Date: 2006-05-29 16:48:58 -0400 (Mon, 29 May 2006)
New Revision: 14246
Trac: http://svn.gnucash.org/trac/changeset/14246

Modified:
   gnucash/branches/register-rewrite/src/engine/Split.c
   gnucash/branches/register-rewrite/src/engine/Split.h
   gnucash/branches/register-rewrite/src/engine/Transaction.c
   gnucash/branches/register-rewrite/src/engine/Transaction.h
   gnucash/branches/register-rewrite/src/register/ledger-core/split-register-model.c
Log:
   Some convenient engine api changes/additions.
   - make xaccSplitConvertAmount() take the target commodity instead of account
     - fix the one caller.
   - add xaccTransSetRateForCommodity(), xaccTransAdjustRateForCommodity() and
     xaccTransGetRateForCommodity() for managing the rates internal to a trans.


Modified: gnucash/branches/register-rewrite/src/engine/Split.c
===================================================================
--- gnucash/branches/register-rewrite/src/engine/Split.c	2006-05-29 20:43:07 UTC (rev 14245)
+++ gnucash/branches/register-rewrite/src/engine/Split.c	2006-05-29 20:48:58 UTC (rev 14246)
@@ -570,6 +570,7 @@
 
     mark_acc(acc);
     xaccAccountRecomputeBalance(acc);
+    //qof_event_gen (&acc->inst.entity, GNC_EVENT_ITEM_CHANGED, ed);
     if (s->inst.do_free)
         xaccFreeSplit(s);
 }
@@ -1036,9 +1037,9 @@
 }
 
 gnc_numeric
-xaccSplitConvertAmount (const Split *split, Account * account)
+xaccSplitConvertAmount (const Split *split, const gnc_commodity *to_commodity)
 {
-  gnc_commodity *acc_com, *to_commodity;
+  gnc_commodity *acc_com;
   Transaction *txn;
   gnc_numeric amount, value, convrate;
   Account * split_acc;
@@ -1047,12 +1048,9 @@
 
   /* If this split is attached to this account, OR */
   split_acc = xaccSplitGetAccount (split);
-  if (split_acc == account)
-    return amount;
 
   /* If split->account->commodity == to_commodity, return the amount */
   acc_com = xaccAccountGetCommodity (split_acc);
-  to_commodity = xaccAccountGetCommodity (account);
   if (acc_com && gnc_commodity_equal (acc_com, to_commodity))
     return amount;
 
@@ -1080,7 +1078,8 @@
    * compute the conversion rate (based on amount/value), and then multiply
    * this times the split value.
    */
-  convrate = xaccTransGetAccountConvRate(txn, account);
+  if (!xaccTransGetRateForCommodity(txn, to_commodity, NULL, &convrate))
+      return gnc_numeric_zero();
   value = xaccSplitGetValue (split);
   return gnc_numeric_mul (value, convrate,
 			  gnc_commodity_get_fraction (to_commodity),

Modified: gnucash/branches/register-rewrite/src/engine/Split.h
===================================================================
--- gnucash/branches/register-rewrite/src/engine/Split.h	2006-05-29 20:43:07 UTC (rev 14245)
+++ gnucash/branches/register-rewrite/src/engine/Split.h	2006-05-29 20:48:58 UTC (rev 14246)
@@ -58,7 +58,8 @@
  * in particular we want to convert the Split to be in to_commodity.
  * Returns the amount.
  */
-gnc_numeric xaccSplitConvertAmount (const Split *split, Account * account);
+gnc_numeric xaccSplitConvertAmount (const Split *split,
+                                    const gnc_commodity *to_commodity);
 
 /*-----------------------------------------------------------------------
  * Splits

Modified: gnucash/branches/register-rewrite/src/engine/Transaction.c
===================================================================
--- gnucash/branches/register-rewrite/src/engine/Transaction.c	2006-05-29 20:43:07 UTC (rev 14245)
+++ gnucash/branches/register-rewrite/src/engine/Transaction.c	2006-05-29 20:48:58 UTC (rev 14246)
@@ -699,6 +699,112 @@
   return total;
 }
 
+/* 'rate' is 'to_com'-per-'from-com' */
+void
+xaccTransSetRateForCommodity(Transaction *trans, gnc_commodity *from_com,
+                             gnc_commodity *to_com, gnc_numeric rate)
+{
+    GList *splits;
+    gnc_commodity *trans_curr = xaccTransGetCurrency(trans);
+    gnc_numeric amt, val;
+
+    for (splits = trans->splits; splits; splits = splits->next) {
+        Split *s = splits->data;
+        gnc_commodity *split_com;
+
+        if (!xaccTransStillHasSplit(trans, s)) continue;
+        split_com = xaccAccountGetCommodity(xaccSplitGetAccount(s));
+
+        if (gnc_commodity_equiv(from_com, trans_curr) &&
+            gnc_commodity_equiv(to_com, split_com)) {
+            if (1) {
+                val = xaccSplitGetValue(s);
+                amt = gnc_numeric_mul(val, rate, GNC_DENOM_AUTO,
+                                      GNC_HOW_RND_ROUND);
+                xaccSplitSetAmount(s, amt);
+            }
+        }
+
+        if (gnc_commodity_equiv(to_com, trans_curr) &&
+            gnc_commodity_equiv(from_com, split_com)) {
+            if (1) {
+                val = xaccSplitGetValue(s);
+                amt = gnc_numeric_div(val, rate, GNC_DENOM_AUTO,
+                                      GNC_HOW_RND_ROUND);
+                xaccSplitSetAmount(s, amt);
+            }
+        }
+
+    }
+}
+
+void
+xaccTransAdjustRateForCommodity(Transaction *trans, gnc_commodity *comm,
+                                gnc_numeric factor)
+{
+    gnc_commodity *trans_curr = xaccTransGetCurrency(trans);
+    gnc_commodity *split_com;
+    gnc_numeric num;
+
+    g_return_if_fail(trans && trans_curr);
+    g_return_if_fail(gnc_numeric_check(factor) == GNC_ERROR_OK);
+
+    FOR_EACH_SPLIT(trans, {
+            if (gnc_commodity_equiv(comm, trans_curr)) {
+                num = xaccSplitGetValue(s);
+                num = gnc_numeric_mul(num, factor,
+                                      gnc_commodity_get_fraction(trans_curr),
+                                      GNC_HOW_RND_ROUND);
+                xaccSplitSetValue(s, num);
+            }
+
+            split_com = xaccAccountGetCommodity(xaccSplitGetAccount(s));
+            if (gnc_commodity_equiv(comm, split_com)) {
+                num = xaccSplitGetAmount(s);
+                num = gnc_numeric_mul(num, factor, GNC_DENOM_AUTO,
+                                      GNC_HOW_RND_ROUND);
+                xaccSplitSetAmount(s, num);
+            }
+        });
+}
+
+gboolean
+xaccTransGetRateForCommodity(const Transaction *trans,
+                             const gnc_commodity *split_com,
+                             const Split *split_to_exclude, gnc_numeric *rate)
+{
+    GList *splits;
+    gnc_commodity *trans_curr;
+
+    trans_curr = xaccTransGetCurrency(trans);
+    if (gnc_commodity_equal(trans_curr, split_com)) {
+        *rate = gnc_numeric_create(1, 1);
+        return TRUE;
+    }
+
+    for (splits = trans->splits; splits; splits = splits->next) {
+        Split *s = splits->data;
+        gnc_commodity *comm;
+
+        if (s == split_to_exclude) continue;
+        if (!xaccTransStillHasSplit(trans, s)) continue;
+
+        comm = xaccAccountGetCommodity(xaccSplitGetAccount(s));
+        if (gnc_commodity_equal(split_com, comm)) {
+            gnc_numeric amt = xaccSplitGetAmount(s);
+            gnc_numeric val = xaccSplitGetValue(s);
+
+            if (!gnc_numeric_zero_p(xaccSplitGetValue(s)) &&
+                !gnc_numeric_zero_p(xaccSplitGetValue(s))) {
+                *rate = gnc_numeric_div(amt, val, GNC_DENOM_AUTO,
+                                        GNC_DENOM_REDUCE);
+                return TRUE;
+            }
+        }
+    }
+    return FALSE;
+}
+
 gnc_numeric
 xaccTransGetAccountConvRate(Transaction *txn, Account *acc)
 {

Modified: gnucash/branches/register-rewrite/src/engine/Transaction.h
===================================================================
--- gnucash/branches/register-rewrite/src/engine/Transaction.h	2006-05-29 20:43:07 UTC (rev 14245)
+++ gnucash/branches/register-rewrite/src/engine/Transaction.h	2006-05-29 20:48:58 UTC (rev 14246)
@@ -271,7 +271,7 @@
     splits in this transaction.
     @param trans The transaction  
     @param i The split number.  Valid values for i are zero to 
-    (number_of__splits-1).  An invalid value of i will cause NULL to
+    (number_of_splits-1).  An invalid value of i will cause NULL to
     be returned.  A convenient way of cycling through all splits is
     to start at zero, and keep incrementing until a null value is returned. */
 Split *       xaccTransGetSplit (const Transaction *trans, int i);
@@ -345,6 +345,19 @@
 gnc_numeric xaccTransGetAccountAmount (const Transaction *trans,
                                        const Account *account);
 
+/* Gets the amt/val rate, i.e. rate from the transaction currency to
+   the 'split_com' */
+gboolean
+xaccTransGetRateForCommodity(const Transaction *trans,
+                             const gnc_commodity *split_com,
+                             const Split *split_to_exclude, gnc_numeric *rate);
+void
+xaccTransSetRateForCommodity(Transaction *trans, gnc_commodity *from_com,
+                             gnc_commodity *to_com, gnc_numeric rate);
+void
+xaccTransAdjustRateForCommodity(Transaction *trans, gnc_commodity *comm,
+                                gnc_numeric factor);
+
 /* Compute the conversion rate for the transaction to this account.
  * Any "split value" (which is in the transaction currency),
  * multiplied by this conversion rate, will give you the value you

Modified: gnucash/branches/register-rewrite/src/register/ledger-core/split-register-model.c
===================================================================
--- gnucash/branches/register-rewrite/src/register/ledger-core/split-register-model.c	2006-05-29 20:43:07 UTC (rev 14245)
+++ gnucash/branches/register-rewrite/src/register/ledger-core/split-register-model.c	2006-05-29 20:48:58 UTC (rev 14246)
@@ -1480,7 +1480,7 @@
 
 	if (commodity && !gnc_commodity_equal (commodity, currency))
 	  /* Convert this to the "local" value */
-	  amount = xaccSplitConvertAmount(split, account);
+	  amount = xaccSplitConvertAmount(split, commodity);
 	else
 	  amount = xaccSplitGetValue (split);
       }



More information about the gnucash-changes mailing list