mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Add missing file.
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3056 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
f774229e60
commit
590a57dc6b
74
doc/sgml/C/xacc-tax-report.sgml
Normal file
74
doc/sgml/C/xacc-tax-report.sgml
Normal file
@ -0,0 +1,74 @@
|
||||
<ARTICLE ID="XACC-TAX-REPORT">
|
||||
|
||||
<ARTHEADER>
|
||||
<TITLE>Tax Report</TITLE>
|
||||
</ARTHEADER>
|
||||
<PARA> <INLINEMEDIAOBJECT>
|
||||
<IMAGEOBJECT>
|
||||
<IMAGEDATA FILEREF="image/report-tax.png">
|
||||
</IMAGEOBJECT>
|
||||
</INLINEMEDIAOBJECT>
|
||||
|
||||
</PARA>
|
||||
|
||||
<PARA>This report allows you to view all tax related Income and Expenses.
|
||||
Up to fifteen sub-accounts are displayed. Lower sub-accounts are ignored.
|
||||
|
||||
</PARA>
|
||||
|
||||
<PARA><EMPHASIS>NOTE:</EMPHASIS> For this to work, the user has to
|
||||
segregate taxable and not taxable income to different accounts, as
|
||||
well as deductible and non deductible expenses. The user also must
|
||||
Set the Tax Status of each tax related account. The "Set/Reset
|
||||
Tax Status:" parameter does this. There is a taxreport.xac file in
|
||||
the examples directory, which shows one way this can be set up.
|
||||
|
||||
</PARA>
|
||||
<PARA> <INLINEMEDIAOBJECT>
|
||||
<IMAGEOBJECT>
|
||||
<IMAGEDATA FILEREF="image/report-tax-options.png">
|
||||
</IMAGEOBJECT>
|
||||
</INLINEMEDIAOBJECT>
|
||||
|
||||
</PARA>
|
||||
<PARA>Options specifiable for this report include:
|
||||
|
||||
<ITEMIZEDLIST>
|
||||
<LISTITEM><PARA>The start and end dates - default: Year-to-Date.
|
||||
</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>Alternate Period: (Year is relative to From:)
|
||||
<ITEMIZEDLIST>
|
||||
<LISTITEM><PARA>Use From - To (default)</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>1st, 2nd, 3rd, 4th Estimated Tax Quarters
|
||||
(From: year)</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>Last Year (year before From: year)
|
||||
</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>1st, 2nd, 3rd, 4th Estimated Tax Quarters for
|
||||
Last Year</PARA></LISTITEM>
|
||||
</ITEMIZEDLIST></PARA></LISTITEM>
|
||||
<LISTITEM><PARA>The accounts for which the report is to be
|
||||
produced. If no account is selected, all tax related accounts
|
||||
are displayed. Non-tax related accounts are not displaied, even
|
||||
if selected, though tax related sub-accounts will be
|
||||
displaied.</PARA></LISTITEM>
|
||||
|
||||
<LISTITEM><PARA>Suppress $0.00 values</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>Display Full account names</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>Set/Reset Tax Status of selected accounts.
|
||||
(No op is none selected)
|
||||
<ITEMIZEDLIST>
|
||||
<LISTITEM><PARA>No Change (default)</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>Set Tax Related</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>Reset Tax Related</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>Set Tax Related & sub-accounts</PARA></LISTITEM>
|
||||
<LISTITEM><PARA>Reset Tax Related & sub-accounts</PARA></LISTITEM>
|
||||
</ITEMIZEDLIST></PARA></LISTITEM>
|
||||
</ITEMIZEDLIST>
|
||||
|
||||
</PARA>
|
||||
|
||||
<PARA> I plan to add export capability to TaxCut and TurboTax, as soon
|
||||
as I can get a hold of the spec for .txf files.
|
||||
</PARA>
|
||||
|
||||
</ARTICLE>
|
489
src/scm/report/tax.scm
Normal file
489
src/scm/report/tax.scm
Normal file
@ -0,0 +1,489 @@
|
||||
;; -*-scheme-*-
|
||||
;; $Id$
|
||||
;; copied and modified from balance-and-pnl.scm
|
||||
;; Tax Reports
|
||||
|
||||
;; This prints Tax related accounts. For this to work, the user has to
|
||||
;; segregate taxable and not taxable income to different accounts, as well
|
||||
;; as deductible and non deductible expenses.
|
||||
;; Tax related accounts have "{tax}" in the notes field. This can be set/reset
|
||||
;; from the parameters dialog.
|
||||
;; The user selects the accounts(s) to be printed, if none, all are checked.
|
||||
;; Automatically prints up to 15 sub-account levels below selected account.
|
||||
;; Accounts below that are not printed. If you really need more levels,
|
||||
;; change the MAX_LEVELS constant
|
||||
;; Optionally, does NOT print accounts with $0.00 values.
|
||||
;; Prints data between the From and To dates. Optional alternate periods:
|
||||
;; "Last Year", "1st Est Tax Quarter", ... "4th Est Tax Quarter"
|
||||
;; "Last Yr Est Tax Qtr", ... "Last Yr Est Tax Qtr"
|
||||
;; Estimated Tax Quarters: Dec 31, Mar 31, Jun 30, Aug 31)
|
||||
;; NOTE: setting of specific dates is squirly! and seems to be current-date
|
||||
;; dependabnt! Actually, time of day dependant!
|
||||
;; Just after midnight gives diffenent dates than just before!
|
||||
;; Referencing all times to noon seems to fix this.
|
||||
;; Subtracting 1 year sometimes subtracts 2! see "(to-value"
|
||||
;; Optionally prints brief or full account names
|
||||
|
||||
;; made some changes to date options, as these changed since 1.4.4
|
||||
|
||||
(gnc:support "report/tax.scm")
|
||||
(gnc:depend "text-export.scm")
|
||||
(gnc:depend "report-utilities.scm")
|
||||
(gnc:depend "options.scm")
|
||||
(gnc:depend "date-utilities.scm")
|
||||
|
||||
;; make a list of accounts from a group pointer
|
||||
(define (gnc:group-ptr->list group-prt)
|
||||
(if (pointer-token-null? group-prt)
|
||||
'()
|
||||
(gnc:group-map-accounts (lambda (x) x) group-prt)))
|
||||
|
||||
;; do loop string-search
|
||||
(define (string-search string sub-str start)
|
||||
(do ((sub-len (string-length sub-str))
|
||||
;; must recompute sub-len because order is unknown
|
||||
(limit (- (string-length string) (string-length sub-str)))
|
||||
(char0 (string-ref sub-str 0))
|
||||
;; find first char of sub-str ; must recompute char0
|
||||
(match0 (string-index string (string-ref sub-str 0) start) ; init
|
||||
(string-index string char0 (+ 1 match0))) ; step
|
||||
(match #f #f))
|
||||
((or (eqv? #f match0) (> match0 limit)
|
||||
;; dows entire sub-str match?
|
||||
(let ()
|
||||
(set! match (string=? sub-str (substring string match0
|
||||
(+ match0 sub-len))))
|
||||
(if match (set! match match0))
|
||||
match))
|
||||
match)))
|
||||
|
||||
(define (string-search? string sub-str start)
|
||||
(number? (string-search string sub-str start)))
|
||||
|
||||
;; Just a private sc1pe.
|
||||
(let* ((MAX-LEVELS 16) ; Maximum Account Levels
|
||||
(levelx-collector (make-vector MAX-LEVELS)))
|
||||
(do ((i 0 (+ i 1)))
|
||||
((= i MAX-LEVELS) i)
|
||||
(vector-set! levelx-collector i (make-stats-collector)))
|
||||
|
||||
(define (lx-collector level action value)
|
||||
((vector-ref levelx-collector (- level 1)) action value))
|
||||
|
||||
(define string-db (gnc:make-string-database))
|
||||
|
||||
;; IRS asked congress to make the tax quarters sthe same as real quarters
|
||||
;; This is the year it is effective. THIS IS A Y10K BUG!
|
||||
(define tax-qtr-real-qtr-year 10000)
|
||||
|
||||
(define (tax-options-generator)
|
||||
(define gnc:*tax-report-options* (gnc:new-options))
|
||||
(define (gnc:register-tax-option new-option)
|
||||
(gnc:register-option gnc:*tax-report-options* new-option))
|
||||
|
||||
(gnc:register-tax-option
|
||||
(gnc:make-date-option
|
||||
"Tax Report Options" "From"
|
||||
"a" "Start of reporting period"
|
||||
(lambda ()
|
||||
(let ((bdtm (gnc:timepair->date (gnc:timepair-canonical-day-time
|
||||
(cons (current-time) 0)))))
|
||||
(set-tm:mday bdtm 1) ; 01
|
||||
(set-tm:mon bdtm 0) ; Jan
|
||||
(cons 'absolute (cons (car (mktime bdtm)) 0))))
|
||||
#f 'absolute #f))
|
||||
|
||||
(gnc:register-tax-option
|
||||
(gnc:make-date-option
|
||||
"Tax Report Options" "To"
|
||||
"b" "End of reporting period"
|
||||
(lambda ()
|
||||
(cons 'absolute (gnc:timepair-canonical-day-time
|
||||
(cons (current-time) 0))))
|
||||
#f 'absolute #f))
|
||||
|
||||
(gnc:register-tax-option
|
||||
(gnc:make-multichoice-option
|
||||
"Tax Report Options" "Alternate Period"
|
||||
"c" "Overide or modify From: & To:" 'from-to
|
||||
(list #(from-to "Use From - To" "Use From - To period")
|
||||
#(1st-est "1st Est Tax Quarter" "Jan 1 - Mar 31")
|
||||
#(2nd-est "2nd Est Tax Quarter" "Apr 1 - May 31")
|
||||
#(3rd-est "3rd Est Tax Quarter" "Jun 1 - Aug 31")
|
||||
#(4th-est "4th Est Tax Quarter" "Sep 1 - Dec 31")
|
||||
#(last-year "Last Year" "Last Year")
|
||||
#(1st-last "Last Yr 1st Est Tax Qtr" "Jan 1 - Mar 31, Last year")
|
||||
#(2nd-last "Last Yr 2nd Est Tax Qtr" "Apr 1 - May 31, Last year")
|
||||
#(3rd-last "Last Yr 3rd Est Tax Qtr" "Jun 1 - Aug 31, Last year")
|
||||
#(4th-last "Last Yr 4th Est Tax Qtr" "Sep 1 - Dec 31, Last year")
|
||||
)))
|
||||
|
||||
(gnc:register-tax-option
|
||||
(gnc:make-account-list-option
|
||||
"Tax Report Options" "Select Accounts (none = all)"
|
||||
"d" "Select accounts"
|
||||
(lambda () (gnc:get-current-accounts))
|
||||
#f
|
||||
#t))
|
||||
|
||||
(gnc:register-tax-option
|
||||
(gnc:make-simple-boolean-option
|
||||
"Tax Report Options" "Suppress $0.00 values"
|
||||
"f" "$0.00 valued Accounts won't be printed." #t))
|
||||
|
||||
(gnc:register-tax-option
|
||||
(gnc:make-simple-boolean-option
|
||||
"Tax Report Options" "Print Full account names"
|
||||
"g" "Print all Parent account names" #f))
|
||||
|
||||
(gnc:register-tax-option
|
||||
(gnc:make-multichoice-option
|
||||
"Tax Report Options" "Set/Reset Tax Status"
|
||||
"h" "Set/Reset Selected Account Tax Status" 'tax-no-change
|
||||
(list #(tax-no-change "No Change" "No Change")
|
||||
#(tax-set "Set Tax Related" "Set Selected accounts as Tax Related")
|
||||
#(tax-reset "Reset Tax Related"
|
||||
"Reset Selected accounts as not Tax Related")
|
||||
#(tax-set-kids "Set Tax Related & sub-accounts"
|
||||
"Set Selected & sub-accounts as Tax Related")
|
||||
#(tax-reset-kids
|
||||
"Reset Tax Related & sub-accounts"
|
||||
"Reset Selected & sub-accounts as not Tax Related")
|
||||
)))
|
||||
|
||||
gnc:*tax-report-options*)
|
||||
|
||||
;; Render any level
|
||||
(define (render-level-x-account level max-level account lx-value
|
||||
suppress-0 full-names)
|
||||
(let* ((indent-1 " ")
|
||||
(indent-2 (string-append indent-1 indent-1))
|
||||
(account-name ;(string-append
|
||||
(if (or full-names (equal? level 1))
|
||||
(gnc:account-get-full-name account)
|
||||
(gnc:account-get-name account)))
|
||||
(value (gnc:amount->formatted-string lx-value #f))
|
||||
(account-name (do ((i 1 (+ i 1))
|
||||
(accum account-name
|
||||
(string-append indent-1 accum)))
|
||||
((>= i level) accum)))
|
||||
(nbsp-x-value (if (= max-level level)
|
||||
(list value)
|
||||
(append (vector->list (make-vector
|
||||
(- max-level level)
|
||||
" "))
|
||||
(list value))))
|
||||
(align-x (append (list "left")
|
||||
(vector->list
|
||||
(make-vector (- (+ max-level 1) level)
|
||||
"right")))))
|
||||
;;(if (not (equal? lx-value 0.0)) ; this fails, round off, I guess
|
||||
(if (or (not suppress-0) (= level 1)
|
||||
(not (equal? value (gnc:amount->formatted-string 0.0 #f))))
|
||||
(html-table-row-align
|
||||
(append (list account-name) nbsp-x-value)
|
||||
align-x)
|
||||
'())))
|
||||
|
||||
(define blank-line
|
||||
(html-table-row (list " ")))
|
||||
|
||||
(define (is-type-income-or-expense? type)
|
||||
(member type '(INCOME EXPENSE)))
|
||||
|
||||
(define (is-type-income? type)
|
||||
(member type '(INCOME)))
|
||||
|
||||
(define tax-key "{tax}")
|
||||
|
||||
(define (is-key-in-account-notes? key account)
|
||||
(string-search? (gnc:account-get-notes account) key 0))
|
||||
|
||||
;; This is a bit of a fudge, matching against strings in account notes.
|
||||
;; It'd be better if this was a unique account field.
|
||||
;; Recursivly validate children if parent is not a tax account.
|
||||
;; Don't check children if parent is vaild, i.e., we assume all
|
||||
;; children are valid.
|
||||
;; Returns the Parent if a child or grandchild is valid.
|
||||
(define (validate accounts key)
|
||||
(apply append (map (lambda (a)
|
||||
(if (is-key-in-account-notes? key a)
|
||||
(list a)
|
||||
;; check children
|
||||
(if (null? (validate
|
||||
(gnc:group-ptr->list
|
||||
(gnc:account-get-children a)) key))
|
||||
'()
|
||||
(list a))))
|
||||
accounts)))
|
||||
|
||||
;; Set or Reset key in account notes
|
||||
(define (key-status accounts set key kids)
|
||||
(let ((key-len (string-length key)))
|
||||
(map (lambda (a)
|
||||
(let* ((notes (gnc:account-get-notes a))
|
||||
(key-start (string-search notes key 0))
|
||||
(notes-len (string-length notes)))
|
||||
(if (eqv? #f key-start)
|
||||
(if set ; set tax status
|
||||
(gnc:account-set-notes a (string-append notes key)))
|
||||
(if (not set) ; reset tax status
|
||||
(gnc:account-set-notes a (string-append
|
||||
(substring notes 0 key-start)
|
||||
(substring notes
|
||||
(+ key-start
|
||||
key-len)
|
||||
notes-len)))))
|
||||
(if kids ; recurse to all sub accounta
|
||||
(key-status
|
||||
(gnc:group-ptr->list (gnc:account-get-children a))
|
||||
set key #t))))
|
||||
accounts)))
|
||||
|
||||
(define (generate-tax report-name
|
||||
report-description
|
||||
options)
|
||||
|
||||
;; These are some helper functions for looking up option values.
|
||||
(define (get-op section name)
|
||||
(gnc:lookup-option options section name))
|
||||
|
||||
(define (op-value section name)
|
||||
(gnc:option-value (get-op section name)))
|
||||
|
||||
;; the number of account generations: children, grandchildren etc.
|
||||
(define (num-generations account gen)
|
||||
(let ((children (gnc:account-get-children account)))
|
||||
(if (pointer-token-null? children)
|
||||
gen ; no kids, return input
|
||||
(apply max (gnc:group-map-accounts
|
||||
(lambda (x) (num-generations x (+ 1 gen)))
|
||||
children)))))
|
||||
|
||||
(let* ((from-value (gnc:date-option-absolute-time
|
||||
(op-value "Tax Report Options" "From")))
|
||||
(to-value (gnc:timepair-end-day-time
|
||||
(gnc:date-option-absolute-time
|
||||
(op-value "Tax Report Options" "To"))))
|
||||
(alt-period (op-value "Tax Report Options" "Alternate Period"))
|
||||
(suppress-0 (op-value "Tax Report Options" "Suppress $0.00 values"))
|
||||
(full-names (op-value "Tax Report Options"
|
||||
"Print Full account names"))
|
||||
(tax-stat (op-value "Tax Report Options" "Set/Reset Tax Status"))
|
||||
(user-sel-accnts (op-value "Tax Report Options"
|
||||
"Select Accounts (none = all)"))
|
||||
(not-used (case tax-stat
|
||||
((tax-set)
|
||||
(key-status user-sel-accnts #t tax-key #f)
|
||||
(gnc:refresh-main-window))
|
||||
((tax-reset)
|
||||
(key-status user-sel-accnts #f tax-key #f)
|
||||
(gnc:refresh-main-window))
|
||||
((tax-set-kids)
|
||||
(key-status user-sel-accnts #t tax-key #t)
|
||||
(gnc:refresh-main-window))
|
||||
((tax-reset-kids)
|
||||
(key-status user-sel-accnts #f tax-key #t)
|
||||
(gnc:refresh-main-window))))
|
||||
(valid-user-sel-accnts (validate user-sel-accnts tax-key))
|
||||
;; If no selected accounts, check all.
|
||||
(selected-accounts (if (not (null? user-sel-accnts))
|
||||
valid-user-sel-accnts
|
||||
(validate (gnc:group-ptr->list
|
||||
(gnc:get-current-group))
|
||||
tax-key)))
|
||||
(generations (if (pair? selected-accounts)
|
||||
(apply max (map (lambda (x) (num-generations x 1))
|
||||
selected-accounts))
|
||||
0))
|
||||
(max-level (min MAX-LEVELS (max 1 generations)))
|
||||
;; Alternate dates are relative to from-date
|
||||
(from-date (gnc:timepair->date from-value))
|
||||
(from-value (gnc:timepair-start-day-time
|
||||
(let ((bdtm from-date))
|
||||
(if (member alt-period
|
||||
'(last-year 1st-last 2nd-last
|
||||
3rd-last 4th-last))
|
||||
(set-tm:year bdtm (- (tm:year bdtm) 1)))
|
||||
(set-tm:mday bdtm 1)
|
||||
(if (< (gnc:date-get-year bdtm)
|
||||
tax-qtr-real-qtr-year)
|
||||
(case alt-period
|
||||
((1st-est 1st-last last-year) ; Jan 1
|
||||
(set-tm:mon bdtm 0))
|
||||
((2nd-est 2nd-last) ; Apr 1
|
||||
(set-tm:mon bdtm 3))
|
||||
((3rd-est 3rd-last) ; Jun 1
|
||||
(set-tm:mon bdtm 5))
|
||||
((4th-est 4th-last) ; Sep 1
|
||||
(set-tm:mon bdtm 8)))
|
||||
;; Tax quaters equal Real quarters
|
||||
(case alt-period
|
||||
((1st-est 1st-last last-year) ; Jan 1
|
||||
(set-tm:mon bdtm 0))
|
||||
((2nd-est 2nd-last) ; Apr 1
|
||||
(set-tm:mon bdtm 3))
|
||||
((3rd-est 3rd-last) ; Jul 1
|
||||
(set-tm:mon bdtm 6))
|
||||
((4th-est 4th-last) ; Oct 1
|
||||
(set-tm:mon bdtm 9))))
|
||||
(cons (car (mktime bdtm)) 0))))
|
||||
|
||||
(to-value (gnc:timepair-end-day-time
|
||||
(let ((bdtm from-date))
|
||||
(if (member alt-period
|
||||
'(last-year 1st-last 2nd-last
|
||||
3rd-last 4th-last))
|
||||
(set-tm:year bdtm (- (tm:year bdtm) 1)))
|
||||
;; Bug! Above subtracts two years, should only be one!
|
||||
;; The exact same code, in from-value, further above,
|
||||
;; only subtraces one! Go figure!
|
||||
;; So, we add one back below!
|
||||
(if (member alt-period
|
||||
'(last-year 1st-last 2nd-last
|
||||
3rd-last 4th-last))
|
||||
(set-tm:year bdtm (+ (tm:year bdtm) 1)))
|
||||
(set-tm:mday bdtm 31)
|
||||
(if (< (gnc:date-get-year bdtm) tax-qtr-real-qtr-year)
|
||||
(case alt-period
|
||||
((1st-est 1st-last) ; Mar 31
|
||||
(set-tm:mon bdtm 2))
|
||||
((2nd-est 2nd-last) ; May 31
|
||||
(set-tm:mon bdtm 4))
|
||||
((3rd-est 3rd-last) ; Aug 31
|
||||
(set-tm:mon bdtm 7))
|
||||
((4th-est 4th-last last-year) ; Dec 31
|
||||
(set-tm:mon bdtm 11))
|
||||
(else (set! bdtm (gnc:timepair->date to-value))))
|
||||
;; Tax quaters equal Real quarters
|
||||
(case alt-period
|
||||
((1st-est 1st-last) ; Mar 31
|
||||
(set-tm:mon bdtm 2))
|
||||
((2nd-est 2nd-last) ; Jun 30
|
||||
(set-tm:mday bdtm 30)
|
||||
(set-tm:mon bdtm 5))
|
||||
((3rd-est 3rd-last) ; Sep 30
|
||||
(set-tm:mday bdtm 30)
|
||||
(set-tm:mon bdtm 8))
|
||||
((4th-est 4th-last last-year) ; Dec 31
|
||||
(set-tm:mon bdtm 11))
|
||||
(else
|
||||
(set! bdtm (gnc:timepair->date to-value)))))
|
||||
(cons (car (mktime bdtm)) 0))))
|
||||
)
|
||||
|
||||
(define (handle-level-x-account level account)
|
||||
(let ((type (gnc:account-type->symbol (gnc:account-get-type account)))
|
||||
(name (gnc:account-get-name account)))
|
||||
(if (is-type-income-or-expense? type)
|
||||
(let* ((children (gnc:account-get-children account))
|
||||
(childrens-output (gnc:group-map-accounts
|
||||
(lambda (x)
|
||||
(if (>= max-level (+ 1 level))
|
||||
(handle-level-x-account
|
||||
(+ 1 level) x)))
|
||||
children))
|
||||
|
||||
(account-balance (if (is-key-in-account-notes? tax-key
|
||||
account)
|
||||
(gnc:account-get-balance-interval
|
||||
account
|
||||
from-value
|
||||
to-value #f)
|
||||
0))) ; don't add non tax related
|
||||
|
||||
(set! account-balance (+ (if (> max-level level)
|
||||
(lx-collector (+ 1 level)
|
||||
'total #f)
|
||||
0)
|
||||
;; make positive
|
||||
(if (is-type-income? type)
|
||||
(- account-balance )
|
||||
account-balance)))
|
||||
(lx-collector level 'add account-balance)
|
||||
(let ((level-x-output
|
||||
(render-level-x-account level max-level account
|
||||
account-balance
|
||||
suppress-0 full-names)))
|
||||
(if (equal? 1 level)
|
||||
(lx-collector 1 'reset #f))
|
||||
(if (> max-level level)
|
||||
(lx-collector (+ 1 level) 'reset #f))
|
||||
(if (null? level-x-output)
|
||||
'()
|
||||
(if (null? childrens-output)
|
||||
level-x-output
|
||||
(list level-x-output
|
||||
childrens-output
|
||||
blank-line)))))
|
||||
;; Ignore
|
||||
'())))
|
||||
|
||||
(let
|
||||
((output '())
|
||||
(from-date (strftime "%Y-%b-%d" (localtime (car from-value))))
|
||||
(to-date (strftime "%Y-%b-%d" (localtime (car to-value)))))
|
||||
|
||||
;; Now, the main body
|
||||
;; Reset all the balance collectors
|
||||
(do ((i 1 (+ i 1)))
|
||||
((> i MAX-LEVELS) i)
|
||||
(lx-collector i 'reset #f))
|
||||
|
||||
(set! output (list
|
||||
(map (lambda (x) (handle-level-x-account 1 x))
|
||||
selected-accounts)))
|
||||
|
||||
(list
|
||||
"<html>"
|
||||
"<head>"
|
||||
"<title>" report-name "</title>"
|
||||
"</head>"
|
||||
"<body bgcolor=#f6ffdb>"
|
||||
|
||||
"<center>"
|
||||
"<p>" (string-db 'lookup 'tax-from) from-date
|
||||
(string-db 'lookup 'tax-to) to-date "<br>"
|
||||
"</center>"
|
||||
"<table cellpadding=1>"
|
||||
"<caption><b>" report-name "</b></caption>"
|
||||
"<tr>"
|
||||
"<th>" (string-db 'lookup 'account-name) "</th>"
|
||||
|
||||
(do ((i (- max-level 1) (- i 1))
|
||||
(head "" (string-append head
|
||||
"<th align=right>"
|
||||
(string-db 'lookup 'sub)
|
||||
(number->string i)
|
||||
")</th>")))
|
||||
((< i 1) head))
|
||||
"<th align=right>" (string-db 'lookup 'balance) "</th>"
|
||||
"</tr>"
|
||||
output
|
||||
"</table>"
|
||||
(if (null? (car output))
|
||||
(string-append "<p><b>" (string-db 'lookup 'no-tax) "</b></p>")
|
||||
" ")
|
||||
"</body>"
|
||||
"</html>"))))
|
||||
|
||||
(string-db 'store 'net "Net")
|
||||
(string-db 'store 'account-name "Account Name")
|
||||
(string-db 'store 'no-tax "No Tax Related accounts were found. Click \
|
||||
\"Parameters\" to set some with the \"Set/Reset Tax Status:\" parameter.")
|
||||
(string-db 'store 'sub "(Sub ")
|
||||
(string-db 'store 'balance "Total")
|
||||
(string-db 'store 'tax-title "Taxable / Deductable")
|
||||
(string-db 'store 'tax-from "Period From: ")
|
||||
(string-db 'store 'tax-to " To: ")
|
||||
(string-db 'store 'tax-desc "This page shows your Taxable Income and Deductable Expenses.")
|
||||
|
||||
(gnc:define-report
|
||||
'version 1
|
||||
'name "Tax"
|
||||
'options-generator tax-options-generator
|
||||
'renderer (lambda (options)
|
||||
(generate-tax
|
||||
(string-db 'lookup 'tax-title)
|
||||
(string-db 'lookup 'tax-desc)
|
||||
options))))
|
Loading…
Reference in New Issue
Block a user