gnucash maint: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Wed Feb 20 07:57:40 EST 2019


Updated	 via  https://github.com/Gnucash/gnucash/commit/6945e1c7 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/2215dfc5 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c6f5e673 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/d97d4930 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1a69bf1b (commit)
	 via  https://github.com/Gnucash/gnucash/commit/56bccd1b (commit)
	from  https://github.com/Gnucash/gnucash/commit/12d6ace9 (commit)



commit 6945e1c7d70d8b7ed0ae6287b75ed80ed87f7366
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Feb 20 20:43:48 2019 +0800

    [cash-flow][budget] logic error in sub-accounts handling
    
    Previous logic would cycle through accounts' sub-accounts, and each
    sub-account would be queried for inclusion in accounts; if not
    present, the accounts would be appended by all sub-accounts.
    
    Logic would dictate that only the missing sub-account should be added
    to the accounts list.
    
    No functional change is expected; previous behaviour would generate an
    unnecessarily long resulting accounts list (includes sub-accounts as
    many times as there are sub-accounts).

diff --git a/gnucash/report/standard-reports/budget.scm b/gnucash/report/standard-reports/budget.scm
index 66a6d8780..a31801a5a 100644
--- a/gnucash/report/standard-reports/budget.scm
+++ b/gnucash/report/standard-reports/budget.scm
@@ -818,7 +818,7 @@
           (for-each
             (lambda (sub-account)
               (if (not (account-in-list? sub-account accounts))
-                  (set! accounts (append accounts sub-accounts))))
+                  (set! accounts (cons sub-account accounts))))
             sub-accounts)))
 
     (cond
diff --git a/gnucash/report/standard-reports/cash-flow.scm b/gnucash/report/standard-reports/cash-flow.scm
index 08c87f570..b8ed255d6 100644
--- a/gnucash/report/standard-reports/cash-flow.scm
+++ b/gnucash/report/standard-reports/cash-flow.scm
@@ -173,7 +173,7 @@
           (for-each
            (lambda (sub-account)
              (if (not (account-in-list? sub-account accounts))
-                 (set! accounts (append accounts sub-accounts))))
+                 (set! accounts (cons sub-account accounts))))
            sub-accounts)))
 
 

commit 2215dfc5e1bf052f8fb3ed4096d12f707fd925a8
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sat Jan 26 23:59:18 2019 +0800

    [cash-flow] clean up cash-flow calculator
    
    1. remove split-seen? helper function. use a simple list.
    
    2. they were maintaining 2 lists for in, 2 lists for out. simplify to
    1 list each.
    
    3. convert single-use function to named let
    
    4. remove transaction date filter - transactions were already
    date-filtered by the query prior.
    
    5. use simple lists instead of split/account hash tables. use the
    incredible versatile srfi-1 functions.
    
    6. s-report-value can be defined earlier
    
    7. clean up whitespace so that line maxwidth is 80
    
    8. tests already exist in test-cash-flow.scm

