Skip to content

Commit

Permalink
Demonstrate fx handling in budget report
Browse files Browse the repository at this point in the history
  • Loading branch information
moredanphysics authored and jralls committed Apr 29, 2023
1 parent 20970fe commit 04b0317
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
44 changes: 44 additions & 0 deletions libgnucash/engine/Account.cpp
Expand Up @@ -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<CurrencyBalanceChange*>(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;
}

/********************************************************************\
\********************************************************************/
Expand Down
2 changes: 2 additions & 0 deletions libgnucash/engine/Account.h
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion libgnucash/engine/Recurrence.c
Expand Up @@ -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
Expand Down

0 comments on commit 04b0317

Please sign in to comment.