[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