From e2907844be26d61914385e3932fe1de2ca31b588 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Tue, 10 Jul 2018 23:30:26 +0800 Subject: [PATCH 1/8] [customer-summary] prevents crash on empty-book with no accounts --- gnucash/report/business-reports/customer-summary.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gnucash/report/business-reports/customer-summary.scm b/gnucash/report/business-reports/customer-summary.scm index b0384befe7..f6e05c5cf6 100644 --- a/gnucash/report/business-reports/customer-summary.scm +++ b/gnucash/report/business-reports/customer-summary.scm @@ -699,7 +699,7 @@ (expense-accounts (opt-val pagename-expenseaccounts optname-expenseaccounts)) (income-accounts (opt-val pagename-incomeaccounts optname-incomeaccounts)) (all-accounts (append income-accounts expense-accounts)) - (book (gnc-account-get-book (car all-accounts))) + (book (gnc-get-current-book)) (date-format (gnc:options-fancy-date book)) (type (opt-val "__reg" "owner-type")) (reverse? (opt-val "__reg" "reverse?")) From 57c6f175b442988c2135dc250c39b4c7d8e726be Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Tue, 10 Jul 2018 23:30:55 +0800 Subject: [PATCH 2/8] [html-chart] num-columns return 0 for empty-table this commit fixes whereby data is '() indicating no columns --- gnucash/report/report-system/html-table.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gnucash/report/report-system/html-table.scm b/gnucash/report/report-system/html-table.scm index 41a615fe35..97615b64ac 100644 --- a/gnucash/report/report-system/html-table.scm +++ b/gnucash/report/report-system/html-table.scm @@ -326,7 +326,7 @@ (record-modifier 'num-rows)) (define (gnc:html-table-num-columns table) - (apply max (map length (gnc:html-table-data table)))) + (apply max (cons 0 (map length (gnc:html-table-data table))))) (define (gnc:html-table-append-row/markup! table markup newrow) (let ((rownum (gnc:html-table-append-row! table newrow))) From 694d0f06133826ecc036b026fbf0290455206b13 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Tue, 10 Jul 2018 23:31:36 +0800 Subject: [PATCH 3/8] [budget-flow] fix report-title not defined this report uses reportname instead --- gnucash/report/standard-reports/budget-flow.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gnucash/report/standard-reports/budget-flow.scm b/gnucash/report/standard-reports/budget-flow.scm index f7189686a1..d15b81e642 100644 --- a/gnucash/report/standard-reports/budget-flow.scm +++ b/gnucash/report/standard-reports/budget-flow.scm @@ -295,7 +295,7 @@ (gnc:html-document-add-object! doc (gnc:html-make-no-account-warning - report-title (gnc:report-id report-obj)))) + reportname (gnc:report-id report-obj)))) ((not budget-valid?) ;; No budget selected. From dfe1f34573fcae11b8447f4f2c83d5418d9eac53 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sun, 1 Jul 2018 14:12:39 +0800 Subject: [PATCH 4/8] [stress-test] stress test options! --- .../standard-reports/test/CMakeLists.txt | 1 + .../test/test-stress-options.scm | 230 +++++ .../test/test-stress-optionslist.scm | 972 ++++++++++++++++++ 3 files changed, 1203 insertions(+) create mode 100644 gnucash/report/standard-reports/test/test-stress-options.scm create mode 100644 gnucash/report/standard-reports/test/test-stress-optionslist.scm diff --git a/gnucash/report/standard-reports/test/CMakeLists.txt b/gnucash/report/standard-reports/test/CMakeLists.txt index 0eed77839e..ed2429164f 100644 --- a/gnucash/report/standard-reports/test/CMakeLists.txt +++ b/gnucash/report/standard-reports/test/CMakeLists.txt @@ -10,6 +10,7 @@ set(scm_test_with_srfi64_SOURCES test-charts.scm test-transaction.scm test-balance-sheet.scm + test-stress-options.scm test-income-gst.scm ) diff --git a/gnucash/report/standard-reports/test/test-stress-options.scm b/gnucash/report/standard-reports/test/test-stress-options.scm new file mode 100644 index 0000000000..92d6aaf8cc --- /dev/null +++ b/gnucash/report/standard-reports/test/test-stress-options.scm @@ -0,0 +1,230 @@ +(use-modules (gnucash utilities)) +(use-modules (gnucash gnc-module)) +(gnc:module-begin-syntax (gnc:module-load "gnucash/app-utils" 0)) +(use-modules (gnucash engine test test-extras)) +(use-modules (gnucash report standard-reports)) +(use-modules (gnucash report business-reports)) +(use-modules (gnucash report view-column)) +(use-modules (gnucash report stylesheets)) +(use-modules (gnucash report taxinvoice)) +(use-modules (gnucash report report-system)) +(use-modules (gnucash report report-system test test-extras)) +(use-modules (srfi srfi-64)) +(use-modules (gnucash engine test srfi64-extras)) +(use-modules (sxml simple)) +(use-modules (sxml xpath)) + +(load "test-stress-optionslist.scm") +;; The above optionslist was generated programmatically. It was +;; generated by running a sentinel function in the middle of an +;; existing report renderer. The sentinel function is defined as +;; follows, then was cleaned up using emacs' indenting. No other +;; processing was done. Only the multichoice and boolean options for +;; most reports were dumped. Although this cannot provide whole +;; coverage for option permutations, it can catch many errors while +;; refactoring inner functions. + +;; (define (mydump) +;; (with-output-to-file "test-stress-optionslist.scm" +;; (lambda () +;; (display "(define optionslist\n (list \n") +;; (gnc:report-templates-for-each +;; (lambda (report-id template) +;; (let* ((options-generator (gnc:report-template-options-generator template)) +;; (name (gnc:report-template-name template)) +;; (options (and (not (string=? name "General Journal")) +;; (options-generator)))) +;; (define (disp d) +;; (define (try proc) +;; (catch 'wrong-type-arg +;; (lambda () (proc d)) +;; (const #f))) +;; (or (and (symbol? d) (string-append "'" (symbol->string d))) +;; (and (list? d) (string-append "(list " (string-join (map disp d) " ") ")")) +;; (and (pair? d) (format #f "(cons ~a . ~a)" +;; (disp (car d)) +;; (disp (cdr d)))) +;; (try gnc-commodity-get-mnemonic) +;; (try xaccAccountGetName) +;; (try gnc-budget-get-name) +;; (format #f "~s" d))) +;; (format #t "(list (cons 'report-id ~s)\n (cons 'report-name ~s)\n (cons 'options\n (list\n" +;; report-id (gnc:report-template-name template)) +;; (if options +;; (gnc:options-for-each +;; (lambda (option) +;; (if (memq (gnc:option-type option) '(multichoice boolean)) +;; (format #t " (vector ~s ~s '~s '~s)\n" +;; (gnc:option-section option) +;; (gnc:option-name option) +;; (gnc:option-type option) +;; (case (gnc:option-type option) +;; ((multichoice) (map (lambda (d) (vector-ref d 0)) (gnc:option-data option))) +;; ((boolean) (list #t #f)) +;; ;; (else "\"\"") +;; (else (disp (gnc:option-value option))))))) +;; options) +;; ) +;; (display ")))\n")))) +;; (display "))\n")))) + + +;; Explicitly set locale to make the report output predictable +(setlocale LC_ALL "C") + +(define (run-test) + (test-runner-factory gnc:test-runner) + (test-begin "stress options") + (tests) + (test-end "stress options")) + +(define (set-option! options section name value) + (let ((option (gnc:lookup-option options section name))) + (if option + (gnc:option-set-value option value)))) + +(define (mnemonic->commodity sym) + (gnc-commodity-table-lookup + (gnc-commodity-table-get-table (gnc-get-current-book)) + (gnc-commodity-get-namespace (gnc-default-report-currency)) + sym)) + +(define structure + (list "Root" (list (cons 'type ACCT-TYPE-ASSET)) + (list "Asset" + (list "Bank") + (list "GBP Bank" (list (cons 'commodity (mnemonic->commodity "GBP")))) + (list "Wallet")) + (list "Income" (list (cons 'type ACCT-TYPE-INCOME))) + (list "Income-GBP" (list (cons 'type ACCT-TYPE-INCOME) + (cons 'commodity (mnemonic->commodity "GBP")))) + (list "Expenses" (list (cons 'type ACCT-TYPE-EXPENSE))) + (list "Liabilities" (list (cons 'type ACCT-TYPE-LIABILITY))) + (list "Equity" (list (cons 'type ACCT-TYPE-EQUITY))) + )) + +(define (test report-name uuid report-options) + (let ((options (gnc:make-report-options uuid))) + (test-assert (format #f "basic test ~a" report-name) + (gnc:options->render uuid options (string-append "stress-" report-name) "test")) + (format #t "Testing SIMPLE combinations for:\n~a" report-name) + (for-each + (lambda (option) + (format #t ",~a/~a" + (vector-ref option 0) + (vector-ref option 1))) + report-options) + (newline) + (for-each + (lambda (idx) + (display report-name) + (for-each + (lambda (option) + (let* ((section (vector-ref option 0)) + (name (vector-ref option 1)) + (value (list-ref (vector-ref option 3) + (modulo idx (length (vector-ref option 3)))))) + (set-option! options section name value) + (format #t ",~a" + (cond + ((boolean? value) (if value 't 'f)) + (else value))))) + report-options) + (catch #t + (lambda () + (gnc:options->render uuid options "stress-test" "test") + (display "[pass]\n")) + (lambda (k . args) + (format #t "[fail]... error: (~s . ~s) options-list are:\n~a" + k args + (gnc:html-render-options-changed options #t)) + (test-assert "logging test failure as above..." + #f)))) + (iota + (apply max + (map (lambda (opt) (length (vector-ref opt 3))) + report-options))) + ))) + +(define (tests) + (let* ((env (create-test-env)) + (account-alist (env-create-account-structure-alist env structure)) + (bank (cdr (assoc "Bank" account-alist))) + (gbp-bank (cdr (assoc "GBP Bank" account-alist))) + (wallet (cdr (assoc "Wallet" account-alist))) + (income (cdr (assoc "Income" account-alist))) + (gbp-income (cdr (assoc "Income-GBP" account-alist))) + (expense (cdr (assoc "Expenses" account-alist))) + (liability (cdr (assoc "Liabilities" account-alist))) + (equity (cdr (assoc "Equity" account-alist)))) + ;; populate datafile with old transactions + (env-transfer env 01 01 1970 bank expense 5 #:description "desc-1" #:num "trn1" #:memo "memo-3") + (env-transfer env 31 12 1969 income bank 10 #:description "desc-2" #:num "trn2" #:void-reason "void" #:notes "notes3") + (env-transfer env 31 12 1969 income bank 29 #:description "desc-3" #:num "trn3" + #:reconcile (cons #\c (gnc-dmy2time64 01 03 1970))) + (env-transfer env 01 02 1970 bank expense 15 #:description "desc-4" #:num "trn4" #:notes "notes2" #:memo "memo-1") + (env-transfer env 10 01 1970 liability expense 10 #:description "desc-5" #:num "trn5" #:void-reason "any") + (env-transfer env 10 01 1970 liability expense 11 #:description "desc-6" #:num "trn6" #:notes "notes1") + (env-transfer env 10 02 1970 bank liability 8 #:description "desc-7" #:num "trn7" #:notes "notes1" #:memo "memo-2" + #:reconcile (cons #\y (gnc-dmy2time64 01 03 1970))) + (let ((txn (xaccMallocTransaction (gnc-get-current-book))) + (split-1 (xaccMallocSplit (gnc-get-current-book))) + (split-2 (xaccMallocSplit (gnc-get-current-book))) + (split-3 (xaccMallocSplit (gnc-get-current-book)))) + (xaccTransBeginEdit txn) + (xaccTransSetDescription txn "$100bank -> $80expenses + $20wallet") + (xaccTransSetCurrency txn (xaccAccountGetCommodity bank)) + (xaccTransSetDate txn 14 02 1971) + (xaccSplitSetParent split-1 txn) + (xaccSplitSetParent split-2 txn) + (xaccSplitSetParent split-3 txn) + (xaccSplitSetAccount split-1 bank) + (xaccSplitSetAccount split-2 expense) + (xaccSplitSetAccount split-3 wallet) + (xaccSplitSetValue split-1 -100) + (xaccSplitSetValue split-2 80) + (xaccSplitSetValue split-3 20) + (xaccSplitSetAmount split-1 -100) + (xaccSplitSetAmount split-2 80) + (xaccSplitSetAmount split-3 20) + (xaccTransSetNotes txn "multisplit") + (xaccTransCommitEdit txn)) + (let ((closing-txn (env-transfer env 31 12 1977 expense equity 111 #:description "Closing"))) + (xaccTransSetIsClosingTxn closing-txn #t)) + (env-transfer-foreign env 15 01 2000 gbp-bank bank 10 14 #:description "GBP 10 to USD 14") + (env-transfer-foreign env 15 02 2000 bank gbp-bank 9 6 #:description "USD 9 to GBP 6") + (for-each (lambda (m) + (env-transfer env 08 (1+ m) 1978 gbp-income gbp-bank 51 #:description "#51 income") + (env-transfer env 03 (1+ m) 1978 income bank 103 #:description "$103 income") + (env-transfer env 15 (1+ m) 1978 bank expense 22 #:description "$22 expense") + (env-transfer env 09 (1+ m) 1978 income bank 109 #:description "$109 income")) + (iota 12)) + (let ((mid (floor (/ (+ (gnc-accounting-period-fiscal-start) + (gnc-accounting-period-fiscal-end)) 2)))) + (env-create-transaction env mid bank income 200)) + + (for-each + (lambda (option-set) + (let ((report-name (assq-ref option-set 'report-name)) + (report-guid (assq-ref option-set 'report-id)) + (report-options (assq-ref option-set 'options))) + (if (member report-name + ;; these reports seem to cause problems when running... + '("Income Statement" + "Tax Invoice" + "Net Worth Linechart" + "Tax Schedule Report/TXF Export" + "Receipt" + "Future Scheduled Transactions Summary" + "Welcome to GnuCash" + "Hello, World" + "Budget Income Statement" + "Multicolumn View" + "General Journal" + "Australian Tax Invoice" + "Balance Sheet (eguile)" + "networth" + )) + (format #t "Skipping ~a...\n" report-name) + (test report-name report-guid report-options)))) + optionslist))) diff --git a/gnucash/report/standard-reports/test/test-stress-optionslist.scm b/gnucash/report/standard-reports/test/test-stress-optionslist.scm new file mode 100644 index 0000000000..b9c02209e0 --- /dev/null +++ b/gnucash/report/standard-reports/test/test-stress-optionslist.scm @@ -0,0 +1,972 @@ +(define optionslist + (list + (list (cons 'report-id "e9cf815f79db44bcb637d0295093ae3d") + (cons 'report-name "Assets Over Time") + (cons 'options + (list + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Chart Type" 'multichoice '(barchart linechart)) + (vector "Display" "Use Stacked Charts" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show long account names" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "e45218c6d76f11e7b5ef0800277ef320") + (cons 'report-name "Reconciliation Report") + (cons 'options + (list + (vector "Accounts" "Filter Type" 'multichoice '(none include exclude)) + (vector "Display" "Sign Reverses" 'multichoice '(global none income-expense credit-accounts)) + (vector "Display" "Description" 'boolean '(#t #f)) + (vector "Display" "Amount" 'multichoice '(none single double)) + (vector "Display" "Num" 'boolean '(#t #f)) + (vector "Display" "Shares" 'boolean '(#t #f)) + (vector "Display" "Use Full Account Name" 'boolean '(#t #f)) + (vector "Display" "Use Full Other Account Name" 'boolean '(#t #f)) + (vector "Display" "Detail Level" 'multichoice '(multi-line single)) + (vector "Display" "Account Code" 'boolean '(#t #f)) + (vector "Display" "Memo" 'boolean '(#t #f)) + (vector "Display" "Totals" 'boolean '(#t #f)) + (vector "Display" "Account Name" 'boolean '(#t #f)) + (vector "Display" "Other Account Name" 'boolean '(#t #f)) + (vector "Display" "Price" 'boolean '(#t #f)) + (vector "Display" "Other Account Code" 'boolean '(#t #f)) + (vector "Display" "Reconciled Date" 'boolean '(#t #f)) + (vector "Display" "Subtotal Table" 'boolean '(#t #f)) + (vector "Display" "Notes" 'boolean '(#t #f)) + (vector "Display" "Date" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Sort Order" 'multichoice '(ascend descend)) + (vector "Sorting" "Show Full Account Name" 'boolean '(#t #f)) + (vector "Sorting" "Show Account Code" 'boolean '(#t #f)) + (vector "Sorting" "Show Account Description" 'boolean '(#t #f)) + (vector "Sorting" "Primary Subtotal for Date Key" 'multichoice '(none daily weekly monthly quarterly yearly)) + (vector "Sorting" "Secondary Key" 'multichoice '(account-name account-code date reconciled-date reconciled-status register-order corresponding-acc-name corresponding-acc-code amount description number t-number memo notes none)) + (vector "Sorting" "Add indenting columns" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Subtotal" 'boolean '(#t #f)) + (vector "Sorting" "Primary Subtotal" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Subtotal for Date Key" 'multichoice '(none daily weekly monthly quarterly yearly)) + (vector "Sorting" "Primary Key" 'multichoice '(account-name account-code date reconciled-date reconciled-status register-order corresponding-acc-name corresponding-acc-code amount description number t-number memo notes none)) + (vector "Sorting" "Show Informal Debit/Credit Headers" 'boolean '(#t #f)) + (vector "Sorting" "Primary Sort Order" 'multichoice '(ascend descend)) + (vector "Sorting" "Show subtotals only (hide transactional data)" 'boolean '(#t #f)) + (vector "Filter" "Closing transactions" 'multichoice '(exclude-closing include-both closing-only)) + (vector "Filter" "Void Transactions" 'multichoice '(non-void-only void-only both)) + (vector "Filter" "Use regular expressions for transaction filter" 'boolean '(#t #f)) + (vector "Filter" "Use regular expressions for account name filter" 'boolean '(#t #f)) + (vector "Filter" "Reconcile Status" 'multichoice '(all unreconciled cleared reconciled)) + (vector "General" "Show original currency amount" 'boolean '(#t #f)) + (vector "General" "Table for Exporting" 'boolean '(#t #f)) + (vector "General" "Add options summary" 'multichoice '(no-match always never)) + (vector "General" "Common Currency" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "583c313fcc484efc974c4c844404f454") + (cons 'report-name "Budget Income Statement") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Flatten list to depth limit" 'boolean '(#t #f)) + (vector "Display" "Display as a two column report" 'boolean '(#t #f)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Display" "Parent account balances" 'multichoice '(immediate-bal recursive-bal omit-bal)) + (vector "Display" "Display in standard, income first, order" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Label the revenue section" 'boolean '(#t #f)) + (vector "Display" "Parent account subtotals" 'multichoice '(t f canonically-tabbed)) + (vector "Display" "Include expense total" 'boolean '(#t #f)) + (vector "Display" "Omit zero balance figures" 'boolean '(#t #f)) + (vector "Display" "Include revenue total" 'boolean '(#t #f)) + (vector "Display" "Label the expense section" 'boolean '(#t #f)) + (vector "General" "Report for range of budget periods" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "4166a20981985fd2b07ff8cb3b7d384e") + (cons 'report-name "Customer Summary") + (cons 'options + (list + (vector "Display" "Sort Order" 'multichoice '(ascend descend)) + (vector "Display" "Show Inactive Customers" 'boolean '(#t #f)) + (vector "Display" "Show Lines with All Zeros" 'boolean '(#t #f)) + (vector "Display" "Show Expense Column" 'boolean '(#t #f)) + (vector "Display" "Sort Column" 'multichoice '(customername profit markup sales expense)) + (vector "Display" "Show Company Address" 'boolean '(#t #f)) + (vector "__reg" "reverse?" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "d8ba4a2e89e8479ca9f6eccdeb164588") + (cons 'report-name "Multicolumn View") + (cons 'options + (list + ))) + (list (cons 'report-id "216cd0cf6931453ebcce85415aba7082") + (cons 'report-name "Trial Balance") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Entries" "Adjusting Entries Pattern is regular expression" 'boolean '(#t #f)) + (vector "Entries" "Closing Entries pattern is case-sensitive" 'boolean '(#t #f)) + (vector "Entries" "Adjusting Entries pattern is case-sensitive" 'boolean '(#t #f)) + (vector "Entries" "Closing Entries Pattern is regular expression" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "General" "Report variation" 'multichoice '(current pre-adj work-sheet)) + ))) + (list (cons 'report-id "47f45d7d6d57b68518481c1fc8d4e4ba") + (cons 'report-name "Future Scheduled Transactions Summary") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Depth limit behavior" 'multichoice '(summarize flatten truncate)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Display" "Parent account balances" 'multichoice '(immediate-bal recursive-bal omit-bal)) + (vector "Display" "Account Description" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Parent account subtotals" 'multichoice '(t f canonically-tabbed)) + (vector "Display" "Account Code" 'boolean '(#t #f)) + (vector "Display" "Omit zero balance figures" 'boolean '(#t #f)) + (vector "Display" "Account Notes" 'boolean '(#t #f)) + (vector "Display" "Account Type" 'boolean '(#t #f)) + (vector "Display" "Account Balance" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "c2a996c8970f43448654ca84f17dda24") + (cons 'report-name "Equity Statement") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Entries" "Closing Entries pattern is case-sensitive" 'boolean '(#t #f)) + (vector "Entries" "Closing Entries Pattern is regular expression" 'boolean '(#t #f)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "3dbbc2584da64e7a8674355bc3fbfe3d") + (cons 'report-name "Australian Tax Invoice") + (cons 'options + (list + (vector "Display" "table-border-collapse" 'boolean '(#t #f)) + (vector "Elements" "Show net price" 'boolean '(#t #f)) + (vector "Elements" "column: Units" 'boolean '(#t #f)) + (vector "Elements" "Show Job number" 'boolean '(#t #f)) + (vector "Elements" "row: Address" 'boolean '(#t #f)) + (vector "Elements" "column: Date" 'boolean '(#t #f)) + (vector "Elements" "column: Tax Rate" 'boolean '(#t #f)) + (vector "Elements" "Invoice number next to title" 'boolean '(#t #f)) + (vector "Elements" "row: Company Name" 'boolean '(#t #f)) + (vector "Elements" "row: Invoice Number" 'boolean '(#t #f)) + (vector "Elements" "Show Job name" 'boolean '(#t #f)) + (vector "Elements" "row: Contact" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "2e3751edeb7544e8a20fd19e9d08bb65") + (cons 'report-name "Balance Sheet (eguile)") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Flatten list to depth limit" 'boolean '(#t #f)) + (vector "Accounts" "Exclude accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Negative amount format" 'multichoice '(negsign negbrackets)) + (vector "Display" "1- or 2-column report" 'multichoice '(autocols onecol twocols)) + ))) + (list (cons 'report-id "e9418ff64f2c11e5b61d1c7508d793ed") + (cons 'report-name "Securities") + (cons 'options + (list + (vector "Display" "Show Totals" 'boolean '(#t #f)) + (vector "Display" "Show long names" 'boolean '(#t #f)) + (vector "Display" "Show Percents" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + (list (cons 'report-id "e1bd09b8a1dd49dd85760db9d82b045c") + (cons 'report-name "Income Accounts") + (cons 'options + (list + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Show Totals" 'boolean '(#t #f)) + (vector "Display" "Show long names" 'boolean '(#t #f)) + (vector "Display" "Show Percents" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "General" "Show Average" 'multichoice '(None YearDelta MonthDelta WeekDelta)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + (list (cons 'report-id "2e22929e5c5b4b769f615a815ef0c20f") + (cons 'report-name "General Ledger") + (cons 'options + (list + (vector "Accounts" "Filter Type" 'multichoice '(none include exclude)) + (vector "Display" "Sign Reverses" 'multichoice '(global none income-expense credit-accounts)) + (vector "Display" "Description" 'boolean '(#t #f)) + (vector "Display" "Amount" 'multichoice '(none single double)) + (vector "Display" "Num" 'boolean '(#t #f)) + (vector "Display" "Running Balance" 'boolean '(#t #f)) + (vector "Display" "Shares" 'boolean '(#t #f)) + (vector "Display" "Use Full Account Name" 'boolean '(#t #f)) + (vector "Display" "Use Full Other Account Name" 'boolean '(#t #f)) + (vector "Display" "Detail Level" 'multichoice '(multi-line single)) + (vector "Display" "Account Code" 'boolean '(#t #f)) + (vector "Display" "Memo" 'boolean '(#t #f)) + (vector "Display" "Totals" 'boolean '(#t #f)) + (vector "Display" "Account Name" 'boolean '(#t #f)) + (vector "Display" "Other Account Name" 'boolean '(#t #f)) + (vector "Display" "Price" 'boolean '(#t #f)) + (vector "Display" "Other Account Code" 'boolean '(#t #f)) + (vector "Display" "Reconciled Date" 'boolean '(#t #f)) + (vector "Display" "Subtotal Table" 'boolean '(#t #f)) + (vector "Display" "Notes" 'boolean '(#t #f)) + (vector "Display" "Date" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Sort Order" 'multichoice '(ascend descend)) + (vector "Sorting" "Show Full Account Name" 'boolean '(#t #f)) + (vector "Sorting" "Show Account Code" 'boolean '(#t #f)) + (vector "Sorting" "Show Account Description" 'boolean '(#t #f)) + (vector "Sorting" "Primary Subtotal for Date Key" 'multichoice '(none daily weekly monthly quarterly yearly)) + (vector "Sorting" "Secondary Key" 'multichoice '(account-name account-code date reconciled-date reconciled-status register-order corresponding-acc-name corresponding-acc-code amount description number t-number memo notes none)) + (vector "Sorting" "Add indenting columns" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Subtotal" 'boolean '(#t #f)) + (vector "Sorting" "Primary Subtotal" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Subtotal for Date Key" 'multichoice '(none daily weekly monthly quarterly yearly)) + (vector "Sorting" "Primary Key" 'multichoice '(account-name account-code date reconciled-date reconciled-status register-order corresponding-acc-name corresponding-acc-code amount description number t-number memo notes none)) + (vector "Sorting" "Show Informal Debit/Credit Headers" 'boolean '(#t #f)) + (vector "Sorting" "Primary Sort Order" 'multichoice '(ascend descend)) + (vector "Sorting" "Show subtotals only (hide transactional data)" 'boolean '(#t #f)) + (vector "Filter" "Closing transactions" 'multichoice '(exclude-closing include-both closing-only)) + (vector "Filter" "Void Transactions" 'multichoice '(non-void-only void-only both)) + (vector "Filter" "Use regular expressions for transaction filter" 'boolean '(#t #f)) + (vector "Filter" "Use regular expressions for account name filter" 'boolean '(#t #f)) + (vector "Filter" "Reconcile Status" 'multichoice '(all unreconciled cleared reconciled)) + (vector "General" "Stylesheet" 'multichoice '(Default Easy Footer #{Head or Tail}# Technicolor)) + (vector "General" "Show original currency amount" 'boolean '(#t #f)) + (vector "General" "Table for Exporting" 'boolean '(#t #f)) + (vector "General" "Add options summary" 'multichoice '(no-match always never)) + (vector "General" "Common Currency" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "9cf76bed17f14401b8e3e22d0079cb98") + (cons 'report-name "Receivable Aging") + (cons 'options + (list + (vector "Display" "Address Name" 'boolean '(#t #f)) + (vector "Display" "Address 1" 'boolean '(#t #f)) + (vector "Display" "Active" 'boolean '(#t #f)) + (vector "Display" "Address 2" 'boolean '(#t #f)) + (vector "Display" "Address 3" 'boolean '(#t #f)) + (vector "Display" "Address Source" 'multichoice '(billing shipping)) + (vector "Display" "Address Email" 'boolean '(#t #f)) + (vector "Display" "Address Phone" 'boolean '(#t #f)) + (vector "Display" "Address 4" 'boolean '(#t #f)) + (vector "Display" "Address Fax" 'boolean '(#t #f)) + (vector "General" "Sort By" 'multichoice '(name total oldest-bracket)) + (vector "General" "Show zero balance items" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Sort Order" 'multichoice '(increasing decreasing)) + (vector "General" "Due or Post Date" 'multichoice '(duedate postdate)) + (vector "General" "Show Multi-currency Totals" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "3ce293441e894423a2425d7a22dd1ac6") + (cons 'report-name "Fancy Invoice") + (cons 'options + (list + (vector "Display" "Payable to" 'boolean '(#t #f)) + (vector "Display" "Individual Taxes" 'boolean '(#t #f)) + (vector "Display" "Billing Terms" 'boolean '(#t #f)) + (vector "Display" "References" 'boolean '(#t #f)) + (vector "Display" "Totals" 'boolean '(#t #f)) + (vector "Display" "Invoice Notes" 'boolean '(#t #f)) + (vector "Display" "Billing ID" 'boolean '(#t #f)) + (vector "Display" "Payments" 'boolean '(#t #f)) + (vector "Display" "Company contact" 'boolean '(#t #f)) + (vector "Display Columns" "Tax Amount" 'boolean '(#t #f)) + (vector "Display Columns" "Description" 'boolean '(#t #f)) + (vector "Display Columns" "Discount" 'boolean '(#t #f)) + (vector "Display Columns" "Total" 'boolean '(#t #f)) + (vector "Display Columns" "Action" 'boolean '(#t #f)) + (vector "Display Columns" "Taxable" 'boolean '(#t #f)) + (vector "Display Columns" "Quantity" 'boolean '(#t #f)) + (vector "Display Columns" "Price" 'boolean '(#t #f)) + (vector "Display Columns" "Date" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "08ae9c2e884b4f9787144f47eacd7f44") + (cons 'report-name "Employee Report") + (cons 'options + (list + (vector "Display Columns" "Tax" 'boolean '(#t #f)) + (vector "Display Columns" "Description" 'boolean '(#t #f)) + (vector "Display Columns" "Amount" 'boolean '(#t #f)) + (vector "Display Columns" "Debits" 'boolean '(#t #f)) + (vector "Display Columns" "Type" 'boolean '(#t #f)) + (vector "Display Columns" "Due Date" 'boolean '(#t #f)) + (vector "Display Columns" "Sale" 'boolean '(#t #f)) + (vector "Display Columns" "Reference" 'boolean '(#t #f)) + (vector "Display Columns" "Credits" 'boolean '(#t #f)) + (vector "Display Columns" "Date" 'boolean '(#t #f)) + (vector "General" "Due or Post Date" 'multichoice '(duedate postdate)) + (vector "__reg" "reverse?" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "8758ba23984c40dea5527f5f0ca2779e") + (cons 'report-name "Profit & Loss") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Flatten list to depth limit" 'boolean '(#t #f)) + (vector "Entries" "Closing Entries pattern is case-sensitive" 'boolean '(#t #f)) + (vector "Entries" "Closing Entries Pattern is regular expression" 'boolean '(#t #f)) + (vector "Display" "Display as a two column report" 'boolean '(#t #f)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Display" "Parent account balances" 'multichoice '(immediate-bal recursive-bal omit-bal)) + (vector "Display" "Display in standard, income first, order" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Label the revenue section" 'boolean '(#t #f)) + (vector "Display" "Parent account subtotals" 'multichoice '(t f canonically-tabbed)) + (vector "Display" "Include expense total" 'boolean '(#t #f)) + (vector "Display" "Include trading accounts total" 'boolean '(#t #f)) + (vector "Display" "Omit zero balance figures" 'boolean '(#t #f)) + (vector "Display" "Include revenue total" 'boolean '(#t #f)) + (vector "Display" "Label the expense section" 'boolean '(#t #f)) + (vector "Display" "Label the trading accounts section" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "c4173ac99b2b448289bf4d11c731af13") + (cons 'report-name "Balance Sheet") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Flatten list to depth limit" 'boolean '(#t #f)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Display" "Parent account balances" 'multichoice '(immediate-bal recursive-bal omit-bal)) + (vector "Display" "Include assets total" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Parent account subtotals" 'multichoice '(t f canonically-tabbed)) + (vector "Display" "Include liabilities total" 'boolean '(#t #f)) + (vector "Display" "Label the liabilities section" 'boolean '(#t #f)) + (vector "Display" "Omit zero balance figures" 'boolean '(#t #f)) + (vector "Display" "Label the assets section" 'boolean '(#t #f)) + (vector "Display" "Include equity total" 'boolean '(#t #f)) + (vector "Display" "Label the equity section" 'boolean '(#t #f)) + (vector "General" "Single column Balance Sheet" 'boolean '(#t #f)) + (vector "General" "Use standard US layout" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "c146317be32e4948a561ec7fc89d15c1") + (cons 'report-name "Customer Report") + (cons 'options + (list + (vector "Display Columns" "Tax" 'boolean '(#t #f)) + (vector "Display Columns" "Description" 'boolean '(#t #f)) + (vector "Display Columns" "Amount" 'boolean '(#t #f)) + (vector "Display Columns" "Debits" 'boolean '(#t #f)) + (vector "Display Columns" "Type" 'boolean '(#t #f)) + (vector "Display Columns" "Due Date" 'boolean '(#t #f)) + (vector "Display Columns" "Sale" 'boolean '(#t #f)) + (vector "Display Columns" "Reference" 'boolean '(#t #f)) + (vector "Display Columns" "Credits" 'boolean '(#t #f)) + (vector "Display Columns" "Date" 'boolean '(#t #f)) + (vector "General" "Due or Post Date" 'multichoice '(duedate postdate)) + (vector "__reg" "reverse?" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "2fe3b9833af044abb929a88d5a59620f") + (cons 'report-name "Transaction Report") + (cons 'options + (list + (vector "Accounts" "Filter Type" 'multichoice '(none include exclude)) + (vector "Display" "Sign Reverses" 'multichoice '(global none income-expense credit-accounts)) + (vector "Display" "Description" 'boolean '(#t #f)) + (vector "Display" "Amount" 'multichoice '(none single double)) + (vector "Display" "Num" 'boolean '(#t #f)) + (vector "Display" "Running Balance" 'boolean '(#t #f)) + (vector "Display" "Shares" 'boolean '(#t #f)) + (vector "Display" "Use Full Account Name" 'boolean '(#t #f)) + (vector "Display" "Use Full Other Account Name" 'boolean '(#t #f)) + (vector "Display" "Detail Level" 'multichoice '(multi-line single)) + (vector "Display" "Account Code" 'boolean '(#t #f)) + (vector "Display" "Memo" 'boolean '(#t #f)) + (vector "Display" "Totals" 'boolean '(#t #f)) + (vector "Display" "Account Name" 'boolean '(#t #f)) + (vector "Display" "Other Account Name" 'boolean '(#t #f)) + (vector "Display" "Price" 'boolean '(#t #f)) + (vector "Display" "Other Account Code" 'boolean '(#t #f)) + (vector "Display" "Reconciled Date" 'boolean '(#t #f)) + (vector "Display" "Subtotal Table" 'boolean '(#t #f)) + (vector "Display" "Notes" 'boolean '(#t #f)) + (vector "Display" "Date" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Sort Order" 'multichoice '(ascend descend)) + (vector "Sorting" "Show Full Account Name" 'boolean '(#t #f)) + (vector "Sorting" "Show Account Code" 'boolean '(#t #f)) + (vector "Sorting" "Show Account Description" 'boolean '(#t #f)) + (vector "Sorting" "Primary Subtotal for Date Key" 'multichoice '(none daily weekly monthly quarterly yearly)) + (vector "Sorting" "Secondary Key" 'multichoice '(account-name account-code date reconciled-date reconciled-status register-order corresponding-acc-name corresponding-acc-code amount description number t-number memo notes none)) + (vector "Sorting" "Add indenting columns" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Subtotal" 'boolean '(#t #f)) + (vector "Sorting" "Primary Subtotal" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Subtotal for Date Key" 'multichoice '(none daily weekly monthly quarterly yearly)) + (vector "Sorting" "Primary Key" 'multichoice '(account-name account-code date reconciled-date reconciled-status register-order corresponding-acc-name corresponding-acc-code amount description number t-number memo notes none)) + (vector "Sorting" "Show Informal Debit/Credit Headers" 'boolean '(#t #f)) + (vector "Sorting" "Primary Sort Order" 'multichoice '(ascend descend)) + (vector "Sorting" "Show subtotals only (hide transactional data)" 'boolean '(#t #f)) + (vector "Filter" "Closing transactions" 'multichoice '(exclude-closing include-both closing-only)) + (vector "Filter" "Void Transactions" 'multichoice '(non-void-only void-only both)) + (vector "Filter" "Use regular expressions for transaction filter" 'boolean '(#t #f)) + (vector "Filter" "Use regular expressions for account name filter" 'boolean '(#t #f)) + (vector "Filter" "Reconcile Status" 'multichoice '(all unreconciled cleared reconciled)) + (vector "General" "Show original currency amount" 'boolean '(#t #f)) + (vector "General" "Table for Exporting" 'boolean '(#t #f)) + (vector "General" "Add options summary" 'multichoice '(no-match always never)) + (vector "General" "Common Currency" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "e57770f2dbca46619d6dac4ac5469b50") + (cons 'report-name "Payable Aging") + (cons 'options + (list + (vector "Display" "Address Name" 'boolean '(#t #f)) + (vector "Display" "Address 1" 'boolean '(#t #f)) + (vector "Display" "Active" 'boolean '(#t #f)) + (vector "Display" "Address 2" 'boolean '(#t #f)) + (vector "Display" "Address 3" 'boolean '(#t #f)) + (vector "Display" "Address Email" 'boolean '(#t #f)) + (vector "Display" "Address Phone" 'boolean '(#t #f)) + (vector "Display" "Address 4" 'boolean '(#t #f)) + (vector "Display" "Address Fax" 'boolean '(#t #f)) + (vector "General" "Sort By" 'multichoice '(name total oldest-bracket)) + (vector "General" "Show zero balance items" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Sort Order" 'multichoice '(increasing decreasing)) + (vector "General" "Due or Post Date" 'multichoice '(duedate postdate)) + (vector "General" "Show Multi-currency Totals" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "5426e4d987f6444387fe70880e5b28a0") + (cons 'report-name "Cash Flow Barchart") + (cons 'options + (list + (vector "Accounts" "Include Trading Accounts in report" 'boolean '(#t #f)) + (vector "Display" "Show Table" 'boolean '(#t #f)) + (vector "Display" "Show Money In" 'boolean '(#t #f)) + (vector "Display" "Show Money Out" 'boolean '(#t #f)) + (vector "Display" "Show Net Flow" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "0769e242be474010b4acf264a5512e6e") + (cons 'report-name "Tax Invoice") + (cons 'options + (list + (vector "Display" "table-border-collapse" 'boolean '(#t #f)) + (vector "Elements" "Show net price" 'boolean '(#t #f)) + (vector "Elements" "column: Units" 'boolean '(#t #f)) + (vector "Elements" "Show Job number" 'boolean '(#t #f)) + (vector "Elements" "row: Address" 'boolean '(#t #f)) + (vector "Elements" "column: Date" 'boolean '(#t #f)) + (vector "Elements" "column: Tax Rate" 'boolean '(#t #f)) + (vector "Elements" "Invoice number next to title" 'boolean '(#t #f)) + (vector "Elements" "row: Company Name" 'boolean '(#t #f)) + (vector "Elements" "row: Invoice Number" 'boolean '(#t #f)) + (vector "Elements" "Show Job name" 'boolean '(#t #f)) + (vector "Elements" "row: Contact" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "dde49fed4ca940959ae7d01b72742530") + (cons 'report-name "Expenses vs. Day of Week") + (cons 'options + (list + (vector "Accounts" "Include Sub-Accounts" 'boolean '(#t #f)) + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Show Totals" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + (list (cons 'report-id "d5adcc61c62e4b8684dd8907448d7900") + (cons 'report-name "Average Balance") + (cons 'options + (list + (vector "Accounts" "Include Sub-Accounts" 'boolean '(#t #f)) + (vector "Accounts" "Exclude transactions between selected accounts" 'boolean '(#t #f)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show plot" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "25455562bd234dd0b048ecc5a8af9e43") + (cons 'report-name "General Journal") + (cons 'options + (list + ))) + (list (cons 'report-id "67112f318bef4fc496bdc27d106bbda4") + (cons 'report-name "Easy Invoice") + (cons 'options + (list + (vector "Display" "My Company" 'boolean '(#t #f)) + (vector "Display" "Subtotal" 'boolean '(#t #f)) + (vector "Display" "Individual Taxes" 'boolean '(#t #f)) + (vector "Display" "Billing Terms" 'boolean '(#t #f)) + (vector "Display" "Due Date" 'boolean '(#t #f)) + (vector "Display" "References" 'boolean '(#t #f)) + (vector "Display" "Totals" 'boolean '(#t #f)) + (vector "Display" "My Company ID" 'boolean '(#t #f)) + (vector "Display" "Invoice Notes" 'boolean '(#t #f)) + (vector "Display" "Billing ID" 'boolean '(#t #f)) + (vector "Display" "Payments" 'boolean '(#t #f)) + (vector "Display Columns" "Tax Amount" 'boolean '(#t #f)) + (vector "Display Columns" "Description" 'boolean '(#t #f)) + (vector "Display Columns" "Discount" 'boolean '(#t #f)) + (vector "Display Columns" "Total" 'boolean '(#t #f)) + (vector "Display Columns" "Charge Type" 'boolean '(#t #f)) + (vector "Display Columns" "Taxable" 'boolean '(#t #f)) + (vector "Display Columns" "Quantity" 'boolean '(#t #f)) + (vector "Display Columns" "Price" 'boolean '(#t #f)) + (vector "Display Columns" "Date" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "3298541c236b494998b236dfad6ad752") + (cons 'report-name "Account Summary") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Depth limit behavior" 'multichoice '(summarize flatten truncate)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Display" "Parent account balances" 'multichoice '(immediate-bal recursive-bal omit-bal)) + (vector "Display" "Account Description" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Parent account subtotals" 'multichoice '(t f canonically-tabbed)) + (vector "Display" "Account Code" 'boolean '(#t #f)) + (vector "Display" "Omit zero balance figures" 'boolean '(#t #f)) + (vector "Display" "Account Notes" 'boolean '(#t #f)) + (vector "Display" "Account Type" 'boolean '(#t #f)) + (vector "Display" "Account Balance" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "80769921e87943adade887b9835a7685") + (cons 'report-name "Income/Expense Chart") + (cons 'options + (list + (vector "Display" "Show Income/Expense" 'boolean '(#t #f)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show Net Profit" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "f8921f4e5c284d7caca81e239f468a68") + (cons 'report-name "Tax Schedule Report/TXF Export") + (cons 'options + (list + (vector "Display" "Do not print transaction detail" 'boolean '(#t #f)) + (vector "Display" "Do not print Action:Memo data" 'boolean '(#t #f)) + (vector "Display" "Currency conversion date" 'multichoice '(conv-to-tran-date conv-to-report-date)) + (vector "Display" "Print TXF export parameters" 'boolean '(#t #f)) + (vector "Display" "Print all Transfer To/From Accounts" 'boolean '(#t #f)) + (vector "Display" "Suppress $0.00 values" 'boolean '(#t #f)) + (vector "Display" "Do not use special date processing" 'boolean '(#t #f)) + (vector "Display" "Do not print full account names" 'boolean '(#t #f)) + (vector "General" "Alternate Period" 'multichoice '(from-to #{1st-est}# #{2nd-est}# #{3rd-est}# #{4th-est}# last-year #{1st-last}# #{2nd-last}# #{3rd-last}# #{4th-last}#)) + ))) + (list (cons 'report-id "810ed4b25ef0486ea43bbd3dddb32b11") + (cons 'report-name "Budget Report") + (cons 'options + (list + (vector "Accounts" "Always show sub-accounts" 'boolean '(#t #f)) + (vector "Accounts" "Flatten list to depth limit" 'boolean '(#t #f)) + (vector "Accounts" "Account Display Depth" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Show Actual" 'boolean '(#t #f)) + (vector "Display" "Show Budget" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances and budget values" 'boolean '(#t #f)) + (vector "Display" "Roll up budget amounts to parent" 'boolean '(#t #f)) + (vector "Display" "Show Column with Totals" 'boolean '(#t #f)) + (vector "Display" "Show Difference" 'boolean '(#t #f)) + (vector "General" "Report for range of budget periods" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Range end" 'multichoice '(first previous current next last manual)) + (vector "General" "Include collapsed periods before selected." 'boolean '(#t #f)) + (vector "General" "Range start" 'multichoice '(first previous current next last manual)) + (vector "General" "Include collapsed periods after selected." 'boolean '(#t #f)) + (vector "General" "Show Full Account Names" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "cbba1696c8c24744848062c7f1cf4a72") + (cons 'report-name "Net Worth Barchart") + (cons 'options + (list + (vector "Display" "Show Asset & Liability" 'boolean '(#t #f)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show Net Worth" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "4a6b82e8678c4f3d9e85d9f09634ca89") + (cons 'report-name "Investment Portfolio") + (cons 'options + (list + (vector "Accounts" "Include accounts with no shares" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + (list (cons 'report-id "44f81bee049b4b3ea908f8dac9a9474e") + (cons 'report-name "Income Over Time") + (cons 'options + (list + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Chart Type" 'multichoice '(barchart linechart)) + (vector "Display" "Use Stacked Charts" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show long account names" 'boolean '(#t #f)) + (vector "General" "Show Average" 'multichoice '(None MonthDelta WeekDelta DayDelta)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "5bf27f249a0d11e7abc4cec278b6b50a") + (cons 'report-name "Income and GST Statement") + (cons 'options + (list + (vector "Display" "Description" 'boolean '(#t #f)) + (vector "Display" "Num" 'boolean '(#t #f)) + (vector "Display" "Tax payable" 'boolean '(#t #f)) + (vector "Display" "Individual income columns" 'boolean '(#t #f)) + (vector "Display" "Use Full Account Name" 'boolean '(#t #f)) + (vector "Display" "Net Income" 'boolean '(#t #f)) + (vector "Display" "Use Full Other Account Name" 'boolean '(#t #f)) + (vector "Display" "Individual expense columns" 'boolean '(#t #f)) + (vector "Display" "Account Code" 'boolean '(#t #f)) + (vector "Display" "Individual tax columns" 'boolean '(#t #f)) + (vector "Display" "Remittance amount" 'boolean '(#t #f)) + (vector "Display" "Memo" 'boolean '(#t #f)) + (vector "Display" "Totals" 'boolean '(#t #f)) + (vector "Display" "Account Name" 'boolean '(#t #f)) + (vector "Display" "Other Account Name" 'boolean '(#t #f)) + (vector "Display" "Other Account Code" 'boolean '(#t #f)) + (vector "Display" "Reconciled Date" 'boolean '(#t #f)) + (vector "Display" "Subtotal Table" 'boolean '(#t #f)) + (vector "Display" "Notes" 'boolean '(#t #f)) + (vector "Display" "Date" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Sort Order" 'multichoice '(ascend descend)) + (vector "Sorting" "Show Full Account Name" 'boolean '(#t #f)) + (vector "Sorting" "Show Account Code" 'boolean '(#t #f)) + (vector "Sorting" "Show Account Description" 'boolean '(#t #f)) + (vector "Sorting" "Primary Subtotal for Date Key" 'multichoice '(none daily weekly monthly quarterly yearly)) + (vector "Sorting" "Secondary Key" 'multichoice '(account-name account-code date reconciled-date reconciled-status register-order corresponding-acc-name corresponding-acc-code amount description number t-number memo notes none)) + (vector "Sorting" "Add indenting columns" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Subtotal" 'boolean '(#t #f)) + (vector "Sorting" "Primary Subtotal" 'boolean '(#t #f)) + (vector "Sorting" "Secondary Subtotal for Date Key" 'multichoice '(none daily weekly monthly quarterly yearly)) + (vector "Sorting" "Primary Key" 'multichoice '(account-name account-code date reconciled-date reconciled-status register-order corresponding-acc-name corresponding-acc-code amount description number t-number memo notes none)) + (vector "Sorting" "Primary Sort Order" 'multichoice '(ascend descend)) + (vector "Sorting" "Show subtotals only (hide transactional data)" 'boolean '(#t #f)) + (vector "Filter" "Void Transactions" 'multichoice '(non-void-only void-only both)) + (vector "Filter" "Use regular expressions for transaction filter" 'boolean '(#t #f)) + (vector "Filter" "Use regular expressions for account name filter" 'boolean '(#t #f)) + (vector "Filter" "Reconcile Status" 'multichoice '(all unreconciled cleared reconciled)) + (vector "General" "Table for Exporting" 'boolean '(#t #f)) + (vector "General" "Add options summary" 'multichoice '(no-match always never)) + (vector "General" "Common Currency" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "3fe6dce77da24c66bdc8f8efdea7f9ac") + (cons 'report-name "Liabilities") + (cons 'options + (list + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Show Totals" 'boolean '(#t #f)) + (vector "Display" "Show long names" 'boolean '(#t #f)) + (vector "Display" "Show Percents" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + (list (cons 'report-id "5123a759ceb9483abf2182d01c140e8d") + (cons 'report-name "Printable Invoice") + (cons 'options + (list + (vector "Display" "Individual Taxes" 'boolean '(#t #f)) + (vector "Display" "Billing Terms" 'boolean '(#t #f)) + (vector "Display" "References" 'boolean '(#t #f)) + (vector "Display" "Totals" 'boolean '(#t #f)) + (vector "Display" "Invoice Notes" 'boolean '(#t #f)) + (vector "Display" "Billing ID" 'boolean '(#t #f)) + (vector "Display" "Payments" 'boolean '(#t #f)) + (vector "Display" "Job Details" 'boolean '(#t #f)) + (vector "Display Columns" "Tax Amount" 'boolean '(#t #f)) + (vector "Display Columns" "Description" 'boolean '(#t #f)) + (vector "Display Columns" "Discount" 'boolean '(#t #f)) + (vector "Display Columns" "Total" 'boolean '(#t #f)) + (vector "Display Columns" "Action" 'boolean '(#t #f)) + (vector "Display Columns" "Taxable" 'boolean '(#t #f)) + (vector "Display Columns" "Quantity" 'boolean '(#t #f)) + (vector "Display Columns" "Price" 'boolean '(#t #f)) + (vector "Display Columns" "Date" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "21d7cfc59fc74f22887596ebde7e462d") + (cons 'report-name "Advanced Portfolio") + (cons 'options + (list + (vector "Accounts" "Include accounts with no shares" 'boolean '(#t #f)) + (vector "Display" "Show ticker symbols" 'boolean '(#t #f)) + (vector "Display" "Show number of shares" 'boolean '(#t #f)) + (vector "Display" "Show prices" 'boolean '(#t #f)) + (vector "Display" "Show listings" 'boolean '(#t #f)) + (vector "General" "How to report brokerage fees" 'multichoice '(include-in-basis include-in-gain ignore-brokerage)) + (vector "General" "Price Source" 'multichoice '(pricedb-latest pricedb-nearest)) + (vector "General" "Basis calculation method" 'multichoice '(average-basis fifo-basis filo-basis)) + (vector "General" "Set preference for price list data" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "7eb3df21073d4c33920a0257da15fba5") + (cons 'report-name "Receipt") + (cons 'options + (list + ))) + (list (cons 'report-id "e6e34fa3b6e748debde3cb3bc76d3e53") + (cons 'report-name "Budget Flow") + (cons 'options + (list + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + (list (cons 'report-id "b1f15b2052c149df93e698fe85a81ea6") + (cons 'report-name "Expense Over Time") + (cons 'options + (list + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Chart Type" 'multichoice '(barchart linechart)) + (vector "Display" "Use Stacked Charts" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show long account names" 'boolean '(#t #f)) + (vector "General" "Show Average" 'multichoice '(None MonthDelta WeekDelta DayDelta)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "898d78ec92854402bf76e20a36d24ade") + (cons 'report-name "Hello, World") + (cons 'options + (list + (vector "Hello, World!" "Multi Choice Option" 'multichoice '(first second third fourth)) + (vector "Hello, World!" "Boolean Option" 'boolean '(#t #f)) + (vector "Testing" "Crash the report" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "5e2d129f28d14df881c3e47e3053f604") + (cons 'report-name "Income vs. Day of Week") + (cons 'options + (list + (vector "Accounts" "Include Sub-Accounts" 'boolean '(#t #f)) + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Show Totals" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + (list (cons 'report-id "faf410e8f8da481fbc09e4763da40bcc") + (cons 'report-name "Liabilities Over Time") + (cons 'options + (list + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Chart Type" 'multichoice '(barchart linechart)) + (vector "Display" "Use Stacked Charts" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show long account names" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "0b81a3bdfd504aff849ec2e8630524bc") + (cons 'report-name "Income Statement") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Flatten list to depth limit" 'boolean '(#t #f)) + (vector "Entries" "Closing Entries pattern is case-sensitive" 'boolean '(#t #f)) + (vector "Entries" "Closing Entries Pattern is regular expression" 'boolean '(#t #f)) + (vector "Display" "Display as a two column report" 'boolean '(#t #f)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Display" "Parent account balances" 'multichoice '(immediate-bal recursive-bal omit-bal)) + (vector "Display" "Display in standard, income first, order" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Label the revenue section" 'boolean '(#t #f)) + (vector "Display" "Parent account subtotals" 'multichoice '(t f canonically-tabbed)) + (vector "Display" "Include expense total" 'boolean '(#t #f)) + (vector "Display" "Include trading accounts total" 'boolean '(#t #f)) + (vector "Display" "Omit zero balance figures" 'boolean '(#t #f)) + (vector "Display" "Include revenue total" 'boolean '(#t #f)) + (vector "Display" "Label the expense section" 'boolean '(#t #f)) + (vector "Display" "Label the trading accounts section" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "415cd38d39054d9e9c4040455290c2b1") + (cons 'report-name "Budget Chart") + (cons 'options + (list + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Chart Type" 'multichoice '(bars lines)) + (vector "Display" "Running Sum" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "f8748b813fab4220ba26e743aedf38da") + (cons 'report-name "Cash Flow") + (cons 'options + (list + (vector "Accounts" "Always show sub-accounts" 'boolean '(#t #f)) + (vector "Accounts" "Include Trading Accounts in report" 'boolean '(#t #f)) + (vector "Accounts" "Account Display Depth" 'multichoice '(all 1 2 3 4 5 6)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "General" "Show Full Account Names" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "65135608f2014c6ca8412793a8cdf169") + (cons 'report-name "Welcome to GnuCash") + (cons 'options + (list + ))) + (list (cons 'report-id "d7d1e53505ee4b1b82efad9eacedaea0") + (cons 'report-name "Vendor Report") + (cons 'options + (list + (vector "Display Columns" "Tax" 'boolean '(#t #f)) + (vector "Display Columns" "Description" 'boolean '(#t #f)) + (vector "Display Columns" "Amount" 'boolean '(#t #f)) + (vector "Display Columns" "Debits" 'boolean '(#t #f)) + (vector "Display Columns" "Type" 'boolean '(#t #f)) + (vector "Display Columns" "Due Date" 'boolean '(#t #f)) + (vector "Display Columns" "Sale" 'boolean '(#t #f)) + (vector "Display Columns" "Reference" 'boolean '(#t #f)) + (vector "Display Columns" "Credits" 'boolean '(#t #f)) + (vector "Display Columns" "Date" 'boolean '(#t #f)) + (vector "General" "Due or Post Date" 'multichoice '(duedate postdate)) + (vector "__reg" "reverse?" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "5518ac227e474f47a34439f2d4d049de") + (cons 'report-name "Job Report") + (cons 'options + (list + (vector "Display Columns" "Description" 'boolean '(#t #f)) + (vector "Display Columns" "Amount" 'boolean '(#t #f)) + (vector "Display Columns" "Type" 'boolean '(#t #f)) + (vector "Display Columns" "Due Date" 'boolean '(#t #f)) + (vector "Display Columns" "Reference" 'boolean '(#t #f)) + (vector "Display Columns" "Date" 'boolean '(#t #f)) + (vector "__reg" "reverse?" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "e5fa5ce805e840ecbeca4dba3fa4ead9") + (cons 'report-name "Budget Profit & Loss") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Flatten list to depth limit" 'boolean '(#t #f)) + (vector "Display" "Display as a two column report" 'boolean '(#t #f)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Display" "Parent account balances" 'multichoice '(immediate-bal recursive-bal omit-bal)) + (vector "Display" "Display in standard, income first, order" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Label the revenue section" 'boolean '(#t #f)) + (vector "Display" "Parent account subtotals" 'multichoice '(t f canonically-tabbed)) + (vector "Display" "Include expense total" 'boolean '(#t #f)) + (vector "Display" "Omit zero balance figures" 'boolean '(#t #f)) + (vector "Display" "Include revenue total" 'boolean '(#t #f)) + (vector "Display" "Label the expense section" 'boolean '(#t #f)) + (vector "General" "Report for range of budget periods" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "e533c998186b11e1b2e2001558291366") + (cons 'report-name "Income & Expense Linechart") + (cons 'options + (list + (vector "Display" "Grid" 'boolean '(#t #f)) + (vector "Display" "Data markers?" 'boolean '(#t #f)) + (vector "Display" "Show Income/Expense" 'boolean '(#t #f)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show Net Profit" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "22104e02654c4adba844ee75a3f8d173") + (cons 'report-name "Register") + (cons 'options + (list + (vector "Display" "Description" 'boolean '(#t #f)) + (vector "Display" "Account" 'boolean '(#t #f)) + (vector "Display" "Amount" 'multichoice '(single double)) + (vector "Display" "Num" 'boolean '(#t #f)) + (vector "Display" "Running Balance" 'boolean '(#t #f)) + (vector "Display" "Shares" 'boolean '(#t #f)) + (vector "Display" "Lot" 'boolean '(#t #f)) + (vector "Display" "Memo" 'boolean '(#t #f)) + (vector "Display" "Totals" 'boolean '(#t #f)) + (vector "Display" "Price" 'boolean '(#t #f)) + (vector "Display" "Date" 'boolean '(#t #f)) + (vector "Display" "Value" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "d8b63264186b11e19038001558291366") + (cons 'report-name "Net Worth Linechart") + (cons 'options + (list + (vector "Display" "Grid" 'boolean '(#t #f)) + (vector "Display" "Show Asset & Liability" 'boolean '(#t #f)) + (vector "Display" "Data markers?" 'boolean '(#t #f)) + (vector "Display" "Show table" 'boolean '(#t #f)) + (vector "Display" "Show Net Worth" 'boolean '(#t #f)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "1d241609fd4644caad765c95be20ff4c") + (cons 'report-name "Price") + (cons 'options + (list + (vector "Display" "Marker" 'multichoice '(diamond circle square cross plus dash filleddiamond filledcircle filledsquare)) + (vector "Price" "Invert prices" 'boolean '(#t #f)) + (vector "Price" "Price Source" 'multichoice '(weighted-average actual-transactions pricedb)) + (vector "General" "Step Size" 'multichoice '(DayDelta WeekDelta TwoWeekDelta MonthDelta QuarterDelta HalfYearDelta YearDelta)) + ))) + (list (cons 'report-id "ecc35ea9dbfa4e20ba389fc85d59cb69") + (cons 'report-name "Budget Balance Sheet") + (cons 'options + (list + (vector "Commodities" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + (vector "Commodities" "Show Exchange Rates" 'boolean '(#t #f)) + (vector "Commodities" "Show Foreign Currencies" 'boolean '(#t #f)) + (vector "Accounts" "Levels of Subaccounts" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Accounts" "Flatten list to depth limit" 'boolean '(#t #f)) + (vector "Display" "Show accounting-style rules" 'boolean '(#t #f)) + (vector "Display" "Display accounts as hyperlinks" 'boolean '(#t #f)) + (vector "Display" "Parent account balances" 'multichoice '(immediate-bal recursive-bal omit-bal)) + (vector "Display" "Include assets total" 'boolean '(#t #f)) + (vector "Display" "Include accounts with zero total balances" 'boolean '(#t #f)) + (vector "Display" "Parent account subtotals" 'multichoice '(t f canonically-tabbed)) + (vector "Display" "Include liabilities total" 'boolean '(#t #f)) + (vector "Display" "Label the liabilities section" 'boolean '(#t #f)) + (vector "Display" "Include new/existing totals" 'boolean '(#t #f)) + (vector "Display" "Omit zero balance figures" 'boolean '(#t #f)) + (vector "Display" "Label the assets section" 'boolean '(#t #f)) + (vector "Display" "Include equity total" 'boolean '(#t #f)) + (vector "Display" "Label the equity section" 'boolean '(#t #f)) + (vector "General" "Single column Balance Sheet" 'boolean '(#t #f)) + ))) + (list (cons 'report-id "5c7fd8a1fe9a4cd38884ff54214aa88a") + (cons 'report-name "Assets") + (cons 'options + (list + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Show Totals" 'boolean '(#t #f)) + (vector "Display" "Show long names" 'boolean '(#t #f)) + (vector "Display" "Show Percents" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + (list (cons 'report-id "9bf1892805cb4336be6320fe48ce5446") + (cons 'report-name "Expense Accounts") + (cons 'options + (list + (vector "Accounts" "Show Accounts until level" 'multichoice '(all 1 2 3 4 5 6)) + (vector "Display" "Show Totals" 'boolean '(#t #f)) + (vector "Display" "Show long names" 'boolean '(#t #f)) + (vector "Display" "Show Percents" 'boolean '(#t #f)) + (vector "Display" "Sort Method" 'multichoice '(acct-code alphabetical amount)) + (vector "General" "Show Average" 'multichoice '(None YearDelta MonthDelta WeekDelta)) + (vector "General" "Price Source" 'multichoice '(average-cost weighted-average pricedb-latest pricedb-nearest)) + ))) + )) From aa4da810c1cc9b00c829ef77bc4ff8a8792c92a2 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sun, 8 Jul 2018 14:59:30 +0800 Subject: [PATCH 5/8] [test-stress-options] introduce combinatorial testing This is enabled if the environment variable COMBINATORICS exists. I guess it can be run via: COMBINATORICS=bla ninja check --- .../test/test-stress-options.scm | 88 ++++++++++++++++++- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/gnucash/report/standard-reports/test/test-stress-options.scm b/gnucash/report/standard-reports/test/test-stress-options.scm index 92d6aaf8cc..028d04959c 100644 --- a/gnucash/report/standard-reports/test/test-stress-options.scm +++ b/gnucash/report/standard-reports/test/test-stress-options.scm @@ -1,3 +1,5 @@ +(use-modules (ice-9 textual-ports)) +(use-modules (ice-9 popen)) (use-modules (gnucash utilities)) (use-modules (gnucash gnc-module)) (gnc:module-begin-syntax (gnc:module-load "gnucash/app-utils" 0)) @@ -10,6 +12,7 @@ (use-modules (gnucash report report-system)) (use-modules (gnucash report report-system test test-extras)) (use-modules (srfi srfi-64)) +(use-modules (srfi srfi-98)) (use-modules (gnucash engine test srfi64-extras)) (use-modules (sxml simple)) (use-modules (sxml xpath)) @@ -103,7 +106,7 @@ (list "Equity" (list (cons 'type ACCT-TYPE-EQUITY))) )) -(define (test report-name uuid report-options) +(define (simple-stress-test report-name uuid report-options) (let ((options (gnc:make-report-options uuid))) (test-assert (format #f "basic test ~a" report-name) (gnc:options->render uuid options (string-append "stress-" report-name) "test")) @@ -146,6 +149,82 @@ report-options))) ))) +(define (combinatorial-stress-test report-name uuid report-options) + (let* ((options (gnc:make-report-options uuid)) + (render #f)) + (test-assert (format #f "basic test ~a" report-name) + (set! render + (gnc:options->render + uuid options (string-append "stress-" report-name) "test"))) + (if render + (begin + (format #t "Testing n-tuple combinatorics for:\n~a" report-name) + (for-each + (lambda (option) + (format #t ",~a/~a" + (vector-ref option 0) + (vector-ref option 1))) + report-options) + (newline) + ;; generate combinatorics + (let* ((option-lengths (map (lambda (report-option) + (length (vector-ref report-option 3))) + report-options)) + (jennyargs (string-join (map number->string option-lengths) " ")) + (n-tuple (min + ;; the following is the n-tuple + 2 + (length report-options))) + (cmdline (format #f "/home/chris/sources/jenny/jenny -n~a ~a" + n-tuple jennyargs)) + (jennyout (get-string-all (open-input-pipe cmdline))) + (test-cases (string-split jennyout #\newline))) + (for-each + (lambda (case) + (unless (string-null? case) + (let* ((choices-str (string-filter char-alphabetic? case)) + (choices-alpha (map char->integer (string->list choices-str))) + (choices (map (lambda (n) + (- n (if (> n 96) 97 39))) ; a-z -> 0-25, and A-Z -> 26-51 + choices-alpha))) + (let loop ((option-idx (1- (length report-options))) + (option-summary '())) + (if (negative? option-idx) + (catch #t + (lambda () + (gnc:options->render uuid options "stress-test" "test") + (format #t "[pass] ~a:~a \n" + report-name + (string-join option-summary ","))) + (lambda (k . args) + (format #t "[fail]... error (~s . ~s) options-list are:\n~a" + k args + (gnc:html-render-options-changed options #t)) + (test-assert "logging test failure as above..." + #f))) + (let* ((option (list-ref report-options option-idx)) + (section (vector-ref option 0)) + (name (vector-ref option 1)) + (value (list-ref (vector-ref option 3) + (list-ref choices option-idx)))) + (set-option! options section name value) + (loop (1- option-idx) + (cons (format #f "~a" + (cond + ((boolean? value) (if value 't 'f)) + (else value))) + option-summary)))))))) + test-cases))) + (display "...aborted due to basic test failure")))) + +(define test + ;; what strategy are we using here? simple stress test (ie tests as + ;; many times as the maximum number of options) or combinatorial + ;; tests (using jenny) + (if (get-environment-variable "COMBINATORICS") + combinatorial-stress-test + simple-stress-test)) + (define (tests) (let* ((env (create-test-env)) (account-alist (env-create-account-structure-alist env structure)) @@ -223,8 +302,11 @@ "General Journal" "Australian Tax Invoice" "Balance Sheet (eguile)" + ;; "Budget Flow" "networth" )) - (format #t "Skipping ~a...\n" report-name) - (test report-name report-guid report-options)))) + (format #t "\nSkipping ~a...\n" report-name) + (begin + (format #t "\nTesting ~a...\n" report-name) + (test report-name report-guid report-options))))) optionslist))) From b8ce2b545ac83ff6e5d059a1c15c33b4789d024d Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Tue, 10 Jul 2018 23:33:40 +0800 Subject: [PATCH 6/8] [stress-test] run tests on empty book and populated book Refactor (tests) into call (create-test-data) which will add sample txns in the environment. As a result we can run tests twice - once before and once after (create-test-data) which helps dislodge a few more report bugs. --- .../test/test-stress-options.scm | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/gnucash/report/standard-reports/test/test-stress-options.scm b/gnucash/report/standard-reports/test/test-stress-options.scm index 028d04959c..da2ffb6131 100644 --- a/gnucash/report/standard-reports/test/test-stress-options.scm +++ b/gnucash/report/standard-reports/test/test-stress-options.scm @@ -225,7 +225,7 @@ combinatorial-stress-test simple-stress-test)) -(define (tests) +(define (create-test-data) (let* ((env (create-test-env)) (account-alist (env-create-account-structure-alist env structure)) (bank (cdr (assoc "Bank" account-alist))) @@ -280,33 +280,39 @@ (iota 12)) (let ((mid (floor (/ (+ (gnc-accounting-period-fiscal-start) (gnc-accounting-period-fiscal-end)) 2)))) - (env-create-transaction env mid bank income 200)) + (env-create-transaction env mid bank income 200)))) - (for-each - (lambda (option-set) - (let ((report-name (assq-ref option-set 'report-name)) - (report-guid (assq-ref option-set 'report-id)) - (report-options (assq-ref option-set 'options))) - (if (member report-name - ;; these reports seem to cause problems when running... - '("Income Statement" - "Tax Invoice" - "Net Worth Linechart" - "Tax Schedule Report/TXF Export" - "Receipt" - "Future Scheduled Transactions Summary" - "Welcome to GnuCash" - "Hello, World" - "Budget Income Statement" - "Multicolumn View" - "General Journal" - "Australian Tax Invoice" - "Balance Sheet (eguile)" - ;; "Budget Flow" - "networth" - )) - (format #t "\nSkipping ~a...\n" report-name) - (begin - (format #t "\nTesting ~a...\n" report-name) - (test report-name report-guid report-options))))) - optionslist))) +(define (run-tests prefix) + (for-each + (lambda (option-set) + (let ((report-name (assq-ref option-set 'report-name)) + (report-guid (assq-ref option-set 'report-id)) + (report-options (assq-ref option-set 'options))) + (if (member report-name + ;; these reports seem to cause problems when running... + '( + ;; eguile-based reports + "Tax Invoice" + "Receipt" + "Australian Tax Invoice" + "Balance Sheet (eguile)" + + ;; tax-schedule - locale-dependent? + "Tax Schedule Report/TXF Export" + + ;; unusual reports + "Welcome to GnuCash" + "Hello, World" + "Multicolumn View" + "General Journal" + )) + (format #t "\nSkipping ~a ~a...\n" report-name prefix) + (begin + (format #t "\nTesting ~a ~a...\n" report-name prefix) + (test report-name report-guid report-options))))) + optionslist)) + +(define (tests) + (run-tests "with empty book") + (create-test-data) + (run-tests "on a populated book")) From 414ab99aa07c550882ffb0c65f8d415dfb1d7008 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Mon, 16 Jul 2018 00:18:58 +0800 Subject: [PATCH 7/8] [test-stress-options] Set COMBINATORICS to full path to jenny Setting COMBINATORICS to the full path name to jenny will enable pairwise testing. e.g. COMBINATORICS=/home/user/jenny/jenny ninja check --- .../test/test-stress-options.scm | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/gnucash/report/standard-reports/test/test-stress-options.scm b/gnucash/report/standard-reports/test/test-stress-options.scm index da2ffb6131..42652733f0 100644 --- a/gnucash/report/standard-reports/test/test-stress-options.scm +++ b/gnucash/report/standard-reports/test/test-stress-options.scm @@ -17,6 +17,15 @@ (use-modules (sxml simple)) (use-modules (sxml xpath)) +;; NOTE +;; ---- +;; SIMPLE stress tests by default +;; +;; PAIRWISE COMBINATORICS are enabled by setting environment variable COMBINATORICS +;; to the fullpath for the compiled jenny from http://burtleburtle.net/bob/math/jenny.html +;; +;; e.g. COMBINATORICS=/home/user/jenny/jenny ninja check + (load "test-stress-optionslist.scm") ;; The above optionslist was generated programmatically. It was ;; generated by running a sentinel function in the middle of an @@ -81,6 +90,18 @@ (tests) (test-end "stress options")) +(define jennypath + (get-environment-variable "COMBINATORICS")) + +(define jenny-exists? + ;; this is a simple test for presence of jenny - will check + ;; COMBINATORICS env exists, and running it produces exit-code of + ;; zero, and tests the first few letters of its output. + (and (string? jennypath) + (zero? (system jennypath)) + (string=? (string-take (get-string-all (open-input-pipe jennypath)) 6) + "jenny:"))) + (define (set-option! options section name value) (let ((option (gnc:lookup-option options section name))) (if option @@ -175,8 +196,8 @@ ;; the following is the n-tuple 2 (length report-options))) - (cmdline (format #f "/home/chris/sources/jenny/jenny -n~a ~a" - n-tuple jennyargs)) + (cmdline (format #f "~a -n~a ~a" + jennypath n-tuple jennyargs)) (jennyout (get-string-all (open-input-pipe cmdline))) (test-cases (string-split jennyout #\newline))) (for-each @@ -221,7 +242,7 @@ ;; what strategy are we using here? simple stress test (ie tests as ;; many times as the maximum number of options) or combinatorial ;; tests (using jenny) - (if (get-environment-variable "COMBINATORICS") + (if jenny-exists? combinatorial-stress-test simple-stress-test)) From 294e113fec9ef22e752ad6922971b84f79614f2c Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Mon, 16 Jul 2018 07:14:44 +0800 Subject: [PATCH 8/8] Small typo fix Fixes typo in a51be5157c383b15a3bddf314b61293cff19c3dd --- gnucash/gschemas/org.gnucash.gschema.xml.in | 2 +- gnucash/gtkbuilder/dialog-preferences.glade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gnucash/gschemas/org.gnucash.gschema.xml.in b/gnucash/gschemas/org.gnucash.gschema.xml.in index 6859da32cd..8d924c075c 100644 --- a/gnucash/gschemas/org.gnucash.gschema.xml.in +++ b/gnucash/gschemas/org.gnucash.gschema.xml.in @@ -68,7 +68,7 @@ false Force prices to display as decimals even if they must be rounded. - If active, GnuCash will round prices as necessary to display them as decimals instead of displaying the exact fraction if the fractional part cannont be exactly represented as a decimal. + If active, GnuCash will round prices as necessary to display them as decimals instead of displaying the exact fraction if the fractional part cannot be exactly represented as a decimal. false diff --git a/gnucash/gtkbuilder/dialog-preferences.glade b/gnucash/gtkbuilder/dialog-preferences.glade index 1514105671..58dfc66cbd 100644 --- a/gnucash/gtkbuilder/dialog-preferences.glade +++ b/gnucash/gtkbuilder/dialog-preferences.glade @@ -1405,7 +1405,7 @@ many months before the current month: False True Force prices to display as decimals even if they must be rounded. - If active, GnuCash will round prices as necessary to display them as decimals instead of displaying the exact fraction if the fractional part cannont be exactly represented as a decimal. + If active, GnuCash will round prices as necessary to display them as decimals instead of displaying the exact fraction if the fractional part cannot be exactly represented as a decimal. start 12 True