AUDIT: r17851 - gnucash/trunk/src/report - Bug #568327: Budget reports without a budget will crash

Christian Stimming cstim at cvs.gnucash.org
Wed Jan 28 15:59:57 EST 2009


Author: cstim
Date: 2009-01-28 15:59:57 -0500 (Wed, 28 Jan 2009)
New Revision: 17851
Trac: http://svn.gnucash.org/trac/changeset/17851

Modified:
   gnucash/trunk/src/report/report-system/html-utilities.scm
   gnucash/trunk/src/report/report-system/report-system.scm
   gnucash/trunk/src/report/standard-reports/budget-balance-sheet.scm
   gnucash/trunk/src/report/standard-reports/budget-barchart.scm
   gnucash/trunk/src/report/standard-reports/budget-flow.scm
   gnucash/trunk/src/report/standard-reports/budget-income-statement.scm
   gnucash/trunk/src/report/standard-reports/budget.scm
Log:
Bug #568327: Budget reports without a budget will crash

Fixes crashes and also improves error message when no budgets exists (for all
budget reports).

Patch by Forest Bond.
BP

Modified: gnucash/trunk/src/report/report-system/html-utilities.scm
===================================================================
--- gnucash/trunk/src/report/report-system/html-utilities.scm	2009-01-28 20:55:11 UTC (rev 17850)
+++ gnucash/trunk/src/report/report-system/html-utilities.scm	2009-01-28 20:59:57 UTC (rev 17851)
@@ -785,6 +785,17 @@
     table))
 
 
+(define (gnc:html-make-generic-budget-warning report-title-string)
+  (let ((p (gnc:make-html-text)))
+    (gnc:html-text-append!
+     p
+     (gnc:html-markup-h2 (string-append (_ report-title-string) ":"))
+     (gnc:html-markup-h2 "")
+     (gnc:html-markup-p
+       (_ "No budgets exist.  You must create at least one budget.")))
+    p))
+
+
 ;; TODO: How 'bout factoring the "Edit report options" stuff out of
 ;; these 3 functions?
 

Modified: gnucash/trunk/src/report/report-system/report-system.scm
===================================================================
--- gnucash/trunk/src/report/report-system/report-system.scm	2009-01-28 20:55:11 UTC (rev 17850)
+++ gnucash/trunk/src/report/report-system/report-system.scm	2009-01-28 20:59:57 UTC (rev 17851)
@@ -90,6 +90,7 @@
 (export gnc:first-html-build-acct-table)
 (export gnc:html-make-exchangerates)
 (export gnc:html-make-no-account-warning)
+(export gnc:html-make-generic-budget-warning)
 (export gnc:html-make-generic-options-warning)
 (export gnc:html-make-empty-data-warning)
 

Modified: gnucash/trunk/src/report/standard-reports/budget-balance-sheet.scm
===================================================================
--- gnucash/trunk/src/report/standard-reports/budget-balance-sheet.scm	2009-01-28 20:55:11 UTC (rev 17850)
+++ gnucash/trunk/src/report/standard-reports/budget-balance-sheet.scm	2009-01-28 20:59:57 UTC (rev 17851)
@@ -311,7 +311,8 @@
 	 (report-title (get-option gnc:pagename-general optname-report-title))
 	 (company-name (get-option gnc:pagename-general optname-party-name))
          (budget (get-option gnc:pagename-general optname-budget))
