gnucash stable: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Sat Apr 29 15:05:28 EDT 2023


Updated	 via  https://github.com/Gnucash/gnucash/commit/bb423e44 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/04b03171 (commit)
	from  https://github.com/Gnucash/gnucash/commit/df878c6a (commit)



commit bb423e4484aef679c8bfb91a1686504d29cd25db
Merge: df878c6a3d 04b0317119
Author: John Ralls <jralls at ceridwen.us>
Date:   Sat Apr 29 12:04:45 2023 -0700

    Merge CrfzdPQM6's 'b_betterCurrencyBudgetReporting' into stable.


commit 04b0317119d9c2d26506f099e52d9cacb9652adf
Author: Daniel Johnson <daniel.johnson at cern.ch>
Date:   Mon Jan 9 08:39:12 2023 +0100

    Demonstrate fx handling in budget report

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<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;
+}
 
 /********************************************************************\
 \********************************************************************/
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



Summary of changes:
 libgnucash/engine/Account.cpp  | 44 ++++++++++++++++++++++++++++++++++++++++++
 libgnucash/engine/Account.h    |  2 ++
 libgnucash/engine/Recurrence.c |  2 +-
 3 files changed, 47 insertions(+), 1 deletion(-)



More information about the gnucash-changes mailing list