gnucash maint: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Tue Oct 16 12:31:24 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/9f5c60de (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f2144676 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/0c02db72 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/4d22890d (commit)
	from  https://github.com/Gnucash/gnucash/commit/1244ebb3 (commit)



commit 9f5c60deaaa6258cef0b75b3bf23c0649a3b577a
Merge: 1244ebb f214467
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue Oct 16 09:26:31 2018 -0700

    Merge Christ Lam's 'maint-commodity-utils-cache-splits' into maint.


commit f214467670d01142354faa0bfdb6457cecc82b23
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Oct 15 07:25:36 2018 +0800

    [commodity-utilities] create internal fn to bypass expensive call
    
    This commit creates an internal
    function (gnc:get-commodity-totalavg-prices-internal) which bypasses
    a call to (gnc:get-match-commodity-splits-sorted) which creates a
    query for the price-commodity.

diff --git a/gnucash/report/report-system/commodity-utilities.scm b/gnucash/report/report-system/commodity-utilities.scm
index ff63b75..b8568b9 100644
--- a/gnucash/report/report-system/commodity-utilities.scm
+++ b/gnucash/report/report-system/commodity-utilities.scm
@@ -41,8 +41,6 @@
 ;; 'commodity' != #f ).
 (define (gnc:get-match-commodity-splits
          currency-accounts end-date commodity)
-  ;; Filter such that we get only those splits which have two
-  ;; *different* commodities involved.
   (filter
    (lambda (s)
      (let ((txn-comm (xaccTransGetCurrency (xaccSplitGetParent s)))
@@ -115,14 +113,16 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
 ;;  (day2 23.33))
 ;; The intended second price is 6500/300, or 21.67.
 
-;; NOTE there is an optional #:commodity-splits argument which should
-;; contain a sorted splitlist with pricing information related to the
-;; price-commodity. See (gnc:get-commoditylist-totalavg-prices) how to
-;; generate this splitlist. This is NOT to be used by external
-;; reports.
-(define* (gnc:get-commodity-totalavg-prices
-          currency-accounts end-date price-commodity report-currency
-          #:key commodity-splits)
+(define (gnc:get-commodity-totalavg-prices
+         currency-accounts end-date price-commodity report-currency)
+  (gnc:get-commodity-totalavg-prices-internal
+   currency-accounts end-date price-commodity report-currency
+   (gnc:get-match-commodity-splits-sorted
+    currency-accounts end-date price-commodity)))
+
+(define (gnc:get-commodity-totalavg-prices-internal
+         currency-accounts end-date price-commodity report-currency
+         commodity-splits)
   (let ((total-foreign 0)
         (total-domestic 0))
     (filter
@@ -200,11 +200,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                           GNC-DENOM-AUTO
                           (logior (GNC-DENOM-SIGFIGS 8) GNC-RND-ROUND)) 0)))
                #f))))
-      ;; Get all the interesting splits, and sort them according to the
-      ;; date.
-      (or commodity-splits
-          (gnc:get-match-commodity-splits-sorted
-           currency-accounts end-date price-commodity))))))
+      commodity-splits))))
+
 
 ;; Create a list of prices for all commodities in 'commodity-list',
 ;; i.e. the same thing as in get-commodity-totalavg-prices but
@@ -237,9 +234,9 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
            (gnc:report-percent-done
             (+ start-percent (* delta-percent (/ work-done work-to-do)))))
        (cons c
-             (gnc:get-commodity-totalavg-prices
+             (gnc:get-commodity-totalavg-prices-internal
               currency-accounts end-date c report-currency
-              #:commodity-splits (filter split-has-commodity? interesting-splits))))
+              (filter split-has-commodity? interesting-splits))))
      commodity-list)))
 
 ;; Get the instantaneous prices for the 'price-commodity', measured in

commit 0c02db729e2e020f9f3b822bb7e88843e1e0085d
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Oct 10 15:30:49 2018 +0800

    [commodity-utilities] compact functions
    
    and convert (gnc-numeric-*) to scheme number functions

diff --git a/gnucash/report/report-system/commodity-utilities.scm b/gnucash/report/report-system/commodity-utilities.scm
index c6deb4d..ff63b75 100644
--- a/gnucash/report/report-system/commodity-utilities.scm
+++ b/gnucash/report/report-system/commodity-utilities.scm
@@ -95,7 +95,7 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
 ;; Returns true if the given pricealist element is a non-zero price.
 (define (gnc:price-is-not-zero? elem)
   (and (second elem)
-       (not (gnc-numeric-zero-p (second elem)))))
+       (not (zero? (second elem)))))
 
 ;; Create a list of all prices of 'price-commodity' measured in the currency
 ;; 'report-currency'. The prices are taken from all splits in