-         (date-tp (gnc:budget-get-start-date budget))
+         (budget-valid? (and budget (not (null? budget))))
+         (date-tp (if budget-valid? (gnc:budget-get-start-date budget) #f))
          (report-form? (get-option gnc:pagename-general
                                optname-report-form))
          (accounts (get-option gnc:pagename-accounts
@@ -381,7 +382,6 @@
          ;; exchange rates calculation parameters
 	 (exchange-fn
 	  (gnc:case-exchange-fn price-source report-commodity date-tp))
-
 	 )
     
     ;; Wrapper to call gnc:html-table-add-labeled-amount-line!
@@ -423,23 +423,18 @@
        (+ (* 2 tree-depth)
 	  (if (equal? tabbing 'canonically-tabbed) 1 0))))
 
-    ;;(gnc:warn "account names" liability-account-names)
-    (gnc:html-document-set-title! 
-     doc (string-append company-name " " report-title " "
-                        (gnc-budget-get-name budget))
-     )
-    
-    (if (null? accounts)
-	
-        ;; error condition: no accounts specified
-	;; is this *really* necessary??
-	;; i'd be fine with an all-zero balance sheet
-	;; that would, technically, be correct....
+    (cond
+      ((null? accounts)
+        ;; No accounts selected.
         (gnc:html-document-add-object! 
          doc 
          (gnc:html-make-no-account-warning 
-	  reportname (gnc:report-id report-obj)))
-	
+	  reportname (gnc:report-id report-obj))))
+      ((not budget-valid?)
+        ;; No budget selected.
+        (gnc:html-document-add-object!
+          doc (gnc:html-make-generic-budget-warning reportname)))
+      (else (begin
         ;; Get all the balances for each of the account types.
         (let* ((asset-balance #f)
                (asset-account-initial-balances #f)
@@ -485,6 +480,8 @@
 	       (left-table (gnc:make-html-table)) ;; gnc:html-table
 	       (right-table (if report-form? left-table
 				(gnc:make-html-table)))
+
+               (budget-name (gnc-budget-get-name budget))
 	       )
 	  
 
@@ -710,6 +707,8 @@
 
 	  (gnc:report-percent-done 30)
 	  
+          (gnc:html-document-set-title! 
+            doc (string-append company-name " " report-title " " budget-name))
 
 	  (set! table-env
 		(list
@@ -917,13 +916,11 @@
 		)
 	      )
 	  )
-	)
+	))) ;; end cond
     
     (gnc:report-finished)
     
-    doc
-    )
-  )
+    doc))
 
 (gnc:define-report 
  'version 1

Modified: gnucash/trunk/src/report/standard-reports/budget-barchart.scm
===================================================================
--- gnucash/trunk/src/report/standard-reports/budget-barchart.scm	2009-01-28 20:55:11 UTC (rev 17850)
+++ gnucash/trunk/src/report/standard-reports/budget-barchart.scm	2009-01-28 20:59:57 UTC (rev 17851)
@@ -177,28 +177,34 @@
 
   (let* (
       (budget (get-option gnc:pagename-general optname-budget))
+      (budget-valid? (and budget (not (null? budget))))
       (running-sum (get-option gnc:pagename-general optname-running-sum))
       (accounts (get-option gnc:pagename-accounts optname-accounts))
       (report-title (get-option gnc:pagename-general
         gnc:optname-reportname))
       (document (gnc:make-html-document))
     )
-    (if (null? accounts)
-      ;; No accounts selected
-      (gnc:html-document-add-object!
-        document
-          (gnc:html-make-no-account-warning 
-            report-title (gnc:report-id report-obj)))
+    (cond
+      ((null? accounts)
+        ;; No accounts selected
+        (gnc:html-document-add-object!
+          document
+            (gnc:html-make-no-account-warning 
+              report-title (gnc:report-id report-obj))))
 
+      ((not budget-valid?)
+        ;; No budget selected.
+        (gnc:html-document-add-object!
+          document (gnc:html-make-generic-budget-warning reportname)))
+
       ;; Else create chart for each account
-      (for-each (lambda (acct)
+      (else
+        (for-each (lambda (acct)
           (if (null? (gnc-account-get-descendants acct))
             (gnc:html-document-add-object! document
-              (gnc:chart-create-budget-actual budget acct running-sum)))
-        )
-        accounts
-      )
-    )
+              (gnc:chart-create-budget-actual budget acct running-sum))))
+          accounts))
+    ) ;; end cond
     
     document
 ))

