mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Replace the gnc:numeric pair with normal Scheme rationals.
This allows direct conversion between Scheme numbers and gnc_numeric without the performance or accuracy penalties arising from using doubles as an intermediary.
This commit is contained in:
parent
7061803596
commit
e0300d3a62
@ -288,7 +288,7 @@
|
||||
<?scm
|
||||
(for xpair in xlist do
|
||||
(let* ((comm (car xpair))
|
||||
(one-num (gnc:make-gnc-numeric 10000 1))
|
||||
(one-num 10000/1)
|
||||
(one-foreign-mny (gnc:make-gnc-monetary comm one-num))
|
||||
(one-local-mny (exchange-fn one-foreign-mny opt-report-commodity)))
|
||||
?>
|
||||
|
@ -46,7 +46,7 @@
|
||||
(if (or (not taxable) (eq? taxtable '()))
|
||||
(display " ")
|
||||
(let* ((amttot (gnc:make-commodity-collector))
|
||||
(pctot (gnc:make-numeric-collector))
|
||||
(pctot (gnc:make-number-collector))
|
||||
(entries (gncTaxTableGetEntries taxtable))
|
||||
(amt? #f) ; becomes #t if any entries are amounts
|
||||
(pc? #f)) ; becomes #t if any entries are percentages
|
||||
|
@ -53,7 +53,7 @@
|
||||
(if (or (not taxable) (eq? taxtable '()))
|
||||
(display " ")
|
||||
(let* ((amttot (gnc:make-commodity-collector))
|
||||
(pctot (gnc:make-numeric-collector))
|
||||
(pctot (gnc:make-number-collector))
|
||||
(entries (gncTaxTableGetEntries taxtable))
|
||||
(amt? #f) ; becomes #t if any entries are amounts
|
||||
(pc? #f)) ; becomes #t if any entries are percentages
|
||||
|
@ -701,7 +701,7 @@
|
||||
(gnc-commodity-equiv account-commodity
|
||||
USD-currency)))
|
||||
(xaccSplitGetValue split)
|
||||
(gnc:make-gnc-numeric 100 100)))
|
||||
100/100))
|
||||
(missing-pricedb-entry? #f)
|
||||
(pricedb-lookup-price #f)
|
||||
(pricedb-lookup-price-value (gnc-numeric-zero))
|
||||
@ -798,7 +798,7 @@
|
||||
trans-currency
|
||||
USD-currency))
|
||||
(gnc-numeric-div
|
||||
(gnc:make-gnc-numeric 100 100)
|
||||
100/100
|
||||
(xaccSplitGetSharePrice split)
|
||||
GNC-DENOM-AUTO
|
||||
(logior (GNC-DENOM-SIGFIGS 6)
|
||||
|
@ -415,8 +415,8 @@
|
||||
;; numeric-collectors, where [abc] are numeric-collectors. See the
|
||||
;; real variable names below.
|
||||
(define (make-newrate unknown-coll un->known-coll known-pair)
|
||||
(let ((a (gnc:make-numeric-collector))
|
||||
(b (gnc:make-numeric-collector)))
|
||||
(let ((a (gnc:make-number-collector))
|
||||
(b (gnc:make-number-collector)))
|
||||
(a 'add (unknown-coll 'total #f))
|
||||
(b 'add
|
||||
;; round to (at least) 8 significant digits
|
||||
@ -459,7 +459,7 @@
|
||||
;; If this is an Euro currency, create the
|
||||
;; pair of appropriately exchanged amounts.
|
||||
(if euro-monetary
|
||||
(let ((a (gnc:make-numeric-collector)))
|
||||
(let ((a (gnc:make-number-collector)))
|
||||
(a 'add
|
||||
(gnc:gnc-monetary-amount euro-monetary))
|
||||
(list report-commodity
|
||||
@ -532,8 +532,8 @@
|
||||
|
||||
(define (create-commodity-list inner-comm outer-comm share-amount value-amount)
|
||||
(let ((foreignlist (list inner-comm
|
||||
(cons (gnc:make-numeric-collector)
|
||||
(gnc:make-numeric-collector))))
|
||||
(cons (gnc:make-number-collector)
|
||||
(gnc:make-number-collector))))
|
||||
(comm-list #f))
|
||||
((caadr foreignlist) 'add share-amount)
|
||||
((cdadr foreignlist) 'add value-amount)
|
||||
@ -560,8 +560,8 @@
|
||||
(if (not pair)
|
||||
(begin
|
||||
(set! pair (list (car foreignlist)
|
||||
(cons (gnc:make-numeric-collector)
|
||||
(gnc:make-numeric-collector))))
|
||||
(cons (gnc:make-number-collector)
|
||||
(gnc:make-number-collector))))
|
||||
(gnc:debug "New commodity "
|
||||
(gnc-commodity-get-mnemonic (car foreignlist)))))
|
||||
pair))
|
||||
|
@ -300,8 +300,6 @@
|
||||
(lambda ()
|
||||
(let ((n (read)))
|
||||
(if (number? n) n 0.0)))))
|
||||
((gnc:gnc-numeric? elt)
|
||||
(gnc-numeric-to-double elt))
|
||||
(#t
|
||||
0.0)))
|
||||
|
||||
|
@ -335,8 +335,6 @@
|
||||
(lambda ()
|
||||
(let ((n (read)))
|
||||
(if (number? n) n 0.0)))))
|
||||
((gnc:gnc-numeric? elt)
|
||||
(gnc-numeric-to-double elt))
|
||||
(#t
|
||||
0.0)))
|
||||
|
||||
|
@ -152,9 +152,7 @@
|
||||
(lambda ()
|
||||
(let ((n (read)))
|
||||
(if (number? n) (abs n) 0.0)))))
|
||||
((gnc:gnc-numeric? elt)
|
||||
(abs (gnc-numeric-to-double elt)))
|
||||
(#t
|
||||
(#t
|
||||
0.0)))
|
||||
nlist))
|
||||
|
||||
|
@ -131,9 +131,7 @@
|
||||
(lambda ()
|
||||
(let ((n (read)))
|
||||
(if (number? n) n 0.0)))))
|
||||
((gnc:gnc-numeric? elt)
|
||||
(gnc-numeric-to-double elt))
|
||||
(#t
|
||||
(#t
|
||||
0.0)))
|
||||
|
||||
(let* ((retval '())
|
||||
|
@ -671,7 +671,7 @@
|
||||
(export gnc:make-stats-collector)
|
||||
(export gnc:make-drcr-collector)
|
||||
(export gnc:make-value-collector)
|
||||
(export gnc:make-numeric-collector)
|
||||
(export gnc:make-number-collector)
|
||||
(export gnc:make-commodity-collector)
|
||||
(export gnc:commodity-collector-get-negated)
|
||||
(export gnc:commodity-collectorlist-get-merged)
|
||||
|
@ -266,24 +266,24 @@
|
||||
|
||||
|
||||
;; Same as above but with gnc:numeric
|
||||
(define (gnc:make-numeric-collector)
|
||||
(define (gnc:make-number-collector)
|
||||
(let ;;; values
|
||||
((value (gnc-numeric-zero)))
|
||||
((value 0))
|
||||
(lambda (action amount) ;;; Dispatch function
|
||||
(case action
|
||||
((add) (if (gnc:gnc-numeric? amount)
|
||||
(set! value (gnc-numeric-add amount value
|
||||
GNC-DENOM-AUTO GNC-DENOM-LCD))
|
||||
(gnc:warn
|
||||
"gnc:numeric-collector called with wrong argument: "
|
||||
((add) (if (number? amount)
|
||||
(set! value (gnc-numeric-add amount value
|
||||
GNC-DENOM-AUTO GNC-DENOM-LCD))
|
||||
(gnc:warn
|
||||
"gnc:Number-collector called with wrong argument: "
|
||||
amount)))
|
||||
((total) value)
|
||||
(else (gnc:warn "bad gnc:numeric-collector action: " action))))))
|
||||
(else (gnc:warn "bad gnc:number-collector action: " action))))))
|
||||
|
||||
;; Replace all 'action function calls by the normal functions below.
|
||||
(define (gnc:numeric-collector-add collector amount)
|
||||
(define (gnc:number-collector-add collector amount)
|
||||
(collector 'add amount))
|
||||
(define (gnc:numeric-collector-total collector)
|
||||
(define (gnc:number-collector-total collector)
|
||||
(collector 'total #f))
|
||||
|
||||
;; A commodity collector. This is intended to handle multiple
|
||||
@ -338,12 +338,12 @@
|
||||
(gnc-commodity-get-fraction commodity) GNC-RND-ROUND)))
|
||||
(if (not pair)
|
||||
(begin
|
||||
;; create a new pair, using the gnc:numeric-collector
|
||||
(set! pair (list commodity (gnc:make-numeric-collector)))
|
||||
;; create a new pair, using the gnc:number-collector
|
||||
(set! pair (list commodity (gnc:make-number-collector)))
|
||||
;; and add it to the alist
|
||||
(set! commoditylist (cons pair commoditylist))))
|
||||
;; add the value
|
||||
(gnc:numeric-collector-add (cadr pair) rvalue)))
|
||||
(gnc:number-collector-add (cadr pair) rvalue)))
|
||||
|
||||
;; helper function to walk an association list, adding each
|
||||
;; (commodity -> collector) pair to our list at the appropriate
|
||||
@ -352,7 +352,7 @@
|
||||
(cond ((null? clist) '())
|
||||
(else (add-commodity-value
|
||||
(caar clist)
|
||||
(gnc:numeric-collector-total (cadar clist)))
|
||||
(gnc:number-collector-total (cadar clist)))
|
||||
(add-commodity-clist (cdr clist)))))
|
||||
|
||||
(define (minus-commodity-clist clist)
|
||||
@ -360,7 +360,7 @@
|
||||
(else (add-commodity-value
|
||||
(caar clist)
|
||||
(gnc-numeric-neg
|
||||
(gnc:numeric-collector-total (cadar clist))))
|
||||
(gnc:number-collector-total (cadar clist))))
|
||||
(minus-commodity-clist (cdr clist)))))
|
||||
|
||||
;; helper function walk the association list doing a callback on
|
||||
@ -368,7 +368,7 @@
|
||||
(define (process-commodity-list fn clist)
|
||||
(map
|
||||
(lambda (pair) (fn (car pair)
|
||||
(gnc:numeric-collector-total (cadr pair))))
|
||||
(gnc:number-collector-total (cadr pair))))
|
||||
clist))
|
||||
|
||||
;; helper function which is given a commodity and returns, if
|
||||
@ -381,8 +381,8 @@
|
||||
(gnc-numeric-zero)
|
||||
(if sign?
|
||||
(gnc-numeric-neg
|
||||
(gnc:numeric-collector-total (cadr pair)))
|
||||
(gnc:numeric-collector-total (cadr pair))))
|
||||
(gnc:number-collector-total (cadr pair)))
|
||||
(gnc:number-collector-total (cadr pair))))
|
||||
'()))))
|
||||
|
||||
;; helper function which is given a commodity and returns, if
|
||||
@ -395,8 +395,8 @@
|
||||
(gnc-numeric-zero)
|
||||
(if sign?
|
||||
(gnc-numeric-neg
|
||||
(gnc:numeric-collector-total (cadr pair)))
|
||||
(gnc:numeric-collector-total (cadr pair)))))))
|
||||
(gnc:number-collector-total (cadr pair)))
|
||||
(gnc:number-collector-total (cadr pair)))))))
|
||||
|
||||
;; Dispatch function
|
||||
(lambda (action commodity amount)
|
||||
|
@ -321,7 +321,7 @@
|
||||
;; If the units ratio is zero the stock is worthless and the value should be zero too
|
||||
(value-ratio (if (gnc-numeric-zero-p units-ratio)
|
||||
(gnc-numeric-zero)
|
||||
(gnc-numeric-div (gnc:make-gnc-numeric 1 1) units-ratio GNC-DENOM-AUTO GNC-DENOM-REDUCE))))
|
||||
(gnc-numeric-div 1/1 units-ratio GNC-DENOM-AUTO GNC-DENOM-REDUCE))))
|
||||
|
||||
(gnc:debug "blist is " b-list " current units is "
|
||||
(gnc-numeric-to-string current-units)
|
||||
@ -341,7 +341,7 @@
|
||||
|
||||
(gnc:debug "this is a spinoff")
|
||||
(gnc:debug "blist is " b-list " value ratio is " (gnc-numeric-to-string value-ratio))
|
||||
(apply-basis-ratio b-list (gnc:make-gnc-numeric 1 1) value-ratio))
|
||||
(apply-basis-ratio b-list 1/1 value-ratio))
|
||||
)
|
||||
|
||||
;; when all else fails, just send the b-list back
|
||||
@ -473,7 +473,7 @@
|
||||
(exchange-fn
|
||||
(gnc:make-gnc-monetary
|
||||
(gnc-price-get-currency price)
|
||||
(gnc:make-gnc-numeric 100 1))
|
||||
100/1)
|
||||
currency))))
|
||||
(set! price #f))
|
||||
|
||||
@ -514,7 +514,7 @@
|
||||
;; If we still don't have a price, use a price of 1 and complain later
|
||||
(if (not price)
|
||||
(begin
|
||||
(set! price (gnc:make-gnc-monetary currency (gnc:make-gnc-numeric 1 1)))
|
||||
(set! price (gnc:make-gnc-monetary currency 1/1))
|
||||
;; If use-txn is set, but pricing-txn isn't set, it's a bogus price
|
||||
(set! use-txn #t)
|
||||
(set! pricing-txn #f)
|
||||
|
@ -427,9 +427,9 @@
|
||||
(gnc:timepair-ge (gnc-transaction-get-date-posted parent) from-date-tp))
|
||||
(let* ((parent-description (xaccTransGetDescription parent))
|
||||
(parent-currency (xaccTransGetCurrency parent)))
|
||||
;(gnc:debug parent-description
|
||||
; " - "
|
||||
; (gnc-commodity-get-printname parent-currency))
|
||||
(gnc:debug parent-description
|
||||
" - "
|
||||
(gnc-commodity-get-printname parent-currency))
|
||||
(for-each
|
||||
(lambda (s)
|
||||
(let* ((s-account (xaccSplitGetAccount s))
|
||||
@ -444,7 +444,7 @@
|
||||
(string-append
|
||||
"WARNING: s-account is NULL for split: "
|
||||
(gncSplitGetGUID s) "\n")))
|
||||
;(gnc:debug (xaccAccountGetName s-account))
|
||||
(gnc:debug (xaccAccountGetName s-account))
|
||||
(if (and ;; make sure we don't have
|
||||
(not (null? s-account)) ;; any dangling splits
|
||||
(or include-trading-accounts (not (eq? s-account-type ACCT-TYPE-TRADING)))
|
||||
@ -453,7 +453,7 @@
|
||||
(begin
|
||||
(if (gnc-numeric-negative-p s-value)
|
||||
(let ((s-account-in-collector (account-hashtable-ref money-in-hash s-account)))
|
||||
;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
|
||||
;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
|
||||
; (gnc-numeric-to-double s-amount)
|
||||
; (gnc-commodity-get-printname parent-currency)
|
||||
; (gnc-numeric-to-double s-value))
|
||||
@ -494,14 +494,14 @@
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(xaccTransGetSplitList parent)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -306,20 +306,20 @@ developing over time"))
|
||||
(let* ((start-frac-avg (averaging-fraction-func (gnc:timepair->secs from-date-tp)))
|
||||
(end-frac-avg (averaging-fraction-func (+ 1 (gnc:timepair->secs to-date-tp))))
|
||||
(diff-avg (- end-frac-avg start-frac-avg))
|
||||
(diff-avg-numeric (gnc:make-gnc-numeric
|
||||
(diff-avg-numeric (/
|
||||
(inexact->exact (round (* diff-avg 1000000))) ; 6 decimals precision
|
||||
1000000))
|
||||
(start-frac-int (interval-fraction-func (gnc:timepair->secs from-date-tp)))
|
||||
(end-frac-int (interval-fraction-func (+ 1 (gnc:timepair->secs to-date-tp))))
|
||||
(diff-int (- end-frac-int start-frac-int))
|
||||
(diff-int-numeric (gnc:make-gnc-numeric
|
||||
(diff-int-numeric (/
|
||||
(inexact->exact diff-int) 1))
|
||||
)
|
||||
;; Extra sanity check to ensure a number smaller than 1
|
||||
(if (> diff-avg diff-int)
|
||||
(gnc-numeric-div diff-int-numeric diff-avg-numeric GNC-DENOM-AUTO GNC-RND-ROUND)
|
||||
(gnc:make-gnc-numeric 1 1)))
|
||||
(gnc:make-gnc-numeric 1 1)))
|
||||
1/1))
|
||||
1/1))
|
||||
;; If there is averaging, the report-title is extended
|
||||
;; accordingly.
|
||||
(report-title
|
||||
|
@ -314,11 +314,11 @@
|
||||
(liabilities (assoc-ref rpt 'liability)))
|
||||
(set! assets-list (if assets (car assets)
|
||||
(map (lambda (d)
|
||||
(gnc:make-gnc-monetary report-currency (gnc:make-gnc-numeric 0 1)))
|
||||
(gnc:make-gnc-monetary report-currency 0/1))
|
||||
dates-list)))
|
||||
(set! liability-list (if liabilities (car liabilities)
|
||||
(map (lambda (d)
|
||||
(gnc:make-gnc-monetary report-currency (gnc:make-gnc-numeric 0 1)))
|
||||
(gnc:make-gnc-monetary report-currency 0/1))
|
||||
dates-list)))
|
||||
)
|
||||
|
||||
|
@ -355,7 +355,7 @@
|
||||
(guid (gncAccountGetGUID account))
|
||||
(num-bal (hash-ref sx-value-hash guid)))
|
||||
(if num-bal
|
||||
(if (eq? 0 (gnc:gnc-numeric-denom num-bal))
|
||||
(if (eq? 0 (denominator num-bal))
|
||||
(gnc:warn "Oops, invalid gnc_numeric when looking up SX balance for account GUID " guid ": " num-bal)
|
||||
(begin
|
||||
(balance-collector
|
||||
|
@ -36,7 +36,7 @@
|
||||
(exchange-fn (lambda (currency amount date) amount))
|
||||
(report-currency (gnc-default-report-currency))
|
||||
)
|
||||
(env-create-transaction env to-date-tp bank-account expense-account (gnc:make-gnc-numeric 100 1))
|
||||
(env-create-transaction env to-date-tp bank-account expense-account 100/1)
|
||||
(let ((result (cash-flow-calc-money-in-out (list (cons 'accounts (list bank-account))
|
||||
(cons 'to-date-tp to-date-tp)
|
||||
(cons 'from-date-tp from-date-tp)
|
||||
@ -48,16 +48,24 @@
|
||||
(money-in-alist (cdr (assq 'money-in-alist result)))
|
||||
(money-out-alist (cdr (assq 'money-out-alist result)))
|
||||
(expense-acc-in-collector (cadr (assoc expense-account money-in-alist))))
|
||||
(and (null? money-out-alist)
|
||||
(equal? (gnc:make-gnc-numeric 10000 100)
|
||||
(and (or (null? money-out-alist)
|
||||
(begin (format #t "The money-out-alist is not null.~%") #f))
|
||||
(or (equal? 10000/100
|
||||
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity expense-acc-in-collector
|
||||
report-currency exchange-fn)))
|
||||
(equal? (gnc:make-gnc-numeric 10000 100)
|
||||
(begin (format #t "Failed expense-acc-in-collector ~g expected 100.00~%" (gnc:gnc-monetary-amount (gnc:sum-collector-commodity expense-acc-in-collector
|
||||
report-currency exchange-fn))) #f))
|
||||
(or (equal? 10000/100
|
||||
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-in-collector
|
||||
report-currency exchange-fn)))
|
||||
(equal? (gnc:make-gnc-numeric 0 1)
|
||||
(begin (format #t "Failed money-in-collector ~g expected 100.00~%" (gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-in-collector
|
||||
report-currency exchange-fn))) #f))
|
||||
(or (equal? 0/1
|
||||
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-out-collector
|
||||
report-currency exchange-fn)))
|
||||
(begin (format #t "Failed sum-collector-commodity ~g expected 100.00~%" (gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-out-collector
|
||||
report-currency exchange-fn))) #f))
|
||||
(begin (format #t "test-one-tx-in-cash-flow success~%") #t)
|
||||
)))))
|
||||
|
||||
(define (test-one-tx-skip-cash-flow)
|
||||
@ -72,7 +80,7 @@
|
||||
(exchange-fn (lambda (currency amount date) amount))
|
||||
(report-currency (gnc-default-report-currency))
|
||||
)
|
||||
(env-create-transaction env to-date-tp bank-account wallet-account (gnc:make-gnc-numeric 100 1))
|
||||
(env-create-transaction env to-date-tp bank-account wallet-account 100/1)
|
||||
(let ((result (cash-flow-calc-money-in-out (list (cons 'accounts (list wallet-account bank-account))
|
||||
(cons 'to-date-tp to-date-tp)
|
||||
(cons 'from-date-tp from-date-tp)
|
||||
@ -85,12 +93,14 @@
|
||||
(money-out-alist (cdr (assq 'money-out-alist result))))
|
||||
(and (null? money-in-alist)
|
||||
(null? money-out-alist)
|
||||
(equal? (gnc:make-gnc-numeric 0 1)
|
||||
(equal? 0/1
|
||||
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-in-collector
|
||||
report-currency exchange-fn)))
|
||||
(equal? (gnc:make-gnc-numeric 0 1)
|
||||
(equal? 0/1
|
||||
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-out-collector
|
||||
report-currency exchange-fn))))))))
|
||||
report-currency exchange-fn)))
|
||||
(begin (format #t "test-one-tx-skip-cash-flow success~%") #t)
|
||||
)))))
|
||||
|
||||
(define (test-both-way-cash-flow)
|
||||
(let* ((env (create-test-env))
|
||||
@ -104,8 +114,8 @@
|
||||
(exchange-fn (lambda (currency amount date) amount))
|
||||
(report-currency (gnc-default-report-currency))
|
||||
)
|
||||
(env-create-transaction env to-date-tp bank-account expense-account (gnc:make-gnc-numeric 100 1))
|
||||
(env-create-transaction env to-date-tp expense-account bank-account (gnc:make-gnc-numeric 50 1))
|
||||
(env-create-transaction env to-date-tp bank-account expense-account 100/1)
|
||||
(env-create-transaction env to-date-tp expense-account bank-account 50/1)
|
||||
(let ((result (cash-flow-calc-money-in-out (list (cons 'accounts (list wallet-account bank-account))
|
||||
(cons 'to-date-tp to-date-tp)
|
||||
(cons 'from-date-tp from-date-tp)
|
||||
@ -124,11 +134,13 @@
|
||||
(expenses-out-total (gnc:gnc-monetary-amount (gnc:sum-collector-commodity expense-acc-out-collector
|
||||
report-currency
|
||||
exchange-fn))))
|
||||
(and (equal? (gnc:make-gnc-numeric 10000 100) expenses-in-total)
|
||||
(equal? (gnc:make-gnc-numeric 5000 100) expenses-out-total)
|
||||
(equal? (gnc:make-gnc-numeric 10000 100)
|
||||
(and (equal? 10000/100 expenses-in-total)
|
||||
(equal? 5000/100 expenses-out-total)
|
||||
(equal? 10000/100
|
||||
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-in-collector
|
||||
report-currency exchange-fn)))
|
||||
(equal? (gnc:make-gnc-numeric 5000 100)
|
||||
(equal? 5000/100
|
||||
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-out-collector
|
||||
report-currency exchange-fn))))))))
|
||||
report-currency exchange-fn)))
|
||||
(begin (format #t "test-both-way-cash-flow success~%") #t)
|
||||
)))))
|
||||
|
@ -79,12 +79,12 @@
|
||||
date-1
|
||||
bank-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 1 1))
|
||||
1/1)
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
wallet-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 5 1))
|
||||
5/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show Table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
@ -111,25 +111,27 @@
|
||||
(list (list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
result))))
|
||||
(format #t "Report Result ~a~%" result)
|
||||
(and (every (lambda (row) ; test in=net & out=0 in all rows (all days)
|
||||
(and (or (equal? (second row) (fourth row))
|
||||
(begin (format #t "Failed, ~a and ~a differ~%" (second row) (fourth row)) #f))
|
||||
(or (= 0 (string->number (car (third row))))
|
||||
(begin (format #t "Failed ~d isn't 0~%" (car (third row))) #f))))
|
||||
tbl)
|
||||
(or (= 0 (tbl-ref->number tbl 0 1)) (begin (format #t "Failed refnum ~d isn't 0~%" (tbl-ref->number tbl 0 1) )) #f)) ; 1st day in =0
|
||||
(or (= 1 (tbl-ref->number tbl 1 1)) (begin (format #t "Failed refnum ~d isn't 1~%" (tbl-ref->number tbl 1 1)) #f)) ; 2nd day in =1
|
||||
(or (= 5 (tbl-ref->number tbl 2 1)) (begin (format #t "Failed refnum ~d isn't 5~%" (tbl-ref->number tbl 2 1)) #f)) ; 3rd day in =5
|
||||
(or (= (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) (begin (format #t "Failed refnums ~d and ~d differ ~%" (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) #f)); total in=total net
|
||||
(or (= 0 (tbl-ref->number total 0 1)) (begin (format #t "Failed refnum ~d isn't 0~%" (tbl-ref->number total 0 1)) #f)) ; total out=0
|
||||
(or (= 3 (tbl-row-count tbl)) (begin (format #t "Failed row count ~d isn't 3~%" (tbl-row-count tbl)) #f))
|
||||
(or (= 4 (tbl-column-count tbl)) (begin (format #t "Failed column count ~d isn't 4~%" (tbl-column-count tbl)) #f))))
|
||||
(or (= 0 (tbl-ref->number tbl 0 1))
|
||||
(begin (format #t "Failed refnum ~g isn't 0~%" (tbl-ref->number tbl 0 1)) #f)) ; 1st day in =0
|
||||
(or (= 1 (tbl-ref->number tbl 1 1)) (begin (format #t "Failed refnum ~g isn't 1~%" (tbl-ref->number tbl 1 1)) #f)) ; 2nd day in =1
|
||||
(or (= 5 (tbl-ref->number tbl 2 1)) (begin (format #t "Failed refnum ~g isn't 5~%" (tbl-ref->number tbl 2 1)) #f)) ; 3rd day in =5
|
||||
(or (= (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) (begin (format #t "Failed refnums ~g and ~g differ ~%" (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) #f)); total in=total net
|
||||
(or (= 0 (tbl-ref->number total 0 1)) (begin (format #t "Failed refnum ~g isn't 0~%" (tbl-ref->number total 0 1)) #f)) ; total out=0
|
||||
(or (= 3 (tbl-row-count tbl)) (begin (format #t "Failed row count ~g isn't 3~%" (tbl-row-count tbl)) #f))
|
||||
(or (= 4 (tbl-column-count tbl)) (begin (format #t "Failed column count ~g isn't 4~%" (tbl-column-count tbl)) #f))))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
;; Test two transactions from two different assets to expense in two different days
|
||||
(define (test-out-txn)
|
||||
@ -151,22 +153,22 @@
|
||||
date-1
|
||||
bank-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 100 1)) ; large in txn to avoid negative net (hard to parse)
|
||||
100/1) ; large in txn to avoid negative net (hard to parse)
|
||||
(env-create-transaction env
|
||||
date-1
|
||||
expense-account
|
||||
bank-account
|
||||
(gnc:make-gnc-numeric 1 1))
|
||||
1/1)
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
wallet-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 100 1)) ; large in txn to avoid negative net (hard to parse)
|
||||
100/1) ; large in txn to avoid negative net (hard to parse)
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
expense-account
|
||||
wallet-account
|
||||
(gnc:make-gnc-numeric 5 1))
|
||||
5/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show Table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
@ -234,17 +236,17 @@
|
||||
date-1
|
||||
bank-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 1 1))
|
||||
1/1)
|
||||
(env-create-transaction env
|
||||
date-1
|
||||
bank-account
|
||||
wallet-account
|
||||
(gnc:make-gnc-numeric 20 1)) ; this transaction should not be counted
|
||||
20/1) ; this transaction should not be counted
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
wallet-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 5 1))
|
||||
5/1)
|
||||
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show Table" #t)
|
||||
|
@ -82,7 +82,7 @@
|
||||
(gnc:get-start-this-month)
|
||||
my-income-account
|
||||
my-asset-account
|
||||
(gnc:make-gnc-numeric -1 1))
|
||||
-1/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date"
|
||||
@ -106,11 +106,13 @@
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
(and (= 1 (tbl-ref->number tbl 0 1))
|
||||
(or (and (= 1 (tbl-ref->number tbl 0 1))
|
||||
(= 0 (tbl-ref->number tbl 0 2))
|
||||
(= 1 (tbl-ref->number tbl 0 3))
|
||||
(= 1 (tbl-row-count tbl))
|
||||
(= 4 (tbl-column-count tbl)))))))))
|
||||
(= 4 (tbl-column-count tbl)))
|
||||
(begin (format #t "Single-txn test ~a failed~%" uuid) #f))
|
||||
))))))
|
||||
|
||||
|
||||
(define (two-txn-test uuid)
|
||||
@ -133,12 +135,12 @@
|
||||
date-1
|
||||
my-income-account
|
||||
my-asset-account
|
||||
(gnc:make-gnc-numeric -1 1))
|
||||
-1/1)
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
my-income-account
|
||||
my-asset-account
|
||||
(gnc:make-gnc-numeric -5 1))
|
||||
-5/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
@ -160,15 +162,24 @@
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
(and (every (lambda (row)
|
||||
(and (equal? (second row) (fourth row))
|
||||
(= 0 (string->number (car (third row))))))
|
||||
(or (and (every (lambda (row)
|
||||
(and (or (equal? (second row) (fourth row))
|
||||
(begin (format "Second Element ~g != fourth element ~g~%" (second row) (fourth row)) #f))
|
||||
(or (= 0 (string->number (car (third row))))
|
||||
(begin (format "third row element ~a not 0~%" (car (third row))) #f))))
|
||||
tbl)
|
||||
(= 0 (tbl-ref->number tbl 0 1))
|
||||
(= 1 (tbl-ref->number tbl 1 1))
|
||||
(= 6 (tbl-ref->number tbl 2 1))
|
||||
(= 3 (tbl-row-count tbl))
|
||||
(= 4 (tbl-column-count tbl)))))))))
|
||||
(or (= 0 (tbl-ref->number tbl 0 1))
|
||||
(begin (format #t "Item 1 failed: ~g not 0~%" (tbl-ref->number tbl 0 1)) #f))
|
||||
(or (= 1 (tbl-ref->number tbl 1 1))
|
||||
(begin (format #t "Item 1 failed: ~g not 1~%" (tbl-ref->number tbl 1 1)) #f))
|
||||
(or (= 6 (tbl-ref->number tbl 2 1))
|
||||
(begin (format #t "Item 2 failed: ~g not 6~%" (tbl-ref->number tbl 2 1)) #f))
|
||||
(or (= 3 (tbl-row-count tbl))
|
||||
(begin (format #t "Item 3 failed: ~g not 3~%" (tbl-row-count tbl)) #f))
|
||||
(or (= 4 (tbl-column-count tbl))
|
||||
(begin (format #t "Item 4 failed: ~g not 4~%" (tbl-column-count tbl)) #f)))
|
||||
(begin (format #t "Two-txn test ~a failed~%" uuid) #f))
|
||||
))))))
|
||||
|
||||
|
||||
(define (two-txn-test-2 uuid)
|
||||
@ -189,10 +200,10 @@
|
||||
(date-0 (gnc:get-start-this-month))
|
||||
(date-1 (gnc:timepair-next-day date-0))
|
||||
(date-2 (gnc:timepair-next-day date-1)))
|
||||
(env-create-transaction env date-1 my-income-account my-asset-account (gnc:make-gnc-numeric -1 1))
|
||||
(env-create-transaction env date-1 my-expense-account my-liability-account (gnc:make-gnc-numeric -1 1))
|
||||
(env-create-transaction env date-2 my-income-account my-asset-account (gnc:make-gnc-numeric -5 1))
|
||||
(env-create-transaction env date-2 my-expense-account my-liability-account (gnc:make-gnc-numeric -5 1))
|
||||
(env-create-transaction env date-1 my-income-account my-asset-account -1/1)
|
||||
(env-create-transaction env date-1 my-expense-account my-liability-account -1/1)
|
||||
(env-create-transaction env date-2 my-income-account my-asset-account -5/1)
|
||||
(env-create-transaction env date-2 my-expense-account my-liability-account -5/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
@ -214,7 +225,7 @@
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
(and (every (lambda (row)
|
||||
(or (and (every (lambda (row)
|
||||
(and (= (string->number (car (fourth row)))
|
||||
(+ (string->number (car (second row)))
|
||||
(string->number (car (third row)))))
|
||||
@ -225,7 +236,9 @@
|
||||
(= 1 (tbl-ref->number tbl 1 1))
|
||||
(= 6 (tbl-ref->number tbl 2 1))
|
||||
(= 3 (tbl-row-count tbl))
|
||||
(= 4 (tbl-column-count tbl)))))))))
|
||||
(= 4 (tbl-column-count tbl)))
|
||||
(begin (format #t "two-txn test 2 ~a failed~%" uuid) #f))
|
||||
))))))
|
||||
|
||||
(define (two-txn-test-income uuid)
|
||||
(let* ((template (gnc:find-report-template uuid))
|
||||
@ -245,10 +258,10 @@
|
||||
(date-0 (gnc:get-start-this-month))
|
||||
(date-1 (gnc:timepair-next-day date-0))
|
||||
(date-2 (gnc:timepair-next-day date-1)))
|
||||
(env-create-transaction env date-1 my-income-account my-asset-account (gnc:make-gnc-numeric -1 1))
|
||||
(env-create-transaction env date-1 my-expense-account my-liability-account (gnc:make-gnc-numeric -1 1))
|
||||
(env-create-transaction env date-2 my-income-account my-asset-account (gnc:make-gnc-numeric -5 1))
|
||||
(env-create-transaction env date-2 my-expense-account my-liability-account (gnc:make-gnc-numeric -5 1))
|
||||
(env-create-transaction env date-1 my-income-account my-asset-account -1/1)
|
||||
(env-create-transaction env date-1 my-expense-account my-liability-account -1/1)
|
||||
(env-create-transaction env date-2 my-income-account my-asset-account -5/1)
|
||||
(env-create-transaction env date-2 my-expense-account my-liability-account -5/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
@ -270,7 +283,7 @@
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
(and (every (lambda (row)
|
||||
(or (and (every (lambda (row)
|
||||
(and (= (string->number (car (fourth row)))
|
||||
(+ (string->number (car (second row)))
|
||||
(string->number (car (third row)))))
|
||||
@ -281,7 +294,9 @@
|
||||
(= 1 (tbl-ref->number tbl 1 1))
|
||||
(= 5 (tbl-ref->number tbl 2 1))
|
||||
(= 3 (tbl-row-count tbl))
|
||||
(= 4 (tbl-column-count tbl)))))))))
|
||||
(= 4 (tbl-column-count tbl)))
|
||||
(begin (format #t "two-txn-income test ~a failed~%" uuid) #f))
|
||||
))))))
|
||||
|
||||
|
||||
(define (closing-test uuid)
|
||||
@ -306,12 +321,12 @@
|
||||
(date-2 (gnc:timepair-next-day date-1))
|
||||
(date-3 (gnc:timepair-next-day date-2)))
|
||||
|
||||
(env-create-transaction env date-1 my-income-account my-asset-account (gnc:make-gnc-numeric -1 1))
|
||||
(env-create-transaction env date-2 my-income-account my-asset-account (gnc:make-gnc-numeric -2 1))
|
||||
(env-create-transaction env date-3 my-income-account my-asset-account (gnc:make-gnc-numeric -3 1))
|
||||
(env-create-transaction env date-1 my-income-account my-asset-account -1/1)
|
||||
(env-create-transaction env date-2 my-income-account my-asset-account -2/1)
|
||||
(env-create-transaction env date-3 my-income-account my-asset-account -3/1)
|
||||
|
||||
(let ((closing-txn (env-create-transaction env date-2 my-asset-account my-equity-account
|
||||
(gnc:make-gnc-numeric 300 1))))
|
||||
300/1)))
|
||||
(xaccTransSetIsClosingTxn closing-txn #t))
|
||||
|
||||
(begin
|
||||
@ -335,7 +350,7 @@
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
(and (every (lambda (row)
|
||||
(or (and (every (lambda (row)
|
||||
(and (= (string->number (car (fourth row)))
|
||||
(+ (string->number (car (second row)))
|
||||
(string->number (car (third row)))))))
|
||||
@ -345,5 +360,7 @@
|
||||
(= 2 (tbl-ref->number tbl 2 1))
|
||||
(= 3 (tbl-ref->number tbl 3 1))
|
||||
(= 4 (tbl-row-count tbl))
|
||||
(= 4 (tbl-column-count tbl)))))))))
|
||||
(= 4 (tbl-column-count tbl)))
|
||||
(begin (format #t "Closing-txn test ~a failed~%" uuid) #f))
|
||||
))))))
|
||||
|
||||
|
@ -80,7 +80,7 @@
|
||||
(gnc:get-start-this-month)
|
||||
my-income-account
|
||||
my-asset-account
|
||||
(gnc:make-gnc-numeric -1 1))
|
||||
-1/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date"
|
||||
@ -131,12 +131,12 @@
|
||||
date-1
|
||||
my-income-account
|
||||
my-asset-account
|
||||
(gnc:make-gnc-numeric -1 1))
|
||||
-1/1)
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
my-income-account
|
||||
my-asset-account
|
||||
(gnc:make-gnc-numeric -5 1))
|
||||
-5/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
@ -187,10 +187,10 @@
|
||||
(date-0 (gnc:get-start-this-month))
|
||||
(date-1 (gnc:timepair-next-day date-0))
|
||||
(date-2 (gnc:timepair-next-day date-1)))
|
||||
(env-create-transaction env date-1 my-income-account my-asset-account (gnc:make-gnc-numeric -1 1))
|
||||
(env-create-transaction env date-1 my-expense-account my-liability-account (gnc:make-gnc-numeric -1 1))
|
||||
(env-create-transaction env date-2 my-income-account my-asset-account (gnc:make-gnc-numeric -5 1))
|
||||
(env-create-transaction env date-2 my-expense-account my-liability-account (gnc:make-gnc-numeric -5 1))
|
||||
(env-create-transaction env date-1 my-income-account my-asset-account -1/1)
|
||||
(env-create-transaction env date-1 my-expense-account my-liability-account -1/1)
|
||||
(env-create-transaction env date-2 my-income-account my-asset-account -5/1)
|
||||
(env-create-transaction env date-2 my-expense-account my-liability-account -5/1)
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
|
@ -409,7 +409,7 @@ new, totally cool report, consult the mailing list %s.")
|
||||
(_ "The number option formatted as currency is %s.")
|
||||
(gnc:html-markup-b
|
||||
(xaccPrintAmount
|
||||
(gnc:make-gnc-numeric (inexact->exact num-val) 1)
|
||||
(inexact->exact num-val)
|
||||
(gnc-default-print-info #f)))))))
|
||||
|
||||
;; you can add as many objects as you want. Here's another
|
||||
|
@ -218,7 +218,7 @@ gnc_euro_currency_get_rate (const gnc_commodity *currency)
|
||||
return gnc_numeric_zero ();
|
||||
|
||||
return double_to_gnc_numeric (result->rate, GNC_DENOM_AUTO,
|
||||
GNC_HOW_DENOM_SIGFIGS(6) | GNC_HOW_RND_ROUND_HALF_UP);
|
||||
GNC_HOW_RND_ROUND_HALF_UP);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------ */
|
||||
|
@ -520,7 +520,7 @@ gnc_split_scm_get_amount(SCM split_scm)
|
||||
return gnc_numeric_zero ();
|
||||
|
||||
result = scm_call_1(getters.split_scm_amount, split_scm);
|
||||
if (!gnc_numeric_p(result))
|
||||
if (!scm_rational_p(result))
|
||||
return gnc_numeric_zero ();
|
||||
|
||||
return gnc_scm_to_numeric(result);
|
||||
@ -545,7 +545,7 @@ gnc_split_scm_get_value(SCM split_scm)
|
||||
return gnc_numeric_zero ();
|
||||
|
||||
result = scm_call_1(getters.split_scm_value, split_scm);
|
||||
if (!gnc_numeric_p(result))
|
||||
if (!scm_rational_p(result))
|
||||
return gnc_numeric_zero ();
|
||||
|
||||
return gnc_scm_to_numeric(result);
|
||||
|
@ -50,11 +50,8 @@ GSList * gnc_query_scm2path (SCM path_scm);
|
||||
SCM gnc_query2scm (QofQuery * q);
|
||||
QofQuery * gnc_scm2query (SCM query_scm);
|
||||
|
||||
int gnc_gh_gint64_p(SCM num);
|
||||
|
||||
SCM gnc_numeric_to_scm(gnc_numeric arg);
|
||||
gnc_numeric gnc_scm_to_numeric(SCM arg);
|
||||
int gnc_numeric_p(SCM arg);
|
||||
gnc_commodity * gnc_scm_to_commodity(SCM scm);
|
||||
SCM gnc_commodity_to_scm (const gnc_commodity *commodity);
|
||||
SCM gnc_book_to_scm (const QofBook *book);
|
||||
|
@ -319,8 +319,8 @@ int
|
||||
gnc_timepair_p(SCM x)
|
||||
{
|
||||
return(scm_is_pair(x) &&
|
||||
gnc_gh_gint64_p(SCM_CAR(x)) &&
|
||||
gnc_gh_gint64_p(SCM_CDR(x)));
|
||||
(scm_is_signed_integer(SCM_CAR(x), INT64_MIN, INT64_MAX) &&
|
||||
scm_is_signed_integer(SCM_CDR(x), INT64_MIN, INT64_MAX)));
|
||||
}
|
||||
|
||||
SCM
|
||||
@ -1110,10 +1110,8 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
|
||||
break;
|
||||
scm = SCM_CAR (query_term_scm);
|
||||
query_term_scm = SCM_CDR (query_term_scm);
|
||||
amount = scm_to_double (scm);
|
||||
|
||||
val = double_to_gnc_numeric (amount, GNC_DENOM_AUTO,
|
||||
GNC_HOW_DENOM_SIGFIGS(6) | GNC_HOW_RND_ROUND_HALF_UP);
|
||||
val = gnc_numeric_create (scm_to_int64(scm_numerator(scm)),
|
||||
scm_to_int64(scm_denominator(scm)));
|
||||
|
||||
if (!g_strcmp0 (pr_type, "pr-price"))
|
||||
{
|
||||
@ -1997,96 +1995,23 @@ gnc_scm2query (SCM query_scm)
|
||||
return q;
|
||||
}
|
||||
|
||||
int
|
||||
gnc_gh_gint64_p(SCM num)
|
||||
{
|
||||
static int initialized = 0;
|
||||
static SCM maxval;
|
||||
static SCM minval;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
/* to be super safe, we have to build these manually because
|
||||
though we know that we have gint64's here, we *don't* know how
|
||||
to portably specify a 64bit constant to the compiler (i.e. like
|
||||
0x7FFFFFFFFFFFFFFF). */
|
||||
gint64 tmp;
|
||||
|
||||
tmp = 0x7FFFFFFF;
|
||||
tmp <<= 32;
|
||||
tmp |= 0xFFFFFFFF;
|
||||
maxval = scm_from_int64(tmp);
|
||||
|
||||
tmp = 0x80000000;
|
||||
tmp <<= 32;
|
||||
minval = scm_from_int64(tmp);
|
||||
|
||||
scm_gc_protect_object(maxval);
|
||||
scm_gc_protect_object(minval);
|
||||
initialized = 1;
|
||||
}
|
||||
|
||||
return (scm_is_exact(num) &&
|
||||
(scm_geq_p(num, minval) != SCM_BOOL_F) &&
|
||||
(scm_leq_p(num, maxval) != SCM_BOOL_F));
|
||||
}
|
||||
|
||||
gnc_numeric
|
||||
gnc_scm_to_numeric(SCM gncnum)
|
||||
{
|
||||
static SCM get_num = SCM_BOOL_F;
|
||||
static SCM get_denom = SCM_BOOL_F;
|
||||
|
||||
if (get_num == SCM_BOOL_F)
|
||||
{
|
||||
get_num = scm_c_eval_string("gnc:gnc-numeric-num");
|
||||
}
|
||||
if (get_denom == SCM_BOOL_F)
|
||||
{
|
||||
get_denom = scm_c_eval_string("gnc:gnc-numeric-denom");
|
||||
}
|
||||
|
||||
return gnc_numeric_create(scm_to_int64(scm_call_1(get_num, gncnum)),
|
||||
scm_to_int64(scm_call_1(get_denom, gncnum)));
|
||||
if (scm_is_signed_integer(scm_numerator(gncnum), INT64_MIN, INT64_MAX) &&
|
||||
scm_is_signed_integer(scm_denominator(gncnum), INT64_MIN, INT64_MAX))
|
||||
return gnc_numeric_create(scm_to_int64(scm_numerator(gncnum)),
|
||||
scm_to_int64(scm_denominator(gncnum)));
|
||||
return gnc_numeric_create(0, GNC_ERROR_OVERFLOW);
|
||||
}
|
||||
|
||||
SCM
|
||||
gnc_numeric_to_scm(gnc_numeric arg)
|
||||
{
|
||||
static SCM maker = SCM_BOOL_F;
|
||||
|
||||
if (maker == SCM_BOOL_F)
|
||||
{
|
||||
maker = scm_c_eval_string("gnc:make-gnc-numeric");
|
||||
}
|
||||
|
||||
return scm_call_2(maker, scm_from_int64(gnc_numeric_num(arg)),
|
||||
scm_from_int64(gnc_numeric_denom(arg)));
|
||||
return scm_divide(scm_from_int64(arg.num),
|
||||
scm_from_int64(arg.denom));
|
||||
}
|
||||
|
||||
int
|
||||
gnc_numeric_p(SCM arg)
|
||||
{
|
||||
static SCM type_p = SCM_BOOL_F;
|
||||
SCM ret = SCM_BOOL_F;
|
||||
|
||||
if (type_p == SCM_BOOL_F)
|
||||
{
|
||||
type_p = scm_c_eval_string("gnc:gnc-numeric?");
|
||||
}
|
||||
ret = scm_call_1(type_p, arg);
|
||||
|
||||
if (ret == SCM_BOOL_F)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static SCM
|
||||
gnc_generic_to_scm(const void *cx, const gchar *type_str)
|
||||
{
|
||||
|
@ -43,12 +43,6 @@
|
||||
(export GNC-ERROR-OVERFLOW)
|
||||
(export GNC-ERROR-DENOM-DIFF)
|
||||
(export GNC-ERROR-REMAINDER)
|
||||
(export <gnc-numeric>)
|
||||
(export gnc:gnc-numeric?)
|
||||
(export gnc:make-gnc-numeric)
|
||||
(export gnc:gnc-numeric-denom)
|
||||
(export gnc:gnc-numeric-num)
|
||||
(export gnc:gnc-numeric-denom-reciprocal)
|
||||
(export <gnc-monetary>)
|
||||
(export gnc:gnc-monetary?)
|
||||
(export gnc:make-gnc-monetary)
|
||||
|
@ -47,26 +47,6 @@
|
||||
(define GNC-ERROR-DENOM-DIFF -3)
|
||||
(define GNC-ERROR-REMAINDER -4)
|
||||
|
||||
(define <gnc-numeric>
|
||||
(make-record-type "<gnc-numeric>"
|
||||
'(num denom)))
|
||||
|
||||
(define gnc:make-gnc-numeric
|
||||
(record-constructor <gnc-numeric>))
|
||||
|
||||
(define gnc:gnc-numeric?
|
||||
(record-predicate <gnc-numeric>))
|
||||
|
||||
(define gnc:gnc-numeric-num
|
||||
(record-accessor <gnc-numeric> 'num))
|
||||
|
||||
(define gnc:gnc-numeric-denom
|
||||
(record-accessor <gnc-numeric> 'denom))
|
||||
|
||||
(define (gnc:gnc-numeric-denom-reciprocal arg)
|
||||
(- arg))
|
||||
|
||||
|
||||
|
||||
(define <gnc-monetary>
|
||||
(make-record-type "<gnc-monetary>"
|
||||
@ -76,7 +56,7 @@
|
||||
(define (gnc:make-gnc-monetary c a)
|
||||
;;FIXME: we used to type-check the values, like:
|
||||
;; (gw:wcp-is-of-type? <gnc:commodity*> c)
|
||||
(if (and #t (gnc:gnc-numeric? a))
|
||||
(if (and #t (number? a))
|
||||
((record-constructor <gnc-monetary>) c a)
|
||||
(warn "wrong arguments for gnc:make-gnc-monetary: " c a)))
|
||||
|
||||
|
@ -25,22 +25,26 @@ extern "C"
|
||||
KvpValue *
|
||||
gnc_scm_to_kvp_value_ptr(SCM val)
|
||||
{
|
||||
if (scm_is_number(val))
|
||||
if (scm_is_rational(val))
|
||||
{
|
||||
/* in guile 1.8 (exact? ) only works on numbers */
|
||||
if (scm_is_exact (val) && gnc_gh_gint64_p(val))
|
||||
if (scm_is_exact_integer(val) &&
|
||||
scm_is_signed_integer(val, INT64_MIN, INT64_MAX))
|
||||
{
|
||||
return new KvpValue{scm_to_int64(val)};
|
||||
}
|
||||
else if (scm_is_exact(val) &&
|
||||
scm_is_signed_integer(scm_numerator(val),
|
||||
INT64_MIN, INT64_MAX) &&
|
||||
scm_is_signed_integer(scm_denominator(val),
|
||||
INT64_MIN, INT64_MAX))
|
||||
{
|
||||
return new KvpValue{gnc_scm_to_numeric(val)};
|
||||
}
|
||||
else
|
||||
{
|
||||
return new KvpValue{scm_to_double(val)};
|
||||
}
|
||||
}
|
||||
else if (gnc_numeric_p(val))
|
||||
{
|
||||
return new KvpValue{gnc_scm_to_numeric(val)};
|
||||
}
|
||||
else if (gnc_guid_p(val))
|
||||
{
|
||||
auto guid = gnc_scm2guid(val);
|
||||
|
@ -115,7 +115,7 @@
|
||||
(cons 'sink (make-test-sink))))
|
||||
|
||||
(define (env-random-amount env n)
|
||||
(gnc:make-gnc-numeric (env-random env n) 1))
|
||||
(/ (env-random env n) 1))
|
||||
|
||||
(define (env-random env n)
|
||||
(random n (assoc-ref env 'random)))
|
||||
@ -183,9 +183,9 @@
|
||||
(for-each (lambda (date)
|
||||
(env-create-transaction env date to-account
|
||||
from-account
|
||||
(gnc:make-gnc-numeric
|
||||
(gnc:date-get-month-day (gnc:timepair->date date))
|
||||
1)))
|
||||
(/
|
||||
(gnc:date-get-month-day (gnc:timepair->date date))
|
||||
1)))
|
||||
(cdr (reverse dates-this-month)))))
|
||||
|
||||
(define (env-create-account-structure env account-structure)
|
||||
|
@ -17,8 +17,8 @@
|
||||
(bank-account (cdr (assoc "Bank" account-alist)))
|
||||
(expense-account (cdr (assoc "Expenses" account-alist)))
|
||||
(wallet-account (cdr (assoc "Wallet" account-alist)))
|
||||
(tx1 (env-create-transaction env today bank-account wallet-account (gnc:make-gnc-numeric 20 1)))
|
||||
(tx2 (env-create-transaction env today bank-account expense-account (gnc:make-gnc-numeric 10 1)))
|
||||
(tx1 (env-create-transaction env today bank-account wallet-account 20/1))
|
||||
(tx2 (env-create-transaction env today bank-account expense-account 10/1))
|
||||
(splits-tx1 (xaccTransGetSplitList tx1))
|
||||
(splits-tx2 (xaccTransGetSplitList tx2)))
|
||||
(and (split-in-list? (first splits-tx1) splits-tx1)
|
||||
|
Loading…
Reference in New Issue
Block a user