diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp index 7c14e0db2d..b0bd8a8937 100644 --- a/libgnucash/engine/Account.cpp +++ b/libgnucash/engine/Account.cpp @@ -3933,6 +3933,50 @@ xaccAccountGetNoclosingBalanceChangeForPeriod (Account *acc, time64 t1, return gnc_numeric_sub(b2, b1, GNC_DENOM_AUTO, GNC_HOW_DENOM_FIXED); } +typedef struct +{ + const gnc_commodity *currency; + gnc_numeric balanceChange; + time64 t1; + time64 t2; +} CurrencyBalanceChange; + +static void +xaccAccountBalanceChangeHelper (Account *acc, gpointer data) +{ + CurrencyBalanceChange *cbdiff = static_cast(data); + + gnc_numeric b1, b2; + b1 = GetBalanceAsOfDate(acc, cbdiff->t1, TRUE); + b2 = GetBalanceAsOfDate(acc, cbdiff->t2, TRUE); + gnc_numeric balanceChange = gnc_numeric_sub(b2, b1, GNC_DENOM_AUTO, GNC_HOW_DENOM_FIXED); + gnc_numeric balanceChange_conv = xaccAccountConvertBalanceToCurrencyAsOfDate(acc, balanceChange, xaccAccountGetCommodity(acc), cbdiff->currency, cbdiff->t2); + cbdiff->balanceChange = gnc_numeric_add (cbdiff->balanceChange, balanceChange_conv, + gnc_commodity_get_fraction (cbdiff->currency), + GNC_HOW_RND_ROUND_HALF_UP); +} + +gnc_numeric +xaccAccountGetNoclosingBalanceChangeInCurrencyForPeriod (Account *acc, time64 t1, + time64 t2, gboolean recurse) +{ + + + gnc_numeric b1, b2; + b1 = GetBalanceAsOfDate(acc, t1, TRUE); + b2 = GetBalanceAsOfDate(acc, t2, TRUE); + gnc_numeric balanceChange = gnc_numeric_sub(b2, b1, GNC_DENOM_AUTO, GNC_HOW_DENOM_FIXED); + + gnc_commodity *report_commodity = xaccAccountGetCommodity(acc); + CurrencyBalanceChange cbdiff = { report_commodity, balanceChange, t1, t2 }; + + if(recurse) + { + gnc_account_foreach_descendant (acc, xaccAccountBalanceChangeHelper, &cbdiff); + balanceChange = cbdiff.balanceChange; + } + return balanceChange; +} /********************************************************************\ \********************************************************************/ diff --git a/libgnucash/engine/Account.h b/libgnucash/engine/Account.h index 499ffbe0e8..342c236c1f 100644 --- a/libgnucash/engine/Account.h +++ b/libgnucash/engine/Account.h @@ -618,6 +618,8 @@ typedef enum gnc_numeric xaccAccountGetNoclosingBalanceChangeForPeriod ( Account *acc, time64 date1, time64 date2, gboolean recurse); + gnc_numeric xaccAccountGetNoclosingBalanceChangeInCurrencyForPeriod ( + Account *acc, time64 date1, time64 date2, gboolean recurse); gnc_numeric xaccAccountGetBalanceChangeForPeriod ( Account *acc, time64 date1, time64 date2, gboolean recurse); diff --git a/libgnucash/engine/Recurrence.c b/libgnucash/engine/Recurrence.c index b450e93689..5054b0ba1e 100644 --- a/libgnucash/engine/Recurrence.c +++ b/libgnucash/engine/Recurrence.c @@ -426,7 +426,7 @@ recurrenceGetAccountPeriodValue(const Recurrence *r, Account *acc, guint n) g_return_val_if_fail(r && acc, gnc_numeric_zero()); t1 = recurrenceGetPeriodTime(r, n, FALSE); t2 = recurrenceGetPeriodTime(r, n, TRUE); - return xaccAccountGetNoclosingBalanceChangeForPeriod (acc, t1, t2, TRUE); + return xaccAccountGetNoclosingBalanceChangeInCurrencyForPeriod (acc, t1, t2, TRUE); } void