Modified: gnucash/trunk/src/report/standard-reports/budget-flow.scm
===================================================================
--- gnucash/trunk/src/report/standard-reports/budget-flow.scm	2009-01-28 20:55:11 UTC (rev 17850)
+++ gnucash/trunk/src/report/standard-reports/budget-flow.scm	2009-01-28 20:59:57 UTC (rev 17851)
@@ -266,6 +266,7 @@
   ;; get all option's values
   (let* (
       (budget (get-option gnc:pagename-general optname-budget))
+      (budget-valid? (and budget (not (null? budget))))
       (accounts (get-option gnc:pagename-accounts optname-accounts))
       (period (inexact->exact (get-option gnc:pagename-general
         optname-periods)))
@@ -282,9 +283,21 @@
       (doc (gnc:make-html-document))
     )
 
-    ;; If no account are select show a warring page    
-    (if (not (or (null? accounts) (null? budget) (not budget)))
-      (let* (
+    (cond
+      ((null? accounts)
+        ;; No accounts selected
+        (gnc:html-document-add-object!
+          doc
+            (gnc:html-make-no-account-warning 
+              report-title (gnc:report-id report-obj))))
+
+      ((not budget-valid?)
+        ;; No budget selected.
+        (gnc:html-document-add-object!
+          doc (gnc:html-make-generic-budget-warning reportname)))
+
+      (else (begin
+        (let* (
           (html-table (gnc:make-html-table))
           (report-name (get-option gnc:pagename-general
             gnc:optname-reportname))
@@ -306,15 +319,8 @@
         (gnc:html-table-add-budget-totals! html-table accounts-totals exchange-fn report-currency)
 
         ;; Display table
-        (gnc:html-document-add-object! doc html-table)
-      )
+        (gnc:html-document-add-object! doc html-table)))))
 
-      ;; error condition: either no accounts or no budgets specified
-      (gnc:html-document-add-object!
-        doc (gnc:html-make-generic-options-warning
-	  reportname (gnc:report-id report-obj)))
-    )
-
     ;; Update progress bar
     (gnc:report-finished)
     doc))

Modified: gnucash/trunk/src/report/standard-reports/budget-income-statement.scm
===================================================================
--- gnucash/trunk/src/report/standard-reports/budget-income-statement.scm	2009-01-28 20:55:11 UTC (rev 17850)
+++ gnucash/trunk/src/report/standard-reports/budget-income-statement.scm	2009-01-28 20:59:57 UTC (rev 17851)
@@ -266,7 +266,8 @@
 	 (report-title (get-option gnc:pagename-general optname-report-title))
 	 (company-name (get-option gnc:pagename-general optname-party-name))
          (budget (get-option gnc:pagename-general optname-budget))
-         (date-tp (gnc:budget-get-start-date budget))
+         (budget-valid? (and budget (not (null? budget))))
+         (date-tp (if budget-valid? (gnc:budget-get-start-date budget) #f))
          (accounts (get-option gnc:pagename-accounts
                                optname-accounts))	 
 	 (depth-limit (get-option gnc:pagename-accounts 
@@ -328,8 +329,6 @@
          ;; exchange rates calculation parameters
 	 (exchange-fn
 	  (gnc:case-exchange-fn price-source report-commodity date-tp))
-
-         (budget-name (gnc-budget-get-name budget))
 	 )
     
     ;; Wrapper to call gnc:html-table-add-labeled-amount-line!
@@ -370,20 +369,18 @@
        (+ (* 2 tree-depth)
 	  (if (equal? tabbing 'canonically-tabbed) 1 0))))
     
-    (gnc:html-document-set-title! 
-     doc (sprintf #f "%s %s %s" company-name report-title budget-name))
-    
-    (if (null? accounts)
-	
-        ;; error condition: no accounts specified
-	;; is this *really* necessary??
-	;; i'd be fine with an all-zero P&L
-	;; that would, technically, be correct....
+    (cond
+      ((null? accounts)
+        ;; No accounts selected.
         (gnc:html-document-add-object! 
          doc 
          (gnc:html-make-no-account-warning 
-	  reportname (gnc:report-id report-obj)))
-	
+	  reportname (gnc:report-id report-obj))))
+      ((not budget-valid?)
+        ;; No budget selected.
+        (gnc:html-document-add-object!
+          doc (gnc:html-make-generic-budget-warning report-title)))
+      (else (begin
         ;; Get all the balances for each of the account types.
         (let* (
                (revenue-account-balances #f)
@@ -406,7 +403,7 @@
 	       (params #f)                         ;; and -add-account-
                (revenue-table #f)                  ;; gnc:html-acct-table
                (expense-table #f)                  ;; gnc:html-acct-table
-	       
+               (budget-name (gnc-budget-get-name budget))
 	       (period-for (string-append " " (_ "for Budget ") budget-name))
 	       )
 
@@ -499,6 +496,8 @@
 
 	  (gnc:report-percent-done 30)
 
+          (gnc:html-document-set-title! 
+            doc (sprintf #f "%s %s %s" company-name report-title budget-name))
 
 	  (set! table-env
 		(list
@@ -633,13 +632,11 @@
 	  (gnc:report-percent-done 100)
 	  
 	  )
-	)
+	))) ;; end cond
     
     (gnc:report-finished)
     
-    doc
-    )
-  )
+    doc))
 
 (define is-reportname (N_ "Budget Income Statement"))
 (define pnl-reportname (N_ "Budget Profit & Loss"))

Modified: gnucash/trunk/src/report/standard-reports/budget.scm
===================================================================
--- gnucash/trunk/src/report/standard-reports/budget.scm	2009-01-28 20:55:11 UTC (rev 17850)
+++ gnucash/trunk/src/report/standard-reports/budget.scm	2009-01-28 20:59:57 UTC (rev 17851)
@@ -293,6 +293,7 @@
 
   ;; get all option's values
   (let* ((budget (get-option gnc:pagename-general optname-budget))
+         (budget-valid? (and budget (not (null? budget))))
          (display-depth (get-option gnc:pagename-accounts
                                     optname-display-depth))
          (show-subaccts? (get-option gnc:pagename-accounts
@@ -363,8 +364,18 @@
                   (set! accounts (append accounts sub-accounts))))
             sub-accounts)))
 
-    (if (not (or (null? accounts) (null? budget) (not budget)))
-
+    (cond
+      ((null? accounts)
+        ;; No accounts selected.
+        (gnc:html-document-add-object! 
+         doc 
+         (gnc:html-make-no-account-warning 
+	  reportname (gnc:report-id report-obj))))
+      ((not budget-valid?)
+        ;; No budget selected.
+        (gnc:html-document-add-object!
+          doc (gnc:html-make-generic-budget-warning reportname)))
+      (else (begin
         (let* ((tree-depth (if (equal? display-depth 'all)
                                (accounts-get-children-depth accounts)
                                display-depth))
@@ -418,15 +429,9 @@
           ;; table width, since the add-account-balance had put stuff
           ;; there, but it doesn't seem to matter.
 
-          (gnc:html-document-add-object! doc html-table)
-          )
+          (gnc:html-document-add-object! doc html-table))))
+      ) ;; end cond
 
-        ;; error condition: either no accounts or no budgets specified
-        (gnc:html-document-add-object!
-         doc
-         (gnc:html-make-generic-options-warning
-	  reportname (gnc:report-id report-obj))))
-
     (gnc:report-finished)
     doc))
 



More information about the gnucash-changes mailing list