@@ -123,8 +123,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
 (define* (gnc:get-commodity-totalavg-prices
           currency-accounts end-date price-commodity report-currency
           #:key commodity-splits)
-  (let ((total-foreign (gnc-numeric-zero))
-        (total-domestic (gnc-numeric-zero)))
+  (let ((total-foreign 0)
+        (total-domestic 0))
     (filter
      gnc:price-is-not-zero?
      (map-in-order
@@ -133,9 +133,9 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                                   (xaccSplitGetParent a)))
                (account-comm (xaccAccountGetCommodity
                               (xaccSplitGetAccount a)))
-               (share-amount (gnc-numeric-abs
+               (share-amount (abs
                               (xaccSplitGetAmount a)))
-               (value-amount (gnc-numeric-abs
+               (value-amount (abs
                               (xaccSplitGetValue a)))
                (transaction-date (xaccTransGetDate
                                   (xaccSplitGetParent a)))
@@ -182,8 +182,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                            ") =? "
                            (gnc:monetary->string
                             (gnc:make-gnc-monetary
-                            report-currency (gnc-numeric-zero))))
-                     (gnc-numeric-zero))
+                            report-currency 0)))
+                     0)
                    (begin
                      (set! total-foreign (gnc-numeric-add total-foreign
                                                           (third foreignlist)
@@ -222,8 +222,6 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
     (< (xaccTransGetDate (xaccSplitGetParent a))
        (xaccTransGetDate (xaccSplitGetParent b))))
   (let* ((currency-accounts
-          ;;(filter gnc:account-has-shares?
-          ;; -- use all accounts, not only share accounts, since gnucash-1.7
           (gnc-account-get-descendants-sorted (gnc-get-current-root-account)))
          (all-splits (get-all-splits currency-accounts end-date))
          (interesting-splits (sort (filter interesting-split? all-splits) date<?))
@@ -261,9 +259,9 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                                 (xaccSplitGetParent a)))
              (account-comm (xaccAccountGetCommodity
                             (xaccSplitGetAccount a)))
-             (share-amount (gnc-numeric-abs
+             (share-amount (abs
                             (xaccSplitGetAmount a)))
-             (value-amount (gnc-numeric-abs
+             (value-amount (abs
                             (xaccSplitGetValue a)))
              (transaction-date (xaccTransGetDate
                                 (xaccSplitGetParent a)))
@@ -303,8 +301,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                        ") =? "
                        (gnc:monetary->string
                         (gnc:make-gnc-monetary
-                         report-currency (gnc-numeric-zero))))
-               (gnc-numeric-zero))
+                         report-currency 0)))
+               0)
              (if (not (zero? (third foreignlist)))
                  (gnc-numeric-div
                   (second foreignlist)
@@ -325,8 +323,6 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
          commodity-list report-currency end-date
          start-percent delta-percent)
   (let ((currency-accounts
-         ;;(filter gnc:account-has-shares?
-         ;; -- use all accounts, not only share accounts, since gnucash-1.7
          (gnc-account-get-descendants-sorted (gnc-get-current-root-account)))
         (work-to-do (length commodity-list))
         (work-done 0))
@@ -379,19 +375,12 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
 
 ;; Find the price of the 'commodity' in the 'pricealist' that is
 ;; nearest to the 'date'.
-(define (gnc:pricealist-lookup-nearest-in-time
-         pricealist commodity date)
+(define (gnc:pricealist-lookup-nearest-in-time pricealist commodity date)
   (let ((plist (assoc-ref pricealist commodity)))
-    (if (and plist (not (null? plist)))
-        (let ((price
-               (gnc:pricelist-price-find-nearest
-                plist date)))
-          (or price
-              (gnc-numeric-zero)))
-        (gnc-numeric-zero))))
-
-
-
+    (or (and plist
+             (not (null? plist))
+             (gnc:pricelist-price-find-nearest plist date))
+        0)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Functions to get one price at a given time (i.e. not time-variant).
@@ -478,7 +467,7 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                      ;; Find the pair's currency in reportlist. FIXME:
                      ;; Also try the Euro here.
                      (pair-b (assoc (car pair) reportlist))
-                     (rate (gnc-numeric-zero)))
+                     (rate 0))
                  (if (and (not pair-a) (not pair-b))
                      ;; If neither the currency of otherlist nor of
                      ;; pair was found in reportlist then we can't
@@ -492,7 +481,7 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                             (gnc:make-gnc-monetary (car otherlist) ((cdadr pair) 'total #f)))
                            " to "
                            (gnc:monetary->string
-                            (gnc:make-gnc-monetary report-commodity (gnc-numeric-zero))))
+                            (gnc:make-gnc-monetary report-commodity 0)))
                      (if (and pair-a pair-b)
                          ;; If both currencies are found then something
                          ;; went wrong inside
@@ -545,8 +534,6 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
 
 (define (gnc:get-exchange-totals report-commodity end-date)
   (let ((curr-accounts
-         ;;(filter gnc:account-has-shares? ))
-         ;; -- use all accounts, not only share accounts, since gnucash-1.7
          (gnc-account-get-descendants-sorted (gnc-get-current-root-account)))
         (sumlist (list (list report-commodity '()))))
 
@@ -560,16 +547,14 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                   (account-comm (xaccAccountGetCommodity
                                  (xaccSplitGetAccount a)))
                   ;; Always use the absolute value here.
-                  (share-amount (gnc-numeric-abs
+                  (share-amount (abs
                                  (xaccSplitGetAmount a)))
-                  (value-amount (gnc-numeric-abs
+                  (value-amount (abs
                                  (xaccSplitGetValue a)))
-                  (tmp (assoc transaction-comm sumlist))
-                  (comm-list (if (not tmp)
-                                 (assoc account-comm sumlist)
-                                 tmp)))
+                  (comm-list (or (assoc transaction-comm sumlist)
+                                 (assoc account-comm sumlist))))
 
-             (cond ((gnc-numeric-zero-p share-amount)
+             (cond ((zero? share-amount)
                     ;; Without shares this is not a buy or sell; ignore it.
                     #f)
 
@@ -621,11 +606,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
 ;; Sum the net amounts and values in the report commodity, including booked
 ;; gains and losses, of each commodity across all accounts. Returns a
 ;; report-list.
-
 (define (gnc:get-exchange-cost-totals report-commodity end-date)
   (let ((curr-accounts
-         ;;(filter gnc:account-has-shares? ))
-         ;; -- use all accounts, not only share accounts, since gnucash-1.7
          (gnc-account-get-descendants-sorted (gnc-get-current-root-account)))
         (sumlist (list (list report-commodity '()))))
 
@@ -643,10 +625,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                                      (xaccSplitGetAccount a)))
                       (share-amount (xaccSplitGetAmount a))
                       (value-amount (xaccSplitGetValue a))
-                      (tmp (assoc transaction-comm sumlist))
-                      (comm-list (if (not tmp)
-                                     (assoc account-comm sumlist)
-                                     tmp)))
+                      (comm-list (or (assoc transaction-comm sumlist)
+                                     (assoc account-comm sumlist))))
 
                  ;; entry exists already in comm-list?
                  (if (not comm-list)
@@ -668,8 +648,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                                (list account-comm
                                      share-amount value-amount)
                                (list transaction-comm
-                                     (gnc-numeric-neg value-amount)
-                                     (gnc-numeric-neg share-amount))))
+                                     (- value-amount)
+                                     (- share-amount))))
                           ;; second commodity already existing in comm-list?
                           (pair (assoc (car foreignlist) (cadr comm-list))))
                        ;; if not, create a new entry in comm-list.
@@ -703,7 +683,7 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
   (map
    (lambda (e)
      (list (car e)
-           (gnc-numeric-abs
+           (abs
             (gnc-numeric-div ((cdadr e) 'total #f)
                              ((caadr e) 'total #f)
                              GNC-DENOM-AUTO
@@ -718,7 +698,7 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
    (lambda (e)
      (list (car e)
            (if (zero? ((caadr e) 'total #f)) #f
-           (gnc-numeric-abs
+           (abs
             (gnc-numeric-div ((cdadr e) 'total #f)
                              ((caadr e) 'total #f)
                              GNC-DENOM-AUTO
@@ -782,8 +762,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                                    exchangelist))
                       (foreign-amount (gnc:gnc-monetary-amount foreign)))
                   (if (or (not pair)
-                          (gnc-numeric-zero-p foreign-amount))
-                      (gnc-numeric-zero)
+                          (zero? foreign-amount))
+                      0
                       (gnc-numeric-mul foreign-amount
                                        (cadr pair)
                                        (gnc-commodity-get-fraction domestic)
@@ -806,8 +786,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
               (warn "gnc:exchange-by-pricevalue-helper: No price found for "
                     (gnc:monetary->string foreign) " into "
                     (gnc:monetary->string
-                     (gnc:make-gnc-monetary domestic (gnc-numeric-zero))))
-              (gnc-numeric-zero))))))
+                     (gnc:make-gnc-monetary domestic 0)))
+              0)))))
 
 ;; Helper for gnc:exchange-by-pricedb-* below. 'price' gets tested for
 ;; #f here, and gets unref'd here too. Exchange the <gnc:monetary>
@@ -830,8 +810,8 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
               (warn "gnc:exchange-by-pricedb-helper: No price found for "
                     (gnc:monetary->string foreign) " into "
                     (gnc:monetary->string
-                     (gnc:make-gnc-monetary domestic (gnc-numeric-zero))))
-              (gnc-numeric-zero))))))
+                     (gnc:make-gnc-monetary domestic 0)))
+              0)))))
 
 ;; This is another ready-to-use function for calculation of exchange
 ;; rates. (Note that this is already the function itself. It doesn't

commit 4d22890d16a097b99877cc730e36af381bbe083d
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Tue Oct 9 11:40:48 2018 +0800

    [commodity-utilities] optimize weighted-average price calculator
    
    (get-commoditylist-totalavg-prices) will generate a whole-book
    splitlist. This is then filtered to 'interesting' splits only, and
    sorted by posted date.
    
    This sorted, filtered list is then filtered to each commodity, and
    passed down as argument to (gnc:get-commodity-totalavg-prices) to be
    used immediately, rather than calling the expensive function
    (gnc:get-match-commodity-splits-sorted) which eventually creates a
    query for each commodity.

diff --git a/gnucash/report/report-system/commodity-utilities.scm b/gnucash/report/report-system/commodity-utilities.scm
index 238fb79..c6deb4d 100644
--- a/gnucash/report/report-system/commodity-utilities.scm
+++ b/gnucash/report/report-system/commodity-utilities.scm
@@ -23,6 +23,17 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Functions to get splits with interesting data from accounts.
 
+;; helper function. queries book for all splits in accounts before
+;; end-date (end-date can be #f)
+(define (get-all-splits accounts end-date)
+  (let ((query (qof-query-create-for-splits)))
+    (qof-query-set-book query (gnc-get-current-book))
+    (gnc:query-set-match-non-voids-only! query (gnc-get-current-book))
+    (xaccQueryAddAccountMatch query accounts QOF-GUID-MATCH-ANY QOF-QUERY-AND)
+    (xaccQueryAddDateMatchTT query #f 0 (and end-date #t) (or end-date 0) QOF-QUERY-AND)
+    (let ((splits (qof-query-run query)))
+      (qof-query-destroy query)
+      splits)))
 
 ;; Returns a list of all splits in the 'currency-accounts' up to
 ;; 'end-date' which have two different commodities involved, one of
@@ -30,42 +41,17 @@
 ;; 'commodity' != #f ).
 (define (gnc:get-match-commodity-splits
          currency-accounts end-date commodity)
-  (let ((query (qof-query-create-for-splits))
-        (splits #f))
-
-    (qof-query-set-book query (gnc-get-current-book))
-    (gnc:query-set-match-non-voids-only! query (gnc-get-current-book))
-    (xaccQueryAddAccountMatch query
-                              currency-accounts
-                              QOF-GUID-MATCH-ANY QOF-QUERY-AND)
-    (if end-date
-        (xaccQueryAddDateMatchTT
-         query #f end-date #t end-date QOF-QUERY-AND))
-
-    ;; Get the query result, i.e. all splits in currency
-    ;; accounts.
-    (set! splits (filter
-                  ;; Filter such that we get only those splits
-                  ;; which have two *different* commodities
-                  ;; involved.
-                  (lambda (s) (let ((trans-comm
-                                     (xaccTransGetCurrency
-                                      (xaccSplitGetParent s)))
-                                    (acc-comm
-                                     (xaccAccountGetCommodity
-                                      (xaccSplitGetAccount s))))
-                                (and
-                                 (not (gnc-commodity-equiv
-                                       trans-comm acc-comm))
-                                 (or
-                                  (not commodity)
-                                  (gnc-commodity-equiv
-                                   commodity trans-comm)
-                                  (gnc-commodity-equiv
-                                   commodity acc-comm)))))
-                  (qof-query-run query)))
-    (qof-query-destroy query)
-    splits))
+  ;; Filter such that we get only those splits which have two
+  ;; *different* commodities involved.
+  (filter
+   (lambda (s)
+     (let ((txn-comm (xaccTransGetCurrency (xaccSplitGetParent s)))
+           (acc-comm (xaccAccountGetCommodity (xaccSplitGetAccount s))))
+       (and (not (gnc-commodity-equiv txn-comm acc-comm))
+            (or (not commodity)
+                (gnc-commodity-equiv commodity txn-comm)
+                (gnc-commodity-equiv commodity acc-comm)))))
+   (get-all-splits currency-accounts end-date)))
 
 ;; Returns a sorted list of all splits in the 'currency-accounts' up
 ;; to 'end-date' which have the 'commodity' and one other commodity
@@ -129,8 +115,14 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
 ;;  (day2 23.33))
 ;; The intended second price is 6500/300, or 21.67.
 
-(define (gnc:get-commodity-totalavg-prices
-         currency-accounts end-date price-commodity report-currency)
+;; NOTE there is an optional #:commodity-splits argument which should
+;; contain a sorted splitlist with pricing information related to the
+;; price-commodity. See (gnc:get-commoditylist-totalavg-prices) how to
+;; generate this splitlist. This is NOT to be used by external
+;; reports.
+(define* (gnc:get-commodity-totalavg-prices
+          currency-accounts end-date price-commodity report-currency
+          #:key commodity-splits)
   (let ((total-foreign (gnc-numeric-zero))
         (total-domestic (gnc-numeric-zero)))
     (filter
@@ -210,9 +202,9 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
                #f))))
       ;; Get all the interesting splits, and sort them according to the
       ;; date.
-      (gnc:get-match-commodity-splits-sorted
-       currency-accounts
-       end-date price-commodity)))))
+      (or commodity-splits
+          (gnc:get-match-commodity-splits-sorted
+           currency-accounts end-date price-commodity))))))
 
 ;; Create a list of prices for all commodities in 'commodity-list',
 ;; i.e. the same thing as in get-commodity-totalavg-prices but
@@ -222,22 +214,34 @@ construct with gnc:make-gnc-monetary and gnc:monetary->string instead.")
 (define (gnc:get-commoditylist-totalavg-prices
          commodity-list report-currency end-date
          start-percent delta-percent)
-  (let ((currency-accounts
-         ;;(filter gnc:account-has-shares?
-         ;; -- use all accounts, not only share accounts, since gnucash-1.7
-         (gnc-account-get-descendants-sorted (gnc-get-current-root-account)))
-        (work-to-do (length commodity-list))
-        (work-done 0))
+  (define (interesting-split? s)
+    (not (gnc-commodity-equiv
+          (xaccTransGetCurrency (xaccSplitGetParent s))
+          (xaccAccountGetCommodity (xaccSplitGetAccount s)))))
+  (define (date<? a b)
+    (< (xaccTransGetDate (xaccSplitGetParent a))
+       (xaccTransGetDate (xaccSplitGetParent b))))
+  (let* ((currency-accounts
+          ;;(filter gnc:account-has-shares?
+          ;; -- use all accounts, not only share accounts, since gnucash-1.7
+          (gnc-account-get-descendants-sorted (gnc-get-current-root-account)))
+         (all-splits (get-all-splits currency-accounts end-date))
+         (interesting-splits (sort (filter interesting-split? all-splits) date<?))
+         (work-to-do (length commodity-list))
+         (work-done 0))
     (map
      (lambda (c)
-       (begin
-         (set! work-done (+ 1 work-done))
-         (if start-percent
-             (gnc:report-percent-done
-              (+ start-percent (* delta-percent (/ work-done work-to-do)))))
-         (cons c
-               (gnc:get-commodity-totalavg-prices
-                currency-accounts end-date c report-currency))))
+       (define (split-has-commodity? s)
+         (or (gnc-commodity-equiv c (xaccTransGetCurrency (xaccSplitGetParent s)))
+             (gnc-commodity-equiv c (xaccAccountGetCommodity (xaccSplitGetAccount s)))))
+       (set! work-done (1+ work-done))
+       (if start-percent
+           (gnc:report-percent-done
+            (+ start-percent (* delta-percent (/ work-done work-to-do)))))
+       (cons c
+             (gnc:get-commodity-totalavg-prices
+              currency-accounts end-date c report-currency
+              #:commodity-splits (filter split-has-commodity? interesting-splits))))
      commodity-list)))
 
 ;; Get the instantaneous prices for the 'price-commodity', measured in



Summary of changes:
 .../report/report-system/commodity-utilities.scm   | 197 ++++++++++-----------
 1 file changed, 89 insertions(+), 108 deletions(-)



More information about the gnucash-changes mailing list