*** empty log message ***

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@2072 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2000-03-11 09:11:02 +00:00
parent ef968c2927
commit 1fc99b4ef2
5 changed files with 297 additions and 293 deletions

View File

@ -1,5 +1,8 @@
2000-03-10 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/gnome/window-main.c (gnc_ui_refresh_statusbar): revise the
profit and asset calculation.
* src/MultiLedger.c (xaccLedgerDisplayRefresh): don't reverse the
balances ever -- let the GUI do it.

View File

@ -850,9 +850,9 @@ xaccSRCancelCursorTransChanges (SplitRegister *reg)
affected_accounts[i] = xaccSplitGetAccount (split);
}
affected_accounts[num_splits] = NULL;
xaccTransRollbackEdit (trans);
/* and do some more redraw, for the new set of accounts .. */
more_splits = xaccTransCountSplits (trans);
affected_accounts = (Account **) realloc (affected_accounts,
@ -1049,7 +1049,6 @@ xaccSRSaveRegEntry (SplitRegister *reg, Transaction *newtrans)
#endif
}
/* make sure any open windows of the old account get redrawn */
gnc_account_ui_refresh(old_acc);
gnc_refresh_main_window();
@ -1140,8 +1139,7 @@ xaccSRSaveRegEntry (SplitRegister *reg, Transaction *newtrans)
/* The AMNT and NAMNT updates only differ by sign. Basically,
* the split and transaction cursors show minus the quants that
* the single and double cursors show, and so when updates happen,
* the extra minus sign must also be handled.
*/
* the extra minus sign must also be handled. */
if ((MOD_AMNT | MOD_NAMNT) & changed) {
double new_amount;
double credit;
@ -1186,7 +1184,7 @@ xaccSRSaveRegEntry (SplitRegister *reg, Transaction *newtrans)
* will automatically fix itself once the user closes the window,
* or if they start editing the second split, and so we don't
* really have to do this. This is more of a feel-good thing,
* so that they won't see even breifly what looks like bad values,
* so that they won't see even briefly what looks like bad values,
* and that might give them the willies. We want them to feel good.
*/
acc = xaccSplitGetAccount (split);
@ -1763,7 +1761,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
xaccSRLoadRegEntry (reg, split);
vrow ++;
phys_row += reg->trans_cursor->numRows;
trans = xaccSplitGetParent (split);
split = xaccTransGetSplit (trans, 1);
xaccSetCursor (table, reg->split_cursor, phys_row, 0, vrow, 0);

View File

@ -106,9 +106,6 @@ gnc_ui_refresh_statusbar()
if (children != NULL)
amount += xaccGroupGetBalance(children);
if (gnc_reverse_balance(account))
amount = -amount;
assets += amount;
break;
case INCOME:
@ -117,10 +114,7 @@ gnc_ui_refresh_statusbar()
if (children != NULL)
amount += xaccGroupGetBalance(children);
if (gnc_reverse_balance(account))
amount = -amount;
profits += amount;
profits -= amount;
break;
case EQUITY:
case CURRENCY:

View File

@ -180,75 +180,6 @@
lst ; found, quit search and don't add again
(cons (car lst) (addunique (cdr lst) x))))) ; keep searching
;; find's biggest number in recursive set of vectors
(define (find-largest-in-vector input)
(let loop ((i 0)
(max -9999999)) ; fixme: should be most negative number
(if (= i (vector-length input))
max
(let subloop ((x (vector-ref input i)))
(cond ((vector? x)
(subloop (find-largest-in-vector x)))
((number? x) (if (> x max) (loop (+ i 1) x) (loop (+ i 1) max)))
(else (loop (+ i 1) max)))))))
;; takes in a vector consisting of integers, #f's and vectors (which
;; take integers, #f's and vectors ...)
;; the output vector will contain references to integer N in position N.
;;
;; example:
;; #(1 #(0 #f 2) 3) -> #( (1 0) (0) (1 2) (2) )
(define (find-vector-mappings input)
(let
((outvec (make-vector (+ 1 (find-largest-in-vector input)) #f)))
(let loop ((i 0)
(refs '())
(vec input))
(if (= i (vector-length vec))
outvec
(let ((item (vector-ref vec i)))
(if (vector? item) (loop 0 (cons i refs) item))
(if (integer? item)
(if (>= item 0)
(vector-set! outvec item (reverse (cons i refs)))))
(loop (+ i 1) refs vec))))
outvec))
;; recursively apply vector-ref
(define (vector-N-ref vector ref-list)
(if (eqv? ref-list '())
vector
(vector-N-ref (vector-ref vector (car ref-list)) (cdr ref-list))))
;; map's a recursive vector in a given order (returning a list). the
;; order is as generated by find-vector-mappings.
(define (vector-map-in-specified-order proc vector order)
(let loop ((i 0))
(if (= i (vector-length order))
'()
(let
((ref-list (vector-ref order i)))
(if (not ref-list)
(loop (+ 1 i))
(cons (proc (vector-N-ref vector ref-list))
(loop (+ 1 i))))))))
;; map's a recursive vector in a given order (returning a list). the
;; order is as generated by find-vector-mappings. the procedure is a
;; vector itself, with the same structure as the input vector.
(define (vector-map-in-specified-order-uniquely procvec vector order)
(let loop ((i 0))
(if (= i (vector-length order))
'()
(let
((ref-list (vector-ref order i)))
(if (not ref-list)
(loop (+ 1 i))
(cons ((vector-N-ref procvec ref-list)
(vector-N-ref vector ref-list))
(loop (+ 1 i))))))))
;;; applies thunk to each split in account account
(define (gnc:for-each-split-in-account account thunk)
(gnc:for-loop (lambda (x)

View File

@ -11,26 +11,26 @@
;; paychecks & rent payments -- specific dates
(require 'sort)
(require 'record)
(gnc:depend "report-utilities.scm")
(gnc:depend "html-generator.scm")
(gnc:depend "date-utilities.scm")
;; time values
;(define gnc:budget-day 1)
;(define gnc:budget-week 2)
;(define gnc:budget-month 3)
;(define gnc:budget-year 4)
;(define gnc:budget-day 1)
;(define gnc:budget-week 2)
;(define gnc:budget-month 3)
;(define gnc:budget-year 4)
;; budget types
;(define gnc:budget-recurring 1) ; regular, recurring budget expenses
; that happen once per period
;(define gnc:budget-contingency 2) ; a budget item where you estimate a
; value over a long period for
; unexpected expenses.
;(define gnc:budget-recurring 1) ; regular, recurring budget expenses
; that happen once per period
;(define gnc:budget-contingency 2) ; a budget item where you estimate a
; value over a long period for
; unexpected expenses.
;; convert a date to a defined fraction
(define (gnc:date-to-N-fraction caltime type)
(display type) (newline)
(case type
((gnc:budget-day) (gnc:date-to-day-fraction caltime))
((gnc:budget-week) (gnc:date-to-week-fraction caltime))
@ -54,176 +54,220 @@
;; (in colon delimited format)
;; 3 - period: the time span of the budget line in #4
;; 4 - period-type:
;; 5 - triggers: as yet undefined
;; 5 - budget type
;; 6 - triggers???
(define (make-budget-entry desc amt acct per ptype trigger)
(vector desc amt acct per ptype trigger))
(define budget-entry-structure
(make-record-type
"budget-entry-structure"
'(description amount accounts period period-type budget-type)))
(define gnc:budget
(vector
(define (make-budget-entry desc amt acct per ptype budget-type)
((record-constructor budget-entry-structure)
desc amt acct per ptype budget-type))
(define gnc:budget-entries
(list
(make-budget-entry "lunch" 8 '("Food:Lunch") 1
'gnc:budget-day 'gnc:budget-recurring)
'gnc:budget-day 'gnc:budget-recurring)
(make-budget-entry "junk food" 0.50 '("Food:Junk") 1
'gnc:budget-day 'gnc:budget-recurring)
'gnc:budget-day 'gnc:budget-recurring)
(make-budget-entry "car repairs" 2500 '("Car:Repairs") 5
'gnc:budget-year 'gnc:budget-contingency)))
'gnc:budget-year 'gnc:budget-contingency)))
;;; For future: make-budget-entry should create a structure.
;;; And gnc:budget should be a list, not a vector.
(define (budget-entry-get-description budget-entry)
((record-accessor budget-entry-structure 'description) budget-entry))
(define gnc:budget-headers
#(("" "Description")
("Amount" "per Period")
("" "Accounts")
("Period" "Size")
("Period" "Size Units")
("Budget" "Type")))
(define (budget-entry-get-amount budget-entry)
((record-accessor budget-entry-structure 'amount) budget-entry))
(define (gnc:budget-html-cell-pred)
(vector
(lambda (item)
(html-generic-cell #f #f #f item))
(lambda (item)
(html-currency-cell #f #f item))
(lambda (item)
'()) ; todo: accounts
(lambda (item)
(html-number-cell #f #f "%i" item))
(lambda (item)
(html-generic-cell #f #f #f (gnc:date-describe-type item)))
(lambda (item)
'()))) ; todo: budget-type
(define (budget-entry-get-accounts budget-entry)
((record-accessor budget-entry-structure 'accounts) budget-entry))
(define (gnc:budget-get-description budget-line)
(vector-ref budget-line 0))
(define (budget-entry-get-period budget-entry)
((record-accessor budget-entry-structure 'period) budget-entry))
(define (gnc:budget-get-amount budget-line)
(vector-ref budget-line 1))
(define (budget-entry-get-period-type budget-entry)
((record-accessor budget-entry-structure 'period-type) budget-entry))
(define (gnc:budget-get-accounts budget-line)
(vector-ref budget-line 2))
(define (budget-description-html-proc)
(lambda (budget-line)
(html-generic-cell #f #f #f
(budget-entry-get-description
(budget-line-get-entry budget-line)))))
(define (gnc:budget-get-period budget-line)
(vector-ref budget-line 3))
(define (budget-amount-html-proc)
(lambda (budget-line)
(html-currency-cell #f #f (budget-entry-get-amount
(budget-line-get-entry budget-line)))))
;; fixme -- only returns the first account in the list
(define (budget-accounts-html-proc)
(lambda (budget-line)
(html-generic-cell
#f #f #f
(car (budget-entry-get-accounts (budget-line-get-entry budget-line))))))
(define (budget-period-html-proc)
(lambda (budget-line)
(html-number-cell
#f #f "%i" (budget-entry-get-period (budget-line-get-entry budget-line)))))
(define (budget-period-type-html-proc)
(lambda (budget-line)
(html-generic-cell
#f #f #f
(gnc:date-describe-type
(budget-entry-get-period-type (budget-line-get-entry budget-line))))))
(define (gnc:budget-get-period-type budget-line)
(vector-ref budget-line 4))
;; budget report: a vector with indexes corresponding to the budget
;; 0 - actual: the amount spend / recieved
;; 1 - budgeted: the budgeted amount. Simply the periods * amount
;; 2 - periods: the number of periods for the line in the report
;; 2 - num-periods: the number of periods for the line in the report
;; 3 - mimimum-expected: minimum you expected to spend during the
;; report period
;; 4 - maximum-expected: the maximum you can spend in the report period
;; 5 - time remaining: how much of a period is remaining until the end
;; of the budget period
(define gnc:budget-report-headers
#(("Amount" "Spent")
("Amount" "Budgeted")
("Number of" "Periods")
("Lower" "Limit")
("Upper" "Limit")
("Time" "Remaining")))
(define budget-report-structure
(make-record-type
"budget-report-structure"
'(actual budgeted num-periods minimum-expected maximum-expected
time-remaining)))
(define (gnc:budget-report-html-cell-pred)
(vector
(lambda (item)
(html-currency-cell #f #f item))
(lambda (item)
(html-currency-cell #f #f item))
(lambda (item)
(html-number-cell #f #f "%.1f" item))
(lambda (item)
(html-currency-cell #f #f item))
(lambda (item)
(html-currency-cell #f #f item))
(lambda (item)
(html-number-cell #f #f "%.1f" item))))
(define (make-empty-budget-report)
((record-constructor budget-report-structure)
0 0 0 0 0 0))
(define (gnc:budget-report-get-actual brep-line)
(vector-ref brep-line 0))
(define (budget-report-get-actual brep)
((record-accessor budget-report-structure 'actual) brep))
(define (gnc:budget-report-get-budgeted brep-line)
(vector-ref brep-line 1))
(define (budget-report-get-budgeted brep)
((record-accessor budget-report-structure 'budgeted) brep))
(define (gnc:budget-report-get-periods brep-line)
(vector-ref brep-line 2))
(define (budget-report-get-num-periods brep)
((record-accessor budget-report-structure 'num-periods) brep))
(define (gnc:budget-report-get-minimum-expected brep-line)
(vector-ref brep-line 3))
(define (budget-report-get-minimum-expected brep)
((record-accessor budget-report-structure 'minimum-expected) brep))
(define (gnc:budget-report-get-maximum-expected brep-line)
(vector-ref brep-line 4))
(define (budget-report-get-maximum-expected brep)
((record-accessor budget-report-structure 'maximum-expected) brep))
(define (budget-report-get-time-remaining brep)
((record-accessor budget-report-structure 'time-remaining) brep))
(define (budget-actual-html-proc)
(lambda (budget-line)
(html-currency-cell #f #f (budget-report-get-actual
(budget-line-get-report budget-line)))))
(define (budget-budgeted-html-proc)
(lambda (budget-line)
(html-currency-cell #f #f (budget-report-get-budgeted
(budget-line-get-report budget-line)))))
(define (budget-num-periods-html-proc)
(lambda (budget-line)
(html-number-cell #f #f "%.1f" (budget-report-get-num-periods
(budget-line-get-report budget-line)))))
(define (budget-minimum-expected-html-proc)
(lambda (budget-line)
(html-currency-cell #f #f (budget-report-get-minimum-expected
(budget-line-get-report budget-line)))))
(define (budget-maximum-expected-html-proc)
(lambda (budget-line)
(html-currency-cell #f #f (budget-report-get-maximum-expected
(budget-line-get-report budget-line)))))
(define (budget-time-remaining-html-proc)
(lambda (budget-line)
(html-number-cell #f #f "%.1f" (budget-report-get-time-remaining
(budget-line-get-report budget-line)))))
(define budget-line-structure
(make-record-type "budget-line-structure"
'(entry report)))
(define (make-budget-line entry report)
((record-constructor budget-line-structure) entry report))
(define (budget-line-get-entry line)
((record-accessor budget-line-structure 'entry) line))
(define (budget-line-get-report line)
((record-accessor budget-line-structure 'report) line))
(define (gnc:budget-report-get-time-remaining brep-line)
(vector-ref brep-line 5))
;; add a value to the budget accumulator
(define (gnc:budget-accumulate-actual! value budget-report-line)
(vector-set! budget-report-line 0
(+ (gnc:budget-report-get-actual budget-report-line)
value)))
(define (budget-report-accumulate-actual! value budget-line)
((record-modifier budget-report-structure 'actual)
(budget-line-get-report budget-line)
(+ value (budget-report-get-actual (budget-line-get-report budget-line)))))
;; calculate the # of periods on a budget line.
;; dates are in # seconds after 1970
(define (gnc:budget-calculate-periods! budget-line budget-report-line
begin-date end-date)
(display "gnc:budget-calculate-periods! ")
(let* ((N-type (gnc:budget-get-period-type budget-line))
(define (budget-calculate-periods! budget-line begin-date end-date)
(let* ((entry (budget-line-get-entry budget-line))
(N-type (budget-entry-get-period-type entry))
(begin-N (gnc:date-to-N-fraction begin-date N-type))
(end-N (gnc:date-to-N-fraction end-date N-type)))
(display " type:") (display N-type)
(display "begin-N:") (display begin-N)
(display " end-N:") (display end-N) (newline)
(newline)
(vector-set! budget-report-line 2
(/ (- end-N begin-N)
(gnc:budget-get-period budget-line)))))
((record-modifier budget-report-structure 'num-periods)
(budget-line-get-report budget-line)
(/ (- end-N begin-N)
(budget-entry-get-period entry)))))
;; calculate the budgeted value.
;; dependency: budget-calculate-periods!
(define (gnc:budget-calculate-budgeted! budget-line budget-report-line)
(vector-set! budget-report-line 1
(* (gnc:budget-get-amount budget-line)
(gnc:budget-report-get-periods budget-report-line))))
(define (budget-calculate-budgeted! budget-line)
((record-modifier budget-report-structure 'budgeted)
(budget-line-get-report budget-line)
(* (budget-entry-get-amount (budget-line-get-entry budget-line))
(budget-report-get-num-periods (budget-line-get-report budget-line)))))
;; calculate the values for minimum-expected and maxmimum-expected
;; dependency: budget-calculate-periods!
(define (gnc:budget-calculate-expected! budget-line budget-report-line)
(begin
(vector-set!
budget-report-line 3
(* (gnc:budget-get-amount budget-line)
(floor (gnc:budget-report-get-periods budget-report-line))))
(vector-set!
budget-report-line 4
(* (gnc:budget-get-amount budget-line)
(ceiling (gnc:budget-report-get-periods budget-report-line))))))
(define (budget-calculate-expected! budget-line)
(let ((brep (budget-line-get-report budget-line))
(entry (budget-line-get-entry budget-line)))
; fixme: contingency type budget entries may have a lower minimum
((record-modifier budget-report-structure 'minimum-expected) brep
(* (budget-entry-get-amount entry)
(floor (budget-report-get-num-periods brep))))
((record-modifier budget-report-structure 'maximum-expected) brep
(* (budget-entry-get-amount entry)
(ceiling (budget-report-get-num-periods brep))))))
;; calculate the amount of time remaining in the budget period
;; dependency: budget-calculate-periods!
(define (gnc:budget-calculate-time-remaining! budget-line budget-report-line)
(display "gnc:budget-calculate-time-remaining!") (newline)
(vector-set!
budget-report-line 5
(* (- (ceiling (gnc:budget-report-get-periods budget-report-line))
(gnc:budget-report-get-periods budget-report-line))
(gnc:budget-get-period budget-line))))
(define (budget-calculate-time-remaining! budget-line)
(let* ((entry (budget-line-get-entry budget-line))
(brep (budget-line-get-report budget-line))
(periods (budget-report-get-num-periods brep)))
((record-modifier budget-report-structure 'time-remaining) brep
(* (- (ceiling periods) periods)
(budget-entry-get-period entry)))))
;; given an account name, return the budget line number
;; given an account name, return the budget line
;; return #f if there is no budget line for that account
(define (gnc:budget-get-line-number account-name budget)
(let loop ((i 0))
(cond ((= i (vector-length budget)) #f)
((let loop2
((accounts (gnc:budget-get-accounts (vector-ref budget i))))
(cond ((null? accounts) #f)
(else (or (string=? account-name (car accounts))
(loop2 (cdr accounts)))))) i)
(else (loop (+ i 1))))))
(define (budget-get-line account-name budget)
(cond ((null? budget) #f)
(else
(let loop2
((accounts (budget-entry-get-accounts
(budget-line-get-entry (car budget)))))
(cond ((null? accounts) #f)
(else
(cond ((or (string=? account-name (car accounts))
(loop2 (cdr accounts)))
(car budget))
(else
(budget-get-line account-name (cdr budget))))))))))
;; register a configuration option for the budget report
(define (budget-report-options-generator)
@ -241,13 +285,13 @@
"a" "Report start date"
(lambda ()
(let ((bdtime (localtime (current-time))))
(set-tm:sec bdtime 0)
(set-tm:min bdtime 0)
(set-tm:hour bdtime 0)
(set-tm:mday bdtime 1)
(set-tm:mon bdtime 0)
(let ((time (car (mktime bdtime))))
(cons time 0))))
(set-tm:sec bdtime 0)
(set-tm:min bdtime 0)
(set-tm:hour bdtime 0)
(set-tm:mday bdtime 1)
(set-tm:mon bdtime 0)
(let ((time (car (mktime bdtime))))
(cons time 0))))
#f))
;; to-date
@ -284,102 +328,136 @@
budget-report-options-generator
;; renderer
(lambda (options)
(let* ((maxrow (vector-length gnc:budget))
;;; Note that by using maxrow, *all* references to
;;; (vector-length gnc:budget) disappear, and this notably
;;; takes some code out of at least 3 loops...
(begindate (gnc:lookup-option options "Report Options" "From"))
(let* ((begindate (gnc:lookup-option options "Report Options" "From"))
(enddate (gnc:lookup-option options "Report Options" "To"))
(date-filter-pred (gnc:tr-report-make-filter-predicate
(gnc:option-value begindate)
(gnc:option-value enddate)))
(begin-date-secs (car (gnc:timepair-canonical-day-time
(gnc:option-value begindate))))
(gnc:option-value begindate))))
(end-date-secs (car (gnc:timepair-canonical-day-time
(gnc:option-value enddate))))
(budget-report (make-vector maxrow))
(budget-order #())
(budget-report-order #()))
(gnc:debug gnc:budget)
(do ((i 0 (+ i 1)))
((= i maxrow))
(vector-set! budget-report i (vector 0 0 0 0 0 0)))
(budget-list (map
(lambda (entry)
(make-budget-line entry (make-empty-budget-report)))
gnc:budget-entries)))
(gnc:debug "a")
(let loop ((group (gnc:get-current-group)))
(if (not (pointer-token-null? group))
(gnc:group-map-accounts
(lambda (account)
(let ((line
(gnc:budget-get-line-number
(budget-get-line
(gnc:account-get-full-name account)
gnc:budget))
(children (gnc:account-get-children account)))
budget-list)))
(if line
(gnc:for-each-split-in-account
account
(lambda (split)
(gnc:budget-accumulate-actual!
(gnc:split-get-value split)
(vector-ref budget-report line)))))
(loop children)))
(budget-report-accumulate-actual!
(gnc:split-get-value split) line))))
(loop (gnc:account-get-children account))))
group)))
;;; Note: This shouldn't need to use a set of vectors...
(do ((i 0 (+ i 1)))
((= i maxrow))
(let ((budget-line (vector-ref gnc:budget i))
(budget-report-line (vector-ref budget-report i)))
(gnc:budget-calculate-periods!
budget-line budget-report-line begin-date-secs end-date-secs)
(gnc:budget-calculate-budgeted! budget-line budget-report-line)
(gnc:budget-calculate-expected! budget-line budget-report-line)
(gnc:budget-calculate-time-remaining! budget-line budget-report-line)))
(gnc:debug budget-report)
(gnc:debug "b")
(case (gnc:option-value
(gnc:lookup-option options "Report Options" "View"))
((full)
(set! budget-order (vector 1 2 #f 3 4 #f))
(set! budget-report-order (vector 5 6 7 8 9 10)))
((balancing)
(set! budget-order #(1 2 #f 3 4 #f))
(set! budget-report-order #(#f 6 5 #f #f #f)))
((status)
(set! budget-order #(1 #f #f #f 3 #f))
(set! budget-report-order #(10 #f #f 4 5 2)))
(else
(gnc:debug "Invalid view option")))
(let ((order (find-vector-mappings
(vector budget-order budget-report-order))))
(for-each
(lambda (line)
(begin
(budget-calculate-periods! line begin-date-secs end-date-secs)
(budget-calculate-budgeted! line)
(budget-calculate-expected! line)
(budget-calculate-time-remaining! line)))
budget-list)
(gnc:debug "c")
(let ((report-headers '())
(report-procs '()))
(case (gnc:option-value
(gnc:lookup-option options "Report Options" "View"))
((full)
(set! report-headers (list
"Description"
"Amount"
"Accounts"
"Period"
""
"Actual"
"Budgeted"
"Number of Periods"
"Lower Limit"
"Upper Limit"
"Time Remaining"
""))
(set! report-procs (list
budget-description-html-proc
budget-amount-html-proc
budget-accounts-html-proc
budget-period-html-proc
budget-period-type-html-proc
budget-actual-html-proc
budget-budgeted-html-proc
budget-num-periods-html-proc
budget-minimum-expected-html-proc
budget-maximum-expected-html-proc
budget-time-remaining-html-proc
budget-period-type-html-proc)))
((balancing)
(set! report-headers (list
"Description"
"Accounts"
"Period"
""
"Amount"
"Number of Periods"
"Budgeted"))
(set! report-procs (list
budget-description-html-proc
budget-accounts-html-proc
budget-period-html-proc
budget-period-type-html-proc
budget-amount-html-proc
budget-num-periods-html-proc
budget-budgeted-html-proc)))
((status)
(set! report-headers (list
"Description"
"Time Remaining"
""
"Lower Limit"
"Upper Limit"
"Actual"))
(set! report-procs (list
budget-description-html-proc
budget-time-remaining-html-proc
budget-period-type-html-proc
budget-minimum-expected-html-proc
budget-maximum-expected-html-proc
budget-actual-html-proc)))
(else
(gnc:debug "Invalid view option")))
(list
(html-start-document)
"<p>This is a budget report. It is very preliminary, but you may find it useful. To actually change the budget, currently you have to edit budget-report.scm.</p>"
(html-start-table)
(html-table-row-manual
(vector-map-in-specified-order
(lambda (item) (html-cell-header (car item)))
(vector gnc:budget-headers gnc:budget-report-headers)
order))
(html-table-row-manual
(vector-map-in-specified-order
(lambda (item) (html-cell-header (cadr item)))
(vector gnc:budget-headers gnc:budget-report-headers)
order))
;;; This loop ought not to need to use a vector
(let loop ((row 0))
(if (= row maxrow)
'()
(cons
(html-table-row-manual
(vector-map-in-specified-order-uniquely
(vector (gnc:budget-html-cell-pred)
(gnc:budget-report-html-cell-pred))
(vector (vector-ref gnc:budget row)
(vector-ref budget-report row))
order))
(loop (+ row 1)))))
(map-in-order
(lambda (item) (html-cell-header item))
report-headers))
(map-in-order
(lambda (line)
(html-table-row-manual
(map-in-order
(lambda (proc)
((proc) line))
report-procs)))
budget-list)
(html-end-table)
(html-end-document))))))