Index: src/engine/Recurrence.h =================================================================== --- src/engine/Recurrence.h (revision 14900) +++ src/engine/Recurrence.h (working copy) @@ -131,7 +131,7 @@ /* Get the amount that an Account's value changed between the beginning and end of the nth instance of the recurrence. */ gnc_numeric recurrenceGetAccountPeriodValue(const Recurrence *r, - Account *acct, guint n); + Account *acct, guint n, gboolean recurse); /* Get the earliest of the next occurances -- a "composite" recurrence */ void recurrenceListNextInstance(const GList *r, const GDate *refDate, Index: src/engine/gnc-budget.c =================================================================== --- src/engine/gnc-budget.c (revision 14900) +++ src/engine/gnc-budget.c (working copy) @@ -275,11 +275,84 @@ #endif +typedef struct { + GncBudget *budget; + guint period_num; + gnc_numeric balance; +} budgetandperiod; + +static gnc_numeric +gnc_budget_xxx_account_period_value(GncBudget *budget, Account *account, + guint period_num) +{ + gnc_numeric numeric; + gchar path[BUF_SIZE]; + gchar *bufend; + KvpFrame *frame; + + numeric = gnc_numeric_zero(); + g_return_val_if_fail(GNC_IS_BUDGET(budget), numeric); + g_return_val_if_fail(account, numeric); + + frame = qof_instance_get_slots(QOF_INSTANCE(budget)); + bufend = guid_to_string_buff(xaccAccountGetGUID(account), path); + g_sprintf(bufend, "/%d", period_num); + numeric = kvp_frame_get_numeric(frame, path); /* Zero if unset */ + return numeric; +} +static gpointer +gnc_budget_xxx_account_period_value_helper (Account *acc, gpointer data) +{ + budgetandperiod *bp = data; + gnc_numeric balance; + +//Could use some checking here. +// g_return_val_if_fail (cb->asOfDateFn && cb->currency, NULL); + + balance = gnc_budget_xxx_account_period_value ( + bp->budget, acc, bp->period_num); + bp->balance = gnc_numeric_add (bp->balance, balance, + GNC_DENOM_AUTO, + GNC_HOW_DENOM_REDUCE); + return NULL; +} + +static gnc_numeric +gnc_budget_xxx_account_period_value_recursive ( + GncBudget *budget, Account *acc, guint period_num, + gboolean include_children) +{ + gnc_numeric balance; + + if (!acc) return gnc_numeric_zero (); + /* g_return_val_if_fail(acc, gnc_numeric_zero()); */ + + balance = gnc_budget_xxx_account_period_value(budget, acc, period_num); + + /* If needed, sum up the children converting to the *requested* + commodity. */ + if (include_children) { + budgetandperiod bp = { budget, period_num, balance }; + + xaccGroupForEachAccount (xaccAccountGetChildren(acc), + gnc_budget_xxx_account_period_value_helper, + &bp, TRUE); + balance = bp.balance; + } + + return balance; +} + /* Does not distinguish between unset and zero - returns zero either way. */ gnc_numeric gnc_budget_get_account_period_value(GncBudget *budget, Account *account, guint period_num) { + + return gnc_budget_xxx_account_period_value_recursive + (budget, account, period_num, TRUE); + +/* gnc_numeric numeric; gchar path[BUF_SIZE]; gchar *bufend; @@ -292,8 +365,9 @@ frame = qof_instance_get_slots(QOF_INSTANCE(budget)); bufend = guid_to_string_buff(xaccAccountGetGUID(account), path); g_sprintf(bufend, "/%d", period_num); - numeric = kvp_frame_get_numeric(frame, path); /* Zero if unset */ + numeric = kvp_frame_get_numeric(frame, path); */ /* Zero if unset */ /* return numeric; + */ } @@ -313,7 +387,7 @@ // FIXME: maybe zero is not best error return val. g_return_val_if_fail(GNC_IS_BUDGET(budget) && acc, gnc_numeric_zero()); return recurrenceGetAccountPeriodValue(&budget->recurrence, - acc, period_num); + acc, period_num, TRUE); } QofBook* Index: src/engine/Recurrence.c =================================================================== --- src/engine/Recurrence.c (revision 14900) +++ src/engine/Recurrence.c (working copy) @@ -244,7 +244,7 @@ } gnc_numeric -recurrenceGetAccountPeriodValue(const Recurrence *r, Account *acc, guint n) +recurrenceGetAccountPeriodValue(const Recurrence *r, Account *acc, guint n, gboolean recurse) { time_t t1, t2; @@ -252,7 +252,7 @@ g_return_val_if_fail(r && acc, gnc_numeric_zero()); t1 = recurrenceGetPeriodTime(r, n, FALSE); t2 = recurrenceGetPeriodTime(r, n, TRUE); - return xaccAccountGetBalanceChangeForPeriod (acc, t1, t2, TRUE); + return xaccAccountGetBalanceChangeForPeriod (acc, t1, t2, recurse); } void Index: src/gnome/gnc-plugin-page-budget.c =================================================================== --- src/gnome/gnc-plugin-page-budget.c (revision 14900) +++ src/gnome/gnc-plugin-page-budget.c (working copy) @@ -878,7 +878,7 @@ num_periods = g_list_length(priv->period_col_list); for (i = 0; i < num_periods; i++) { - num = recurrenceGetAccountPeriodValue(&priv->r, acct, i); + num = recurrenceGetAccountPeriodValue(&priv->r, acct, i, FALSE); if (!gnc_numeric_check(num)) { if (gnc_reverse_balance (acct)) num = gnc_numeric_neg (num);