diff --git a/gnucash/report/standard-reports/cash-flow.scm b/gnucash/report/standard-reports/cash-flow.scm
index 516a20b6e..08c87f570 100644
--- a/gnucash/report/standard-reports/cash-flow.scm
+++ b/gnucash/report/standard-reports/cash-flow.scm
@@ -381,114 +381,75 @@
          (to-date-t64 (cdr (assq 'to-date-t64 settings)))
          (from-date-t64 (cdr (assq 'from-date-t64 settings)))
          (report-currency (cdr (assq 'report-currency settings)))
-         (include-trading-accounts (cdr (assq 'include-trading-accounts settings)))
+         (include-trading-accounts
+          (cdr (assq 'include-trading-accounts settings)))
          (to-report-currency (cdr (assq 'to-report-currency settings)))
-
-         (is-report-account? (account-in-list-pred accounts))
-
-         (money-in-accounts '())
-         (money-in-hash (make-hash-table))
+         (money-in '())
          (money-in-collector (gnc:make-commodity-collector))
-
-         (money-out-accounts '())
-         (money-out-hash (make-hash-table))
+         (money-out '())
          (money-out-collector (gnc:make-commodity-collector))
-
-         (all-splits (gnc:account-get-trans-type-splits-interval accounts '() from-date-t64 to-date-t64))
+         (all-splits (gnc:account-get-trans-type-splits-interval
+                      accounts '() from-date-t64 to-date-t64))
          (splits-to-do (length all-splits))
-         (splits-seen-table (make-hash-table))
-         (work-done 0))
-
-    (define (split-seen? split)
-      (if (split-hashtable-ref splits-seen-table split) #t
-          (begin
-            (split-hashtable-set! splits-seen-table split #t)
-            #f)))
-
-    (define (work-per-split split)
-      (set! work-done (+ 1 work-done))
-      (if (= (modulo work-done 100) 0)
-          (gnc:report-percent-done (* 85 (/ work-done splits-to-do))))
-      (let ((parent (xaccSplitGetParent split)))
-        (if (and (<= (xaccTransGetDate parent) to-date-t64)
-                 (>= (xaccTransGetDate parent) from-date-t64))
-            (let* ((parent-description (xaccTransGetDescription parent))
-                   (parent-currency (xaccTransGetCurrency parent)))
-              (gnc:debug parent-description
-                         " - "
-                         (gnc-commodity-get-printname parent-currency))
-              (for-each
-               (lambda (s)
-                 (let* ((s-account (xaccSplitGetAccount s))
-                        (s-account-type (xaccAccountGetType s-account))
-                        (s-amount (xaccSplitGetAmount s))
-                        (s-value (xaccSplitGetValue s))
-                        (s-commodity (xaccAccountGetCommodity s-account)))
-                   ;; Check if this is a dangling split
-                   ;; and print a warning
-                   (if (null? s-account)
-                       (display
-                        (string-append
-                         "WARNING: s-account is NULL for split: "
-                         (gncSplitGetGUID s) "\n")))
-                   (gnc:debug (xaccAccountGetName s-account))
-                   (if (and      ;; make sure we don't have
-                        (not (null? s-account)) ;;  any dangling splits
-                        (or include-trading-accounts (not (eq? s-account-type ACCT-TYPE-TRADING)))
-                        (not (is-report-account? s-account)))
-                       (if (not (split-seen? s))
-                           (begin
-                             (if (gnc-numeric-negative-p s-value)
-                                 (let ((s-account-in-collector (account-hashtable-ref money-in-hash s-account)))
-                                        ;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
-                                        ;            (gnc-numeric-to-double s-amount)
-                                        ;            (gnc-commodity-get-printname parent-currency)
-                                        ;            (gnc-numeric-to-double s-value))
-                                   (if (not s-account-in-collector)
-                                       (begin
-                                         (set! s-account-in-collector (gnc:make-commodity-collector))
-                                         (account-hashtable-set! money-in-hash s-account
-                                                                 s-account-in-collector)
-                                         (set! money-in-accounts (cons s-account money-in-accounts))
-                                         )
-                                       )
-                                   (let ((s-report-value (to-report-currency parent-currency
-                                                                             (gnc-numeric-neg s-value)
-                                                                             (xaccTransGetDate
-                                                                              parent))))
-                                     (money-in-collector 'add report-currency s-report-value)
-                                     (s-account-in-collector 'add report-currency s-report-value))
-                                   )
-                                 (let ((s-account-out-collector (account-hashtable-ref money-out-hash s-account)))
-                                        ;(gnc:debug "out:" (gnc-commodity-get-printname s-commodity)
-                                        ;            (gnc-numeric-to-double s-amount)
-                                        ;            (gnc-commodity-get-printname parent-currency)
-                                        ;            (gnc-numeric-to-double s-value))
-                                   (if (not s-account-out-collector)
-                                       (begin
-                                         (set! s-account-out-collector (gnc:make-commodity-collector))
-                                         (account-hashtable-set! money-out-hash s-account
-                                                                 s-account-out-collector)
-                                         (set! money-out-accounts (cons s-account money-out-accounts))
-                                         )
-                                       )
-                                   (let ((s-report-value (to-report-currency parent-currency
-                                                                             s-value
-                                                                             (xaccTransGetDate
-                                                                              parent))))
-                                     (money-out-collector 'add report-currency s-report-value)
-                                     (s-account-out-collector 'add report-currency s-report-value)))))))))
-               (xaccTransGetSplitList parent))))))
-
-    (for-each work-per-split all-splits)
+         (splits-seen-list '()))
+
+    (let loop ((splits all-splits)
+               (work-done 0))
+      (unless (null? splits)
+        (if (zero? (modulo work-done 100))
+            (gnc:report-percent-done (* 85 (/ work-done splits-to-do))))
+        (let* ((split (car splits))
+               (parent (xaccSplitGetParent split)))
+          (for-each
+           (lambda (s)
+             (let* ((s-account (xaccSplitGetAccount s))
+                    (s-value (xaccSplitGetValue s))
+                    (s-report-value (to-report-currency (xaccTransGetCurrency parent)
+                                                        (abs s-value)
+                                                        (xaccTransGetDate parent))))
+               (cond
+                ((null? s-account)
+                 (format #t "WARNING: s-account is NULL for split: ~a\n"
+                         (gncSplitGetGUID s)))
+                ((or (and include-trading-accounts
+                          (eqv? (xaccAccountGetType s-account)
+                                ACCT-TYPE-TRADING))
+                     (member s-account accounts)
+                     (member s splits-seen-list))
+                 #f)
+                ((negative? s-value)
+                 (let ((s-account-in-collector
+                        (or (assoc-ref money-in s-account)
+                            (let ((coll (gnc:make-commodity-collector)))
+                              (set! money-in
+                                (assoc-set! money-in s-account coll))
+                              coll))))
+                   (set! splits-seen-list (cons s splits-seen-list))
+                   (money-in-collector 'add report-currency s-report-value)
+                   (s-account-in-collector
+                    'add report-currency s-report-value)))
+                ((positive? s-value)
+                 (let ((s-account-out-collector
+                        (or (assoc-ref money-out s-account)
+                            (let ((coll (gnc:make-commodity-collector)))
+                              (set! money-out
+                                (assoc-set! money-out s-account coll))
+                              coll))))
+                   (set! splits-seen-list (cons s splits-seen-list))
+                   (money-out-collector 'add report-currency s-report-value)
+                   (s-account-out-collector
+                    'add report-currency s-report-value))))))
+           (xaccTransGetSplitList parent)))
+        (loop (cdr splits) (1+ work-done))))
 
     ;; Return an association list of results
-    (list (cons 'money-in-accounts money-in-accounts)
-          (cons 'money-in-alist (hash-map->list (lambda (k v) (list k v)) money-in-hash))
-          (cons 'money-in-collector money-in-collector)
-          (cons 'money-out-accounts money-out-accounts)
-          (cons 'money-out-alist (hash-map->list (lambda (k v) (list k v)) money-out-hash))
-          (cons 'money-out-collector money-out-collector))))
+    (list
+     (cons 'money-in-accounts (map car money-in))
+     (cons 'money-in-alist (map (lambda (p) (list (car p) (cdr p))) money-in))
+     (cons 'money-in-collector money-in-collector)
+     (cons 'money-out-accounts (map car money-out))
+     (cons 'money-out-alist (map (lambda (p) (list (car p) (cdr p))) money-out))
+     (cons 'money-out-collector money-out-collector))))
 
 (gnc:define-report
  'version 1

commit c6f5e6736b516d1cf568af60e3418a2027589362
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Feb 20 20:00:38 2019 +0800

    [cash-flow] *untabify/delete-trailing-whitespace/reindent*

diff --git a/gnucash/report/standard-reports/cash-flow.scm b/gnucash/report/standard-reports/cash-flow.scm
index 60b97d339..516a20b6e 100644
--- a/gnucash/report/standard-reports/cash-flow.scm
+++ b/gnucash/report/standard-reports/cash-flow.scm
@@ -28,7 +28,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (define-module (gnucash report standard-reports cash-flow))
-(use-modules (gnucash utilities)) 
+(use-modules (gnucash utilities))
 (use-modules (gnucash gnc-module))
 (use-modules (gnucash gettext))
 (use-modules (gnucash engine))
@@ -61,7 +61,7 @@
 
     ;; date interval
     (gnc:options-add-date-interval!
-     options gnc:pagename-general 
+     options gnc:pagename-general
      optname-from-date optname-to-date "a")
 
     ;; all about currencies
@@ -69,43 +69,43 @@
      options gnc:pagename-general
      optname-report-currency "b")
 
-    (gnc:options-add-price-source! 
+    (gnc:options-add-price-source!
      options gnc:pagename-general
      optname-price-source "c" 'pricedb-nearest)
 
-    (gnc:register-option 
+    (gnc:register-option
      options
      (gnc:make-simple-boolean-option
       gnc:pagename-general optname-show-rates
       "d" (N_ "Show the exchange rates used.") #f))
 
-    (gnc:register-option 
+    (gnc:register-option
      options
      (gnc:make-simple-boolean-option
       gnc:pagename-general optname-show-full-names
       "e" (N_ "Show full account names (including parent accounts).") #t))
 
     ;; accounts to work on
-    (gnc:options-add-account-selection! 
+    (gnc:options-add-account-selection!
      options gnc:pagename-accounts
      optname-display-depth optname-show-subaccounts
      optname-accounts "a" 2
      (lambda ()
-       (gnc:filter-accountlist-type 
+       (gnc:filter-accountlist-type
         (list ACCT-TYPE-BANK ACCT-TYPE-CASH ACCT-TYPE-ASSET
               ACCT-TYPE-STOCK ACCT-TYPE-MUTUAL)
         (gnc-account-get-descendants-sorted (gnc-get-current-root-account))))
      #f)
-     
-     ;; Trading accounts?
-     (gnc:register-option
-      options
-      (gnc:make-simple-boolean-option
-       gnc:pagename-accounts optname-include-trading-accounts
-       "b" (N_ "Include transfers to and from Trading Accounts in the report.")  #f))
-    
+
+    ;; Trading accounts?
+    (gnc:register-option
+     options
+     (gnc:make-simple-boolean-option
+      gnc:pagename-accounts optname-include-trading-accounts
+      "b" (N_ "Include transfers to and from Trading Accounts in the report.")  #f))
+
     ;; Set the general page as default option tab
-    (gnc:options-set-default-section options gnc:pagename-general)      
+    (gnc:options-set-default-section options gnc:pagename-general)
 
     options))
 
@@ -117,39 +117,39 @@
 (define (cash-flow-renderer report-obj)
   (define (get-option pagename optname)
     (gnc:option-value
-     (gnc:lookup-option 
+     (gnc:lookup-option
       (gnc:report-options report-obj) pagename optname)))
 
   (gnc:report-starting reportname)
 
   ;; get all option's values
-  (let* ((display-depth (get-option gnc:pagename-accounts 
+  (let* ((display-depth (get-option gnc:pagename-accounts
                                     optname-display-depth))
          (show-subaccts? (get-option gnc:pagename-accounts
                                      optname-show-subaccounts))
          (accounts (get-option gnc:pagename-accounts
                                optname-accounts))
          (include-trading-accounts (get-option gnc:pagename-accounts
-                               optname-include-trading-accounts))
+                                               optname-include-trading-accounts))
          (row-num 0)
-	 (work-done 0)
-	 (work-to-do 0)
+         (work-done 0)
+         (work-to-do 0)
          (report-currency (get-option gnc:pagename-general
                                       optname-report-currency))
          (price-source (get-option gnc:pagename-general
                                    optname-price-source))
-         (show-rates? (get-option gnc:pagename-general 
+         (show-rates? (get-option gnc:pagename-general
                                   optname-show-rates))
-         (show-full-names? (get-option gnc:pagename-general 
+         (show-full-names? (get-option gnc:pagename-general
                                        optname-show-full-names))
-         (from-date-t64 (gnc:time64-start-day-time 
-                        (gnc:date-option-absolute-time
-                         (get-option gnc:pagename-general
-                                     optname-from-date))))
-         (to-date-t64 (gnc:time64-end-day-time 
-                      (gnc:date-option-absolute-time
-                       (get-option gnc:pagename-general
-                                   optname-to-date))))
+         (from-date-t64 (gnc:time64-start-day-time
+                         (gnc:date-option-absolute-time
+                          (get-option gnc:pagename-general
+                                      optname-from-date))))
+         (to-date-t64 (gnc:time64-end-day-time
+                       (gnc:date-option-absolute-time
+                        (get-option gnc:pagename-general
+                                    optname-to-date))))
 
          ;; calculate the exchange rates
          (exchange-fn (gnc:case-exchange-fn
@@ -159,229 +159,217 @@
          (table (gnc:make-html-table))
          (txt (gnc:make-html-text)))
 
-    (gnc:html-document-set-title! 
+    (gnc:html-document-set-title!
      doc (string-append
           (get-option gnc:pagename-general gnc:optname-reportname)
           " - "
           (format #f (_ "~a to ~a")
-                   (qof-print-date from-date-t64) (qof-print-date to-date-t64))))
+                  (qof-print-date from-date-t64) (qof-print-date to-date-t64))))
 
 
     ;; add subaccounts if requested
     (if show-subaccts?
         (let ((sub-accounts (gnc:acccounts-get-all-subaccounts accounts)))
           (for-each
-            (lambda (sub-account)
-              (if (not (account-in-list? sub-account accounts))
-                  (set! accounts (append accounts sub-accounts))))
-            sub-accounts)))
+           (lambda (sub-account)
+             (if (not (account-in-list? sub-account accounts))
+                 (set! accounts (append accounts sub-accounts))))
+           sub-accounts)))
 
 
     (if (not (null? accounts))
 
         (let* ((tree-depth (if (equal? display-depth 'all)
-                               (accounts-get-children-depth accounts) 
+                               (accounts-get-children-depth accounts)
                                display-depth))
 
                (money-diff-collector (gnc:make-commodity-collector))
-	       (account-disp-list '())
-
-	       (time-exchange-fn #f)
-	       (commodity-list (gnc:accounts-get-commodities
-				accounts
-				report-currency))
-	       ;; Get an exchange function that will convert each transaction using the
-	       ;; nearest available exchange rate if that is what is specified
-	       (time-exchange-fn (gnc:case-exchange-time-fn
-				  price-source report-currency
-				  commodity-list to-date-t64
-				  0 0)))
-
-	  ;; Helper function to convert currencies
-	  (define (to-report-currency currency amount date)
-	    (gnc:gnc-monetary-amount
-	     (time-exchange-fn (gnc:make-gnc-monetary currency amount)
-			       report-currency
-			       date)))
+               (account-disp-list '())
+
+               (time-exchange-fn #f)
+               (commodity-list (gnc:accounts-get-commodities
+                                accounts
+                                report-currency))
+               ;; Get an exchange function that will convert each transaction using the
+               ;; nearest available exchange rate if that is what is specified
+               (time-exchange-fn (gnc:case-exchange-time-fn
+                                  price-source report-currency
+                                  commodity-list to-date-t64
+                                  0 0)))
+
+          ;; Helper function to convert currencies
+          (define (to-report-currency currency amount date)
+            (gnc:gnc-monetary-amount
+             (time-exchange-fn (gnc:make-gnc-monetary currency amount)
+                               report-currency
+                               date)))
 
 
           (let ((result (cash-flow-calc-money-in-out
-			 (list (cons 'accounts accounts)
-			       (cons 'to-date-t64 to-date-t64)
-			       (cons 'from-date-t64 from-date-t64)
-			       (cons 'report-currency report-currency)
-			       (cons 'include-trading-accounts include-trading-accounts)
-			       (cons 'to-report-currency to-report-currency)))))
-	    (let ((money-in-accounts (cdr (assq 'money-in-accounts result)))
-		  (money-in-alist (cdr (assq 'money-in-alist result)))
-		  (money-in-collector (cdr (assq 'money-in-collector result)))
-		  (money-out-accounts (cdr (assq 'money-out-accounts result)))
-		  (money-out-alist (cdr (assq 'money-out-alist result)))
-		  (money-out-collector (cdr (assq 'money-out-collector result))))
-	      (money-diff-collector 'merge money-in-collector #f)
-	      (money-diff-collector 'minusmerge money-out-collector #f)
-
-	      (set! accounts (sort accounts account-full-name<?))
-	      (set! money-in-accounts (sort money-in-accounts account-full-name<?))
-	      (set! money-out-accounts (sort money-out-accounts account-full-name<?))
-
-
-	      (set! work-done 0)
-	      (set! work-to-do (length accounts))
-	      (for-each
-	       (lambda (account)
-		 (set! work-done (+ 1 work-done))
-		 (gnc:report-percent-done (+ 85 (* 5 (/ work-done work-to-do))))
-		 (if (<= (gnc-account-get-current-depth account) tree-depth)
-		     (let* ((anchor (gnc:html-markup/format
-				     (if (and (= (gnc-account-get-current-depth account) tree-depth)
-					      (not (eq? (gnc-account-get-children account) '())))
-					 (if show-subaccts?
-					     (_ "~a and subaccounts")
-					     (_ "~a and selected subaccounts"))
-					 "~a")
-				     (gnc:html-markup-anchor
-				      (gnc:account-anchor-text account)
-				      (if show-full-names?
-					  (gnc-account-get-full-name account)
-					  (xaccAccountGetName account))))))
-
-		       (set! account-disp-list (cons anchor account-disp-list))
-		       )
-		     )
-		 )
-	       accounts
-	       )
-
-
-	      (gnc:html-document-add-object!
-	       doc
-	       (gnc:make-html-text (_ "Selected Accounts")))
-
-	      (gnc:html-document-add-object!
-	       doc
-	       (gnc:make-html-text
-		(gnc:html-markup-ul
-		 (reverse account-disp-list))))
-
-	      (gnc:html-table-append-ruler! table 2)
-
-	      (gnc:html-table-append-row/markup!
-	       table
-	       "primary-subheading"
-	       (list
-		(_ "Money into selected accounts comes from")
-		""))
-
-	      (set! row-num 0)
-	      (set! work-done 0)
-	      (set! work-to-do (length money-in-alist))
-	      (for-each
-	       (lambda (account)
-		 (set! row-num (+ 1 row-num))
-		 (set! work-done (+ 1 work-done))
-		 (gnc:report-percent-done (+ 90 (* 5 (/ work-done work-to-do))))
-		 (let* ((pair (assoc account money-in-alist))
-			(acct (car pair)))
-		   (gnc:html-table-append-row/markup!
-		    table
-		    (if (odd? row-num) "normal-row" "alternate-row")
-		    (list
-					;(gnc:html-account-anchor acct)
-		     (gnc:make-html-text
-		      (gnc:html-markup-anchor
-		       (gnc:account-anchor-text acct)
-		       (if show-full-names?
-			   (gnc-account-get-full-name acct)
-			   (xaccAccountGetName acct))))
-		     (gnc:make-html-table-header-cell/markup
-		      "number-cell" (gnc:sum-collector-commodity (cadr pair) report-currency exchange-fn))))
-		   )
-		 )
-	       money-in-accounts
-	       )
-
-	      (gnc:html-table-append-row/markup!
-	       table
-	       "grand-total"
-	       (list
-		(gnc:make-html-table-header-cell/markup "text-cell" (_ "Money In"))
-		(gnc:make-html-table-header-cell/markup
-		 "total-number-cell" (gnc:sum-collector-commodity money-in-collector report-currency exchange-fn))))
-
-	      (gnc:html-table-append-ruler! table 2)
-
-	      (gnc:html-table-append-row/markup!
-	       table
-	       "primary-subheading"
-	       (list
-		(_ "Money out of selected accounts goes to")
-		""))
-
-	      (set! row-num 0)
-	      (set! work-done 0)
-	      (set! work-to-do (length money-out-alist))
-	      (for-each
-	       (lambda (account)
-		 (set! row-num (+ 1 row-num))
-		 (set! work-done (+ 1 work-done))
-		 (gnc:report-percent-done (+ 95 (* 5 (/ work-done work-to-do))))
-		 (let* ((pair (assoc account money-out-alist))
-			(acct (car pair)))
-		   (gnc:html-table-append-row/markup!
-		    table
-		    (if (odd? row-num) "normal-row" "alternate-row")
-		    (list
-					;(gnc:html-account-anchor acct)
-		     (gnc:make-html-text
-		      (gnc:html-markup-anchor
-		       (gnc:account-anchor-text acct)
-		       (if show-full-names?
-			   (gnc-account-get-full-name acct)
-			   (xaccAccountGetName acct))))
-		     (gnc:make-html-table-header-cell/markup
-		      "number-cell" (gnc:sum-collector-commodity (cadr pair) report-currency exchange-fn))))
-		   )
-		 )
-	       money-out-accounts
-	       )
-
-	      (gnc:html-table-append-row/markup!
-	       table
-	       "grand-total"
-	       (list
-		(gnc:make-html-table-header-cell/markup "text-cell" (_ "Money Out"))
-		(gnc:make-html-table-header-cell/markup
-		 "total-number-cell" (gnc:sum-collector-commodity money-out-collector report-currency exchange-fn))))
-
-	      (gnc:html-table-append-ruler! table 2)
-
-	      (gnc:html-table-append-row/markup!
-	       table
-	       "grand-total"
-	       (list
-		(gnc:make-html-table-header-cell/markup "text-cell" (_ "Difference"))
-		(gnc:make-html-table-header-cell/markup
-		 "total-number-cell" (gnc:sum-collector-commodity money-diff-collector report-currency exchange-fn))))
-
-	      (gnc:html-document-add-object! doc table)
-
-
-	      ;; add currency information
-	      (if show-rates?
-		  (gnc:html-document-add-object!
-		   doc ;;(gnc:html-markup-p
-		   (gnc:html-make-exchangerates
-		    report-currency exchange-fn accounts))))
-
-	    ))
-
-	    ;; error condition: no accounts specified
-	    
-	(gnc:html-document-add-object!
-	 doc
-	 (gnc:html-make-no-account-warning
-	  reportname (gnc:report-id report-obj))))
+                         (list (cons 'accounts accounts)
+                               (cons 'to-date-t64 to-date-t64)
+                               (cons 'from-date-t64 from-date-t64)
+                               (cons 'report-currency report-currency)
+                               (cons 'include-trading-accounts include-trading-accounts)
+                               (cons 'to-report-currency to-report-currency)))))
+            (let ((money-in-accounts (cdr (assq 'money-in-accounts result)))
+                  (money-in-alist (cdr (assq 'money-in-alist result)))
+                  (money-in-collector (cdr (assq 'money-in-collector result)))
+                  (money-out-accounts (cdr (assq 'money-out-accounts result)))
+                  (money-out-alist (cdr (assq 'money-out-alist result)))
+                  (money-out-collector (cdr (assq 'money-out-collector result))))
+              (money-diff-collector 'merge money-in-collector #f)
+              (money-diff-collector 'minusmerge money-out-collector #f)
+
+              (set! accounts (sort accounts account-full-name<?))
+              (set! money-in-accounts (sort money-in-accounts account-full-name<?))
+              (set! money-out-accounts (sort money-out-accounts account-full-name<?))
+
+
+              (set! work-done 0)
+              (set! work-to-do (length accounts))
+              (for-each
+               (lambda (account)
+                 (set! work-done (+ 1 work-done))
+                 (gnc:report-percent-done (+ 85 (* 5 (/ work-done work-to-do))))
+                 (if (<= (gnc-account-get-current-depth account) tree-depth)
+                     (let* ((anchor (gnc:html-markup/format
+                                     (if (and (= (gnc-account-get-current-depth account) tree-depth)
+                                              (not (eq? (gnc-account-get-children account) '())))
+                                         (if show-subaccts?
+                                             (_ "~a and subaccounts")
+                                             (_ "~a and selected subaccounts"))
+                                         "~a")
+                                     (gnc:html-markup-anchor
+                                      (gnc:account-anchor-text account)
+                                      (if show-full-names?
+                                          (gnc-account-get-full-name account)
+                                          (xaccAccountGetName account))))))
+
+                       (set! account-disp-list (cons anchor account-disp-list)))))
+               accounts)
+
+
+              (gnc:html-document-add-object!
+               doc
+               (gnc:make-html-text (_ "Selected Accounts")))
+
+              (gnc:html-document-add-object!
+               doc
+               (gnc:make-html-text
+                (gnc:html-markup-ul
+                 (reverse account-disp-list))))
+
+              (gnc:html-table-append-ruler! table 2)
+
+              (gnc:html-table-append-row/markup!
+               table
+               "primary-subheading"
+               (list
+                (_ "Money into selected accounts comes from")
+                ""))
+
+              (set! row-num 0)
+              (set! work-done 0)
+              (set! work-to-do (length money-in-alist))
+              (for-each
+               (lambda (account)
+                 (set! row-num (+ 1 row-num))
+                 (set! work-done (+ 1 work-done))
+                 (gnc:report-percent-done (+ 90 (* 5 (/ work-done work-to-do))))
+                 (let* ((pair (assoc account money-in-alist))
+                        (acct (car pair)))
+                   (gnc:html-table-append-row/markup!
+                    table
+                    (if (odd? row-num) "normal-row" "alternate-row")
+                    (list
+                                        ;(gnc:html-account-anchor acct)
+                     (gnc:make-html-text
+                      (gnc:html-markup-anchor
+                       (gnc:account-anchor-text acct)
+                       (if show-full-names?
+                           (gnc-account-get-full-name acct)
+                           (xaccAccountGetName acct))))
+                     (gnc:make-html-table-header-cell/markup
+                      "number-cell" (gnc:sum-collector-commodity (cadr pair) report-currency exchange-fn))))))
+               money-in-accounts)
+
+              (gnc:html-table-append-row/markup!
+               table
+               "grand-total"
+               (list
+                (gnc:make-html-table-header-cell/markup "text-cell" (_ "Money In"))
+                (gnc:make-html-table-header-cell/markup
+                 "total-number-cell" (gnc:sum-collector-commodity money-in-collector report-currency exchange-fn))))
+
+              (gnc:html-table-append-ruler! table 2)
+
+              (gnc:html-table-append-row/markup!
+               table
+               "primary-subheading"
+               (list
+                (_ "Money out of selected accounts goes to")
+                ""))
+
+              (set! row-num 0)
+              (set! work-done 0)
+              (set! work-to-do (length money-out-alist))
+              (for-each
+               (lambda (account)
+                 (set! row-num (+ 1 row-num))
+                 (set! work-done (+ 1 work-done))
+                 (gnc:report-percent-done (+ 95 (* 5 (/ work-done work-to-do))))
+                 (let* ((pair (assoc account money-out-alist))
+                        (acct (car pair)))
+                   (gnc:html-table-append-row/markup!
+                    table
+                    (if (odd? row-num) "normal-row" "alternate-row")
+                    (list
+                                        ;(gnc:html-account-anchor acct)
+                     (gnc:make-html-text
+                      (gnc:html-markup-anchor
+                       (gnc:account-anchor-text acct)
+                       (if show-full-names?
+                           (gnc-account-get-full-name acct)
+                           (xaccAccountGetName acct))))
+                     (gnc:make-html-table-header-cell/markup
+                      "number-cell" (gnc:sum-collector-commodity (cadr pair) report-currency exchange-fn))))))
+               money-out-accounts)
+
+              (gnc:html-table-append-row/markup!
+               table
+               "grand-total"
+               (list
+                (gnc:make-html-table-header-cell/markup "text-cell" (_ "Money Out"))
+                (gnc:make-html-table-header-cell/markup
+                 "total-number-cell" (gnc:sum-collector-commodity money-out-collector report-currency exchange-fn))))
+
+              (gnc:html-table-append-ruler! table 2)
+
+              (gnc:html-table-append-row/markup!
+               table
+               "grand-total"
+               (list
+                (gnc:make-html-table-header-cell/markup "text-cell" (_ "Difference"))
+                (gnc:make-html-table-header-cell/markup
+                 "total-number-cell" (gnc:sum-collector-commodity money-diff-collector report-currency exchange-fn))))
+
+              (gnc:html-document-add-object! doc table)
+
+
+              ;; add currency information
+              (if show-rates?
+                  (gnc:html-document-add-object!
+                   doc ;;(gnc:html-markup-p
+                   (gnc:html-make-exchangerates
+                    report-currency exchange-fn accounts))))))
+
+        ;; error condition: no accounts specified
+
+        (gnc:html-document-add-object!
+         doc
+         (gnc:html-make-no-account-warning
+          reportname (gnc:report-id report-obj))))
 
     (gnc:report-finished)
     doc))
@@ -390,134 +378,119 @@
 ;; function to add inflow and outflow of money
 (define (cash-flow-calc-money-in-out settings)
   (let* ((accounts (cdr (assq 'accounts settings)))
-	 (to-date-t64 (cdr (assq 'to-date-t64 settings)))
-	 (from-date-t64 (cdr (assq 'from-date-t64 settings)))
-	 (report-currency (cdr (assq 'report-currency settings)))
-	 (include-trading-accounts (cdr (assq 'include-trading-accounts settings)))
-	 (to-report-currency (cdr (assq 'to-report-currency settings)))
+         (to-date-t64 (cdr (assq 'to-date-t64 settings)))
+         (from-date-t64 (cdr (assq 'from-date-t64 settings)))
+         (report-currency (cdr (assq 'report-currency settings)))
+         (include-trading-accounts (cdr (assq 'include-trading-accounts settings)))
+         (to-report-currency (cdr (assq 'to-report-currency settings)))
 
-	 (is-report-account? (account-in-list-pred accounts))
+         (is-report-account? (account-in-list-pred accounts))
 
-	 (money-in-accounts '())
-	 (money-in-hash (make-hash-table))
-	 (money-in-collector (gnc:make-commodity-collector))
+         (money-in-accounts '())
+         (money-in-hash (make-hash-table))
+         (money-in-collector (gnc:make-commodity-collector))
 
-	 (money-out-accounts '())
-	 (money-out-hash (make-hash-table))
-	 (money-out-collector (gnc:make-commodity-collector))
+         (money-out-accounts '())
+         (money-out-hash (make-hash-table))
+         (money-out-collector (gnc:make-commodity-collector))
 
-	 (all-splits (gnc:account-get-trans-type-splits-interval accounts '() from-date-t64 to-date-t64))
-	 (splits-to-do (length all-splits))
-	 (splits-seen-table (make-hash-table))
-	 (work-done 0))
+         (all-splits (gnc:account-get-trans-type-splits-interval accounts '() from-date-t64 to-date-t64))
+         (splits-to-do (length all-splits))
+         (splits-seen-table (make-hash-table))
+         (work-done 0))
 
     (define (split-seen? split)
       (if (split-hashtable-ref splits-seen-table split) #t
-	  (begin
-	    (split-hashtable-set! splits-seen-table split #t)
-	    #f)))
+          (begin
+            (split-hashtable-set! splits-seen-table split #t)
+            #f)))
 
     (define (work-per-split split)
       (set! work-done (+ 1 work-done))
       (if (= (modulo work-done 100) 0)
-	  (gnc:report-percent-done (* 85 (/ work-done splits-to-do))))
+          (gnc:report-percent-done (* 85 (/ work-done splits-to-do))))
       (let ((parent (xaccSplitGetParent split)))
-	(if (and (<= (xaccTransGetDate parent) to-date-t64)
-		 (>= (xaccTransGetDate parent) from-date-t64))
-	    (let* ((parent-description (xaccTransGetDescription parent))
-		   (parent-currency (xaccTransGetCurrency parent)))
-					(gnc:debug parent-description
-					           " - "
-					           (gnc-commodity-get-printname parent-currency))
-	      (for-each
-	       (lambda (s)
-		 (let* ((s-account (xaccSplitGetAccount s))
-			(s-account-type (xaccAccountGetType s-account))
-			(s-amount (xaccSplitGetAmount s))
-			(s-value (xaccSplitGetValue s))
-			(s-commodity (xaccAccountGetCommodity s-account)))
-		   ;; Check if this is a dangling split
-		   ;; and print a warning
-		   (if (null? s-account)
-		       (display
-			(string-append
-			 "WARNING: s-account is NULL for split: "
-			 (gncSplitGetGUID s) "\n")))
-					(gnc:debug (xaccAccountGetName s-account))
-		   (if (and	 ;; make sure we don't have
-			(not (null? s-account)) ;;  any dangling splits
-			(or include-trading-accounts (not (eq? s-account-type ACCT-TYPE-TRADING)))
-			(not (is-report-account? s-account)))
-		       (if (not (split-seen? s))
-			   (begin
-			     (if (gnc-numeric-negative-p s-value)
-				 (let ((s-account-in-collector (account-hashtable-ref money-in-hash s-account)))
+        (if (and (<= (xaccTransGetDate parent) to-date-t64)
+                 (>= (xaccTransGetDate parent) from-date-t64))
+            (let* ((parent-description (xaccTransGetDescription parent))
+                   (parent-currency (xaccTransGetCurrency parent)))
+              (gnc:debug parent-description
+                         " - "
+                         (gnc-commodity-get-printname parent-currency))
+              (for-each
+               (lambda (s)
+                 (let* ((s-account (xaccSplitGetAccount s))
+                        (s-account-type (xaccAccountGetType s-account))
+                        (s-amount (xaccSplitGetAmount s))
+                        (s-value (xaccSplitGetValue s))
+                        (s-commodity (xaccAccountGetCommodity s-account)))
+                   ;; Check if this is a dangling split
+                   ;; and print a warning
+                   (if (null? s-account)
+                       (display
+                        (string-append
+                         "WARNING: s-account is NULL for split: "
+                         (gncSplitGetGUID s) "\n")))
+                   (gnc:debug (xaccAccountGetName s-account))
+                   (if (and      ;; make sure we don't have
+                        (not (null? s-account)) ;;  any dangling splits
+                        (or include-trading-accounts (not (eq? s-account-type ACCT-TYPE-TRADING)))
+                        (not (is-report-account? s-account)))
+                       (if (not (split-seen? s))
+                           (begin
+                             (if (gnc-numeric-negative-p s-value)
+                                 (let ((s-account-in-collector (account-hashtable-ref money-in-hash s-account)))
                                         ;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
-					;	     (gnc-numeric-to-double s-amount)
-					;	     (gnc-commodity-get-printname parent-currency)
-					;	     (gnc-numeric-to-double s-value))
-				   (if (not s-account-in-collector)
-				       (begin
-					 (set! s-account-in-collector (gnc:make-commodity-collector))
-					 (account-hashtable-set! money-in-hash s-account
-								 s-account-in-collector)
-					 (set! money-in-accounts (cons s-account money-in-accounts))
-					 )
-				       )
-				   (let ((s-report-value (to-report-currency parent-currency
-									     (gnc-numeric-neg s-value)
-									     (xaccTransGetDate
-									      parent))))
-				     (money-in-collector 'add report-currency s-report-value)
-				     (s-account-in-collector 'add report-currency s-report-value))
-				   )
-				 (let ((s-account-out-collector (account-hashtable-ref money-out-hash s-account)))
-					;(gnc:debug "out:" (gnc-commodity-get-printname s-commodity)
-					;	     (gnc-numeric-to-double s-amount)
-					;	     (gnc-commodity-get-printname parent-currency)
-					;	     (gnc-numeric-to-double s-value))
-				   (if (not s-account-out-collector)
-				       (begin
-					 (set! s-account-out-collector (gnc:make-commodity-collector))
-					 (account-hashtable-set! money-out-hash s-account
-								 s-account-out-collector)
-					 (set! money-out-accounts (cons s-account money-out-accounts))
-					 )
-				       )
-				   (let ((s-report-value (to-report-currency parent-currency
-									     s-value
-									     (xaccTransGetDate
-									      parent))))
-				     (money-out-collector 'add report-currency s-report-value)
-				     (s-account-out-collector 'add report-currency s-report-value))
-				   )
-				 )
-			     )
-                           )
-                       )
-		   )
-		 )
-	       (xaccTransGetSplitList parent)
-	       )
-	      )
-            )
-	)
-      )
-
-    (define (calc-money-in-out-internal accounts)
-      (for-each work-per-split all-splits))
-
-    ;; And calculate
-    (calc-money-in-out-internal accounts)
+                                        ;            (gnc-numeric-to-double s-amount)
+                                        ;            (gnc-commodity-get-printname parent-currency)
+                                        ;            (gnc-numeric-to-double s-value))
+                                   (if (not s-account-in-collector)
+                                       (begin
+                                         (set! s-account-in-collector (gnc:make-commodity-collector))
+                                         (account-hashtable-set! money-in-hash s-account
+                                                                 s-account-in-collector)
+                                         (set! money-in-accounts (cons s-account money-in-accounts))
+                                         )
+                                       )
+                                   (let ((s-report-value (to-report-currency parent-currency
+                                                                             (gnc-numeric-neg s-value)
+                                                                             (xaccTransGetDate
+                                                                              parent))))
+                                     (money-in-collector 'add report-currency s-report-value)
+                                     (s-account-in-collector 'add report-currency s-report-value))
+                                   )
+                                 (let ((s-account-out-collector (account-hashtable-ref money-out-hash s-account)))
+                                        ;(gnc:debug "out:" (gnc-commodity-get-printname s-commodity)
+                                        ;            (gnc-numeric-to-double s-amount)
+                                        ;            (gnc-commodity-get-printname parent-currency)
+                                        ;            (gnc-numeric-to-double s-value))
+                                   (if (not s-account-out-collector)
+                                       (begin
+                                         (set! s-account-out-collector (gnc:make-commodity-collector))
+                                         (account-hashtable-set! money-out-hash s-account
+                                                                 s-account-out-collector)
+                                         (set! money-out-accounts (cons s-account money-out-accounts))
+                                         )
+                                       )
+                                   (let ((s-report-value (to-report-currency parent-currency
+                                                                             s-value
+                                                                             (xaccTransGetDate
+                                                                              parent))))
+                                     (money-out-collector 'add report-currency s-report-value)
+                                     (s-account-out-collector 'add report-currency s-report-value)))))))))
+               (xaccTransGetSplitList parent))))))
+
+    (for-each work-per-split all-splits)
+
     ;; Return an association list of results
     (list (cons 'money-in-accounts money-in-accounts)
-	  (cons 'money-in-alist (hash-map->list (lambda (k v) (list k v)) money-in-hash))
-	  (cons 'money-in-collector money-in-collector)
-	  (cons 'money-out-accounts money-out-accounts)
-	  (cons 'money-out-alist (hash-map->list (lambda (k v) (list k v)) money-out-hash))
-	  (cons 'money-out-collector money-out-collector))))
+          (cons 'money-in-alist (hash-map->list (lambda (k v) (list k v)) money-in-hash))
+          (cons 'money-in-collector money-in-collector)
+          (cons 'money-out-accounts money-out-accounts)
+          (cons 'money-out-alist (hash-map->list (lambda (k v) (list k v)) money-out-hash))
+          (cons 'money-out-collector money-out-collector))))
 
-(gnc:define-report 
+(gnc:define-report
  'version 1
  'name reportname
  'report-guid "f8748b813fab4220ba26e743aedf38da"

commit d97d4930bae2135e71980e0ee5d23a2ab5a6a449
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Jan 28 17:22:23 2019 +0800

    [cash-flow] replace account-in-alist with srfi-1 equivalent

diff --git a/gnucash/report/standard-reports/cash-flow.scm b/gnucash/report/standard-reports/cash-flow.scm
index eb22721aa..60b97d339 100644
--- a/gnucash/report/standard-reports/cash-flow.scm
+++ b/gnucash/report/standard-reports/cash-flow.scm
@@ -281,7 +281,7 @@
 		 (set! row-num (+ 1 row-num))
 		 (set! work-done (+ 1 work-done))
 		 (gnc:report-percent-done (+ 90 (* 5 (/ work-done work-to-do))))
-		 (let* ((pair (account-in-alist account money-in-alist))
+		 (let* ((pair (assoc account money-in-alist))
 			(acct (car pair)))
 		   (gnc:html-table-append-row/markup!
 		    table
@@ -326,7 +326,7 @@
 		 (set! row-num (+ 1 row-num))
 		 (set! work-done (+ 1 work-done))
 		 (gnc:report-percent-done (+ 95 (* 5 (/ work-done work-to-do))))
-		 (let* ((pair (account-in-alist account money-out-alist))
+		 (let* ((pair (assoc account money-out-alist))
 			(acct (car pair)))
 		   (gnc:html-table-append-row/markup!
 		    table

commit 1a69bf1b2f07bb0ebe1aac318a0190cc185eb6b4
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Tue Jan 22 18:53:14 2019 +0800

    [cashflow-barchart] remove srfi-1 aliases

diff --git a/gnucash/report/standard-reports/cashflow-barchart.scm b/gnucash/report/standard-reports/cashflow-barchart.scm
index 7d9f4483b..14b9d94ec 100644
--- a/gnucash/report/standard-reports/cashflow-barchart.scm
+++ b/gnucash/report/standard-reports/cashflow-barchart.scm
@@ -37,10 +37,6 @@
 
 (gnc:module-load "gnucash/report/report-system" 0)
 
-;; Define these utilities to avoid using module srfi-1
-(define first car)
-(define second cadr)
-
 (define reportname (N_ "Cash Flow Barchart"))
 
 ;; define all option's names so that they are properly defined
@@ -255,8 +251,8 @@
              (set! work-done (+ 1 work-done))
              (gnc:report-percent-done (* 80 (/ work-done work-to-do)))
              (let* ((settings (list (cons 'accounts accounts)
-                                    (cons 'to-date-t64 (second date-pair))
-                                    (cons 'from-date-t64 (first date-pair))
+                                    (cons 'from-date-t64 (car date-pair))
+                                    (cons 'to-date-t64 (cadr date-pair))
                                     (cons 'report-currency report-currency)
                                     (cons 'include-trading-accounts include-trading-accounts)
                                     (cons 'to-report-currency to-report-currency)))

commit 56bccd1b50707389dff77b99912aeb26f2af5f8f
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Feb 20 19:45:10 2019 +0800

    [cashflow-barchart] reuse cash-flow-calc-money-in-out
    
    The (cashflow-barchart-calc-money-in-out) function was copied verbatim
    from cash-flow.scm (apart from the returned list being shorter). reuse
    function from cash-flow.scm.
    
    Test already exists in test-cashflow-barchart.scm

diff --git a/gnucash/report/standard-reports/cashflow-barchart.scm b/gnucash/report/standard-reports/cashflow-barchart.scm
index f5c873c7b..7d9f4483b 100644
--- a/gnucash/report/standard-reports/cashflow-barchart.scm
+++ b/gnucash/report/standard-reports/cashflow-barchart.scm
@@ -33,6 +33,7 @@
 (use-modules (gnucash gnc-module))
 (use-modules (gnucash gettext))
 (use-modules (gnucash engine))
+(use-modules (gnucash report standard-reports cash-flow))
 
 (gnc:module-load "gnucash/report/report-system" 0)
 
@@ -259,7 +260,7 @@
                                     (cons 'report-currency report-currency)
                                     (cons 'include-trading-accounts include-trading-accounts)
                                     (cons 'to-report-currency to-report-currency)))
-                    (result (cashflow-barchart-calc-money-in-out settings))
+                    (result (cash-flow-calc-money-in-out settings))
                     (money-in-collector (cdr (assq 'money-in-collector result)))
                     (money-out-collector (cdr (assq 'money-out-collector result)))
                     (money-in (sum-collector money-in-collector))
@@ -379,126 +380,6 @@
     doc))
 
 
-;; function to add inflow and outflow of money
-(define (cashflow-barchart-calc-money-in-out settings)
-  (let* ((accounts (cdr (assq 'accounts settings)))
-         (to-date-t64 (cdr (assq 'to-date-t64 settings)))
-         (from-date-t64 (cdr (assq 'from-date-t64 settings)))
-         (report-currency (cdr (assq 'report-currency settings)))
-         (include-trading-accounts (cdr (assq 'include-trading-accounts settings)))
-         (to-report-currency (cdr (assq 'to-report-currency settings)))
-
-         (is-report-account? (account-in-list-pred accounts))
-
-         (money-in-accounts '())
-         (money-in-hash (make-hash-table))
-         (money-in-collector (gnc:make-commodity-collector))
-
-         (money-out-accounts '())
-         (money-out-hash (make-hash-table))
-         (money-out-collector (gnc:make-commodity-collector))
-
-         (all-splits (gnc:account-get-trans-type-splits-interval accounts '() from-date-t64 to-date-t64))
-         (splits-seen-table (make-hash-table)))
-
-    (define (split-seen? split)
-      (if (split-hashtable-ref splits-seen-table split) #t
-          (begin
-            (split-hashtable-set! splits-seen-table split #t)
-            #f)))
-
-    (define (work-per-split split)
-      (let ((parent (xaccSplitGetParent split)))
-        (if (and (<= (xaccTransGetDate parent) to-date-t64)
-                 (>= (xaccTransGetDate parent) from-date-t64))
-            (let* ((parent-description (xaccTransGetDescription parent))
-                   (parent-currency (xaccTransGetCurrency parent)))
-                                        ;(gnc:debug parent-description
-                                        ;           " - "
-                                        ;           (gnc-commodity-get-printname parent-currency))
-              (for-each
-               (lambda (s)
-                 (let* ((s-account (xaccSplitGetAccount s))
-                        (s-account-type (xaccAccountGetType s-account))
-                        (s-amount (xaccSplitGetAmount s))
-                        (s-value (xaccSplitGetValue s))
-                        (s-commodity (xaccAccountGetCommodity s-account)))
-                   ;; Check if this is a dangling split
-                   ;; and print a warning
-                   (if (null? s-account)
-                       (display
-                        (string-append
-                         "WARNING: s-account is NULL for split: "
-                         (gncSplitGetGUID s) "\n")))
-                                        ;(gnc:debug (xaccAccountGetName s-account))
-                   (if (and      ;; make sure we don't have
-                        (not (null? s-account)) ;;  any dangling splits
-                        (or include-trading-accounts (not (eq? s-account-type ACCT-TYPE-TRADING)))
-                        (not (is-report-account? s-account)))
-                       (if (not (split-seen? s))
-                           (begin
-                             (if (gnc-numeric-negative-p s-value)
-                                 (let ((s-account-in-collector (account-hashtable-ref money-in-hash s-account)))
-                                        ;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
-                                        ;            (gnc-numeric-to-double s-amount)
-                                        ;            (gnc-commodity-get-printname parent-currency)
-                                        ;            (gnc-numeric-to-double s-value))
-                                   (if (not s-account-in-collector)
-                                       (begin
-                                         (set! s-account-in-collector (gnc:make-commodity-collector))
-                                         (account-hashtable-set! money-in-hash s-account
-                                                                 s-account-in-collector)
-                                         (set! money-in-accounts (cons s-account money-in-accounts))
-                                         )
-                                       )
-                                   (let ((s-report-value (to-report-currency parent-currency
-                                                                             (gnc-numeric-neg s-value)
-                                                                             (xaccTransGetDate
-                                                                              parent))))
-                                     (money-in-collector 'add report-currency s-report-value)
-                                     (s-account-in-collector 'add report-currency s-report-value))
-                                   )
-                                 (let ((s-account-out-collector (account-hashtable-ref money-out-hash s-account)))
-                                        ;(gnc:debug "out:" (gnc-commodity-get-printname s-commodity)
-                                        ;            (gnc-numeric-to-double s-amount)
-                                        ;            (gnc-commodity-get-printname parent-currency)
-                                        ;            (gnc-numeric-to-double s-value))
-                                   (if (not s-account-out-collector)
-                                       (begin
-                                         (set! s-account-out-collector (gnc:make-commodity-collector))
-                                         (account-hashtable-set! money-out-hash s-account
-                                                                 s-account-out-collector)
-                                         (set! money-out-accounts (cons s-account money-out-accounts))
-                                         )
-                                       )
-                                   (let ((s-report-value (to-report-currency parent-currency
-                                                                             s-value
-                                                                             (xaccTransGetDate
-                                                                              parent))))
-                                     (money-out-collector 'add report-currency s-report-value)
-                                     (s-account-out-collector 'add report-currency s-report-value))
-                                   )
-                                 )
-                             )
-                           )
-                       )
-                   )
-                 )
-               (xaccTransGetSplitList parent)
-               )
-              )
-            )
-        )
-      )
-
-    ;; Calculate money in and out for each split
-    (for-each work-per-split all-splits)
-
-    ;; Return an association list of results
-    (list
-     (cons 'money-in-collector money-in-collector)
-     (cons 'money-out-collector money-out-collector))))
-
 ;; export to make uuid available to unit test: test-cashflow-barchart
 (export cashflow-barchart-uuid)
 (define cashflow-barchart-uuid "5426e4d987f6444387fe70880e5b28a0")



Summary of changes:
 gnucash/report/standard-reports/budget.scm         |   2 +-
 gnucash/report/standard-reports/cash-flow.scm      | 654 +++++++++------------
 .../report/standard-reports/cashflow-barchart.scm  | 131 +----
 3 files changed, 299 insertions(+), 488 deletions(-)



More information about the gnucash-changes mailing list