mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
*** 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:
parent
ef968c2927
commit
1fc99b4ef2
@ -1,5 +1,8 @@
|
|||||||
2000-03-10 Dave Peticolas <peticola@cs.ucdavis.edu>
|
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
|
* src/MultiLedger.c (xaccLedgerDisplayRefresh): don't reverse the
|
||||||
balances ever -- let the GUI do it.
|
balances ever -- let the GUI do it.
|
||||||
|
|
||||||
|
@ -850,9 +850,9 @@ xaccSRCancelCursorTransChanges (SplitRegister *reg)
|
|||||||
affected_accounts[i] = xaccSplitGetAccount (split);
|
affected_accounts[i] = xaccSplitGetAccount (split);
|
||||||
}
|
}
|
||||||
affected_accounts[num_splits] = NULL;
|
affected_accounts[num_splits] = NULL;
|
||||||
|
|
||||||
xaccTransRollbackEdit (trans);
|
xaccTransRollbackEdit (trans);
|
||||||
|
|
||||||
/* and do some more redraw, for the new set of accounts .. */
|
/* and do some more redraw, for the new set of accounts .. */
|
||||||
more_splits = xaccTransCountSplits (trans);
|
more_splits = xaccTransCountSplits (trans);
|
||||||
affected_accounts = (Account **) realloc (affected_accounts,
|
affected_accounts = (Account **) realloc (affected_accounts,
|
||||||
@ -1049,7 +1049,6 @@ xaccSRSaveRegEntry (SplitRegister *reg, Transaction *newtrans)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* make sure any open windows of the old account get redrawn */
|
/* make sure any open windows of the old account get redrawn */
|
||||||
gnc_account_ui_refresh(old_acc);
|
gnc_account_ui_refresh(old_acc);
|
||||||
gnc_refresh_main_window();
|
gnc_refresh_main_window();
|
||||||
@ -1140,8 +1139,7 @@ xaccSRSaveRegEntry (SplitRegister *reg, Transaction *newtrans)
|
|||||||
/* The AMNT and NAMNT updates only differ by sign. Basically,
|
/* The AMNT and NAMNT updates only differ by sign. Basically,
|
||||||
* the split and transaction cursors show minus the quants that
|
* the split and transaction cursors show minus the quants that
|
||||||
* the single and double cursors show, and so when updates happen,
|
* 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) {
|
if ((MOD_AMNT | MOD_NAMNT) & changed) {
|
||||||
double new_amount;
|
double new_amount;
|
||||||
double credit;
|
double credit;
|
||||||
@ -1186,7 +1184,7 @@ xaccSRSaveRegEntry (SplitRegister *reg, Transaction *newtrans)
|
|||||||
* will automatically fix itself once the user closes the window,
|
* will automatically fix itself once the user closes the window,
|
||||||
* or if they start editing the second split, and so we don't
|
* 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,
|
* 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.
|
* and that might give them the willies. We want them to feel good.
|
||||||
*/
|
*/
|
||||||
acc = xaccSplitGetAccount (split);
|
acc = xaccSplitGetAccount (split);
|
||||||
@ -1763,7 +1761,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
|
|||||||
xaccSRLoadRegEntry (reg, split);
|
xaccSRLoadRegEntry (reg, split);
|
||||||
vrow ++;
|
vrow ++;
|
||||||
phys_row += reg->trans_cursor->numRows;
|
phys_row += reg->trans_cursor->numRows;
|
||||||
|
|
||||||
trans = xaccSplitGetParent (split);
|
trans = xaccSplitGetParent (split);
|
||||||
split = xaccTransGetSplit (trans, 1);
|
split = xaccTransGetSplit (trans, 1);
|
||||||
xaccSetCursor (table, reg->split_cursor, phys_row, 0, vrow, 0);
|
xaccSetCursor (table, reg->split_cursor, phys_row, 0, vrow, 0);
|
||||||
|
@ -106,9 +106,6 @@ gnc_ui_refresh_statusbar()
|
|||||||
if (children != NULL)
|
if (children != NULL)
|
||||||
amount += xaccGroupGetBalance(children);
|
amount += xaccGroupGetBalance(children);
|
||||||
|
|
||||||
if (gnc_reverse_balance(account))
|
|
||||||
amount = -amount;
|
|
||||||
|
|
||||||
assets += amount;
|
assets += amount;
|
||||||
break;
|
break;
|
||||||
case INCOME:
|
case INCOME:
|
||||||
@ -117,10 +114,7 @@ gnc_ui_refresh_statusbar()
|
|||||||
if (children != NULL)
|
if (children != NULL)
|
||||||
amount += xaccGroupGetBalance(children);
|
amount += xaccGroupGetBalance(children);
|
||||||
|
|
||||||
if (gnc_reverse_balance(account))
|
profits -= amount;
|
||||||
amount = -amount;
|
|
||||||
|
|
||||||
profits += amount;
|
|
||||||
break;
|
break;
|
||||||
case EQUITY:
|
case EQUITY:
|
||||||
case CURRENCY:
|
case CURRENCY:
|
||||||
|
@ -180,75 +180,6 @@
|
|||||||
lst ; found, quit search and don't add again
|
lst ; found, quit search and don't add again
|
||||||
(cons (car lst) (addunique (cdr lst) x))))) ; keep searching
|
(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
|
;;; applies thunk to each split in account account
|
||||||
(define (gnc:for-each-split-in-account account thunk)
|
(define (gnc:for-each-split-in-account account thunk)
|
||||||
(gnc:for-loop (lambda (x)
|
(gnc:for-loop (lambda (x)
|
||||||
|
@ -11,26 +11,26 @@
|
|||||||
;; paychecks & rent payments -- specific dates
|
;; paychecks & rent payments -- specific dates
|
||||||
|
|
||||||
(require 'sort)
|
(require 'sort)
|
||||||
|
(require 'record)
|
||||||
(gnc:depend "report-utilities.scm")
|
(gnc:depend "report-utilities.scm")
|
||||||
(gnc:depend "html-generator.scm")
|
(gnc:depend "html-generator.scm")
|
||||||
(gnc:depend "date-utilities.scm")
|
(gnc:depend "date-utilities.scm")
|
||||||
|
|
||||||
;; time values
|
;; time values
|
||||||
;(define gnc:budget-day 1)
|
;(define gnc:budget-day 1)
|
||||||
;(define gnc:budget-week 2)
|
;(define gnc:budget-week 2)
|
||||||
;(define gnc:budget-month 3)
|
;(define gnc:budget-month 3)
|
||||||
;(define gnc:budget-year 4)
|
;(define gnc:budget-year 4)
|
||||||
|
|
||||||
;; budget types
|
;; budget types
|
||||||
;(define gnc:budget-recurring 1) ; regular, recurring budget expenses
|
;(define gnc:budget-recurring 1) ; regular, recurring budget expenses
|
||||||
; that happen once per period
|
; that happen once per period
|
||||||
;(define gnc:budget-contingency 2) ; a budget item where you estimate a
|
;(define gnc:budget-contingency 2) ; a budget item where you estimate a
|
||||||
; value over a long period for
|
; value over a long period for
|
||||||
; unexpected expenses.
|
; unexpected expenses.
|
||||||
|
|
||||||
;; convert a date to a defined fraction
|
;; convert a date to a defined fraction
|
||||||
(define (gnc:date-to-N-fraction caltime type)
|
(define (gnc:date-to-N-fraction caltime type)
|
||||||
(display type) (newline)
|
|
||||||
(case type
|
(case type
|
||||||
((gnc:budget-day) (gnc:date-to-day-fraction caltime))
|
((gnc:budget-day) (gnc:date-to-day-fraction caltime))
|
||||||
((gnc:budget-week) (gnc:date-to-week-fraction caltime))
|
((gnc:budget-week) (gnc:date-to-week-fraction caltime))
|
||||||
@ -54,176 +54,220 @@
|
|||||||
;; (in colon delimited format)
|
;; (in colon delimited format)
|
||||||
;; 3 - period: the time span of the budget line in #4
|
;; 3 - period: the time span of the budget line in #4
|
||||||
;; 4 - period-type:
|
;; 4 - period-type:
|
||||||
;; 5 - triggers: as yet undefined
|
;; 5 - budget type
|
||||||
|
;; 6 - triggers???
|
||||||
|
|
||||||
(define (make-budget-entry desc amt acct per ptype trigger)
|
(define budget-entry-structure
|
||||||
(vector desc amt acct per ptype trigger))
|
(make-record-type
|
||||||
|
"budget-entry-structure"
|
||||||
|
'(description amount accounts period period-type budget-type)))
|
||||||
|
|
||||||
(define gnc:budget
|
(define (make-budget-entry desc amt acct per ptype budget-type)
|
||||||
(vector
|
((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
|
(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
|
(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
|
(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.
|
(define (budget-entry-get-description budget-entry)
|
||||||
;;; And gnc:budget should be a list, not a vector.
|
((record-accessor budget-entry-structure 'description) budget-entry))
|
||||||
|
|
||||||
(define gnc:budget-headers
|
(define (budget-entry-get-amount budget-entry)
|
||||||
#(("" "Description")
|
((record-accessor budget-entry-structure 'amount) budget-entry))
|
||||||
("Amount" "per Period")
|
|
||||||
("" "Accounts")
|
|
||||||
("Period" "Size")
|
|
||||||
("Period" "Size Units")
|
|
||||||
("Budget" "Type")))
|
|
||||||
|
|
||||||
(define (gnc:budget-html-cell-pred)
|
(define (budget-entry-get-accounts budget-entry)
|
||||||
(vector
|
((record-accessor budget-entry-structure 'accounts) budget-entry))
|
||||||
(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 (gnc:budget-get-description budget-line)
|
(define (budget-entry-get-period budget-entry)
|
||||||
(vector-ref budget-line 0))
|
((record-accessor budget-entry-structure 'period) budget-entry))
|
||||||
|
|
||||||
(define (gnc:budget-get-amount budget-line)
|
(define (budget-entry-get-period-type budget-entry)
|
||||||
(vector-ref budget-line 1))
|
((record-accessor budget-entry-structure 'period-type) budget-entry))
|
||||||
|
|
||||||
(define (gnc:budget-get-accounts budget-line)
|
(define (budget-description-html-proc)
|
||||||
(vector-ref budget-line 2))
|
(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)
|
(define (budget-amount-html-proc)
|
||||||
(vector-ref budget-line 3))
|
(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
|
;; budget report: a vector with indexes corresponding to the budget
|
||||||
;; 0 - actual: the amount spend / recieved
|
;; 0 - actual: the amount spend / recieved
|
||||||
;; 1 - budgeted: the budgeted amount. Simply the periods * amount
|
;; 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
|
;; 3 - mimimum-expected: minimum you expected to spend during the
|
||||||
;; report period
|
;; report period
|
||||||
;; 4 - maximum-expected: the maximum you can spend in 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
|
;; 5 - time remaining: how much of a period is remaining until the end
|
||||||
;; of the budget period
|
;; of the budget period
|
||||||
|
|
||||||
(define gnc:budget-report-headers
|
(define budget-report-structure
|
||||||
#(("Amount" "Spent")
|
(make-record-type
|
||||||
("Amount" "Budgeted")
|
"budget-report-structure"
|
||||||
("Number of" "Periods")
|
'(actual budgeted num-periods minimum-expected maximum-expected
|
||||||
("Lower" "Limit")
|
time-remaining)))
|
||||||
("Upper" "Limit")
|
|
||||||
("Time" "Remaining")))
|
|
||||||
|
|
||||||
(define (gnc:budget-report-html-cell-pred)
|
(define (make-empty-budget-report)
|
||||||
(vector
|
((record-constructor budget-report-structure)
|
||||||
(lambda (item)
|
0 0 0 0 0 0))
|
||||||
(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 (gnc:budget-report-get-actual brep-line)
|
(define (budget-report-get-actual brep)
|
||||||
(vector-ref brep-line 0))
|
((record-accessor budget-report-structure 'actual) brep))
|
||||||
|
|
||||||
(define (gnc:budget-report-get-budgeted brep-line)
|
(define (budget-report-get-budgeted brep)
|
||||||
(vector-ref brep-line 1))
|
((record-accessor budget-report-structure 'budgeted) brep))
|
||||||
|
|
||||||
(define (gnc:budget-report-get-periods brep-line)
|
(define (budget-report-get-num-periods brep)
|
||||||
(vector-ref brep-line 2))
|
((record-accessor budget-report-structure 'num-periods) brep))
|
||||||
|
|
||||||
(define (gnc:budget-report-get-minimum-expected brep-line)
|
(define (budget-report-get-minimum-expected brep)
|
||||||
(vector-ref brep-line 3))
|
((record-accessor budget-report-structure 'minimum-expected) brep))
|
||||||
|
|
||||||
(define (gnc:budget-report-get-maximum-expected brep-line)
|
(define (budget-report-get-maximum-expected brep)
|
||||||
(vector-ref brep-line 4))
|
((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
|
;; add a value to the budget accumulator
|
||||||
(define (gnc:budget-accumulate-actual! value budget-report-line)
|
(define (budget-report-accumulate-actual! value budget-line)
|
||||||
(vector-set! budget-report-line 0
|
((record-modifier budget-report-structure 'actual)
|
||||||
(+ (gnc:budget-report-get-actual budget-report-line)
|
(budget-line-get-report budget-line)
|
||||||
value)))
|
(+ value (budget-report-get-actual (budget-line-get-report budget-line)))))
|
||||||
|
|
||||||
;; calculate the # of periods on a budget line.
|
;; calculate the # of periods on a budget line.
|
||||||
;; dates are in # seconds after 1970
|
;; dates are in # seconds after 1970
|
||||||
(define (gnc:budget-calculate-periods! budget-line budget-report-line
|
(define (budget-calculate-periods! budget-line begin-date end-date)
|
||||||
begin-date end-date)
|
(let* ((entry (budget-line-get-entry budget-line))
|
||||||
(display "gnc:budget-calculate-periods! ")
|
(N-type (budget-entry-get-period-type entry))
|
||||||
(let* ((N-type (gnc:budget-get-period-type budget-line))
|
|
||||||
(begin-N (gnc:date-to-N-fraction begin-date N-type))
|
(begin-N (gnc:date-to-N-fraction begin-date N-type))
|
||||||
(end-N (gnc:date-to-N-fraction end-date N-type)))
|
(end-N (gnc:date-to-N-fraction end-date N-type)))
|
||||||
(display " type:") (display N-type)
|
((record-modifier budget-report-structure 'num-periods)
|
||||||
(display "begin-N:") (display begin-N)
|
(budget-line-get-report budget-line)
|
||||||
(display " end-N:") (display end-N) (newline)
|
(/ (- end-N begin-N)
|
||||||
(newline)
|
(budget-entry-get-period entry)))))
|
||||||
(vector-set! budget-report-line 2
|
|
||||||
(/ (- end-N begin-N)
|
|
||||||
(gnc:budget-get-period budget-line)))))
|
|
||||||
|
|
||||||
;; calculate the budgeted value.
|
;; calculate the budgeted value.
|
||||||
;; dependency: budget-calculate-periods!
|
;; dependency: budget-calculate-periods!
|
||||||
(define (gnc:budget-calculate-budgeted! budget-line budget-report-line)
|
(define (budget-calculate-budgeted! budget-line)
|
||||||
(vector-set! budget-report-line 1
|
((record-modifier budget-report-structure 'budgeted)
|
||||||
(* (gnc:budget-get-amount budget-line)
|
(budget-line-get-report budget-line)
|
||||||
(gnc:budget-report-get-periods budget-report-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
|
;; calculate the values for minimum-expected and maxmimum-expected
|
||||||
;; dependency: budget-calculate-periods!
|
;; dependency: budget-calculate-periods!
|
||||||
(define (gnc:budget-calculate-expected! budget-line budget-report-line)
|
(define (budget-calculate-expected! budget-line)
|
||||||
(begin
|
(let ((brep (budget-line-get-report budget-line))
|
||||||
(vector-set!
|
(entry (budget-line-get-entry budget-line)))
|
||||||
budget-report-line 3
|
; fixme: contingency type budget entries may have a lower minimum
|
||||||
(* (gnc:budget-get-amount budget-line)
|
((record-modifier budget-report-structure 'minimum-expected) brep
|
||||||
(floor (gnc:budget-report-get-periods budget-report-line))))
|
(* (budget-entry-get-amount entry)
|
||||||
(vector-set!
|
(floor (budget-report-get-num-periods brep))))
|
||||||
budget-report-line 4
|
((record-modifier budget-report-structure 'maximum-expected) brep
|
||||||
(* (gnc:budget-get-amount budget-line)
|
(* (budget-entry-get-amount entry)
|
||||||
(ceiling (gnc:budget-report-get-periods budget-report-line))))))
|
(ceiling (budget-report-get-num-periods brep))))))
|
||||||
|
|
||||||
;; calculate the amount of time remaining in the budget period
|
;; calculate the amount of time remaining in the budget period
|
||||||
;; dependency: budget-calculate-periods!
|
;; dependency: budget-calculate-periods!
|
||||||
(define (gnc:budget-calculate-time-remaining! budget-line budget-report-line)
|
(define (budget-calculate-time-remaining! budget-line)
|
||||||
(display "gnc:budget-calculate-time-remaining!") (newline)
|
(let* ((entry (budget-line-get-entry budget-line))
|
||||||
(vector-set!
|
(brep (budget-line-get-report budget-line))
|
||||||
budget-report-line 5
|
(periods (budget-report-get-num-periods brep)))
|
||||||
(* (- (ceiling (gnc:budget-report-get-periods budget-report-line))
|
((record-modifier budget-report-structure 'time-remaining) brep
|
||||||
(gnc:budget-report-get-periods budget-report-line))
|
(* (- (ceiling periods) periods)
|
||||||
(gnc:budget-get-period budget-line))))
|
(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
|
;; return #f if there is no budget line for that account
|
||||||
(define (gnc:budget-get-line-number account-name budget)
|
(define (budget-get-line account-name budget)
|
||||||
(let loop ((i 0))
|
(cond ((null? budget) #f)
|
||||||
(cond ((= i (vector-length budget)) #f)
|
(else
|
||||||
((let loop2
|
(let loop2
|
||||||
((accounts (gnc:budget-get-accounts (vector-ref budget i))))
|
((accounts (budget-entry-get-accounts
|
||||||
(cond ((null? accounts) #f)
|
(budget-line-get-entry (car budget)))))
|
||||||
(else (or (string=? account-name (car accounts))
|
(cond ((null? accounts) #f)
|
||||||
(loop2 (cdr accounts)))))) i)
|
(else
|
||||||
(else (loop (+ i 1))))))
|
(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
|
;; register a configuration option for the budget report
|
||||||
(define (budget-report-options-generator)
|
(define (budget-report-options-generator)
|
||||||
@ -241,13 +285,13 @@
|
|||||||
"a" "Report start date"
|
"a" "Report start date"
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let ((bdtime (localtime (current-time))))
|
(let ((bdtime (localtime (current-time))))
|
||||||
(set-tm:sec bdtime 0)
|
(set-tm:sec bdtime 0)
|
||||||
(set-tm:min bdtime 0)
|
(set-tm:min bdtime 0)
|
||||||
(set-tm:hour bdtime 0)
|
(set-tm:hour bdtime 0)
|
||||||
(set-tm:mday bdtime 1)
|
(set-tm:mday bdtime 1)
|
||||||
(set-tm:mon bdtime 0)
|
(set-tm:mon bdtime 0)
|
||||||
(let ((time (car (mktime bdtime))))
|
(let ((time (car (mktime bdtime))))
|
||||||
(cons time 0))))
|
(cons time 0))))
|
||||||
#f))
|
#f))
|
||||||
|
|
||||||
;; to-date
|
;; to-date
|
||||||
@ -284,102 +328,136 @@
|
|||||||
budget-report-options-generator
|
budget-report-options-generator
|
||||||
;; renderer
|
;; renderer
|
||||||
(lambda (options)
|
(lambda (options)
|
||||||
(let* ((maxrow (vector-length gnc:budget))
|
(let* ((begindate (gnc:lookup-option options "Report Options" "From"))
|
||||||
;;; 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"))
|
|
||||||
(enddate (gnc:lookup-option options "Report Options" "To"))
|
(enddate (gnc:lookup-option options "Report Options" "To"))
|
||||||
(date-filter-pred (gnc:tr-report-make-filter-predicate
|
(date-filter-pred (gnc:tr-report-make-filter-predicate
|
||||||
(gnc:option-value begindate)
|
(gnc:option-value begindate)
|
||||||
(gnc:option-value enddate)))
|
(gnc:option-value enddate)))
|
||||||
(begin-date-secs (car (gnc:timepair-canonical-day-time
|
(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
|
(end-date-secs (car (gnc:timepair-canonical-day-time
|
||||||
(gnc:option-value enddate))))
|
(gnc:option-value enddate))))
|
||||||
(budget-report (make-vector maxrow))
|
(budget-list (map
|
||||||
(budget-order #())
|
(lambda (entry)
|
||||||
(budget-report-order #()))
|
(make-budget-line entry (make-empty-budget-report)))
|
||||||
(gnc:debug gnc:budget)
|
gnc:budget-entries)))
|
||||||
|
|
||||||
(do ((i 0 (+ i 1)))
|
|
||||||
((= i maxrow))
|
|
||||||
(vector-set! budget-report i (vector 0 0 0 0 0 0)))
|
|
||||||
|
|
||||||
|
(gnc:debug "a")
|
||||||
|
|
||||||
(let loop ((group (gnc:get-current-group)))
|
(let loop ((group (gnc:get-current-group)))
|
||||||
(if (not (pointer-token-null? group))
|
(if (not (pointer-token-null? group))
|
||||||
(gnc:group-map-accounts
|
(gnc:group-map-accounts
|
||||||
(lambda (account)
|
(lambda (account)
|
||||||
(let ((line
|
(let ((line
|
||||||
(gnc:budget-get-line-number
|
(budget-get-line
|
||||||
(gnc:account-get-full-name account)
|
(gnc:account-get-full-name account)
|
||||||
gnc:budget))
|
budget-list)))
|
||||||
(children (gnc:account-get-children account)))
|
|
||||||
(if line
|
(if line
|
||||||
(gnc:for-each-split-in-account
|
(gnc:for-each-split-in-account
|
||||||
account
|
account
|
||||||
(lambda (split)
|
(lambda (split)
|
||||||
(gnc:budget-accumulate-actual!
|
(budget-report-accumulate-actual!
|
||||||
(gnc:split-get-value split)
|
(gnc:split-get-value split) line))))
|
||||||
(vector-ref budget-report line)))))
|
(loop (gnc:account-get-children account))))
|
||||||
(loop children)))
|
|
||||||
group)))
|
group)))
|
||||||
|
|
||||||
;;; Note: This shouldn't need to use a set of vectors...
|
(gnc:debug "b")
|
||||||
|
|
||||||
(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)
|
|
||||||
|
|
||||||
(case (gnc:option-value
|
(for-each
|
||||||
(gnc:lookup-option options "Report Options" "View"))
|
(lambda (line)
|
||||||
((full)
|
(begin
|
||||||
(set! budget-order (vector 1 2 #f 3 4 #f))
|
(budget-calculate-periods! line begin-date-secs end-date-secs)
|
||||||
(set! budget-report-order (vector 5 6 7 8 9 10)))
|
(budget-calculate-budgeted! line)
|
||||||
((balancing)
|
(budget-calculate-expected! line)
|
||||||
(set! budget-order #(1 2 #f 3 4 #f))
|
(budget-calculate-time-remaining! line)))
|
||||||
(set! budget-report-order #(#f 6 5 #f #f #f)))
|
budget-list)
|
||||||
((status)
|
|
||||||
(set! budget-order #(1 #f #f #f 3 #f))
|
(gnc:debug "c")
|
||||||
(set! budget-report-order #(10 #f #f 4 5 2)))
|
|
||||||
(else
|
(let ((report-headers '())
|
||||||
(gnc:debug "Invalid view option")))
|
(report-procs '()))
|
||||||
(let ((order (find-vector-mappings
|
(case (gnc:option-value
|
||||||
(vector budget-order budget-report-order))))
|
(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
|
(list
|
||||||
(html-start-document)
|
(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>"
|
"<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-start-table)
|
||||||
(html-table-row-manual
|
(html-table-row-manual
|
||||||
(vector-map-in-specified-order
|
(map-in-order
|
||||||
(lambda (item) (html-cell-header (car item)))
|
(lambda (item) (html-cell-header item))
|
||||||
(vector gnc:budget-headers gnc:budget-report-headers)
|
report-headers))
|
||||||
order))
|
(map-in-order
|
||||||
(html-table-row-manual
|
(lambda (line)
|
||||||
(vector-map-in-specified-order
|
(html-table-row-manual
|
||||||
(lambda (item) (html-cell-header (cadr item)))
|
(map-in-order
|
||||||
(vector gnc:budget-headers gnc:budget-report-headers)
|
(lambda (proc)
|
||||||
order))
|
((proc) line))
|
||||||
;;; This loop ought not to need to use a vector
|
report-procs)))
|
||||||
(let loop ((row 0))
|
budget-list)
|
||||||
(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)))))
|
|
||||||
(html-end-table)
|
(html-end-table)
|
||||||
(html-end-document))))))
|
(html-end-document))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user