mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
[simple-book-add-txn.scm] simple script to add txn into account
This commit is contained in:
parent
be378848e4
commit
042aa7a0b7
139
doc/examples/simple-book-add-txn.scm
Normal file
139
doc/examples/simple-book-add-txn.scm
Normal file
@ -0,0 +1,139 @@
|
||||
;; this file is meant to be run via the gnucash-cli interface: --script simple-book-add-txn.scm
|
||||
;;
|
||||
;; gnucash-cli book.gnucash --script simple-book-add-txn.scm
|
||||
;;
|
||||
;; the book will be considered "valid" if it has a basic hierarchy such as the following
|
||||
;; Assets
|
||||
;; |-Current
|
||||
;; | |- Bank
|
||||
;; Expenses
|
||||
;; |-Govt
|
||||
;; | |- Taxes
|
||||
;; |-Personal
|
||||
;; |-Medical
|
||||
|
||||
(use-modules (gnucash core-utils))
|
||||
(use-modules (gnucash engine))
|
||||
(use-modules (gnucash app-utils))
|
||||
(use-modules (gnucash report))
|
||||
(use-modules (ice-9 rdelim))
|
||||
(use-modules (ice-9 match))
|
||||
|
||||
(define (get-line prompt)
|
||||
(format #t "\x1b[1;33m~a:\x1b[m " prompt)
|
||||
(let ((rv (read-line)))
|
||||
(if (eof-object? rv) "" rv)))
|
||||
|
||||
(define (get-amount prompt)
|
||||
(let ((amount (gnc-numeric-from-string (get-line prompt))))
|
||||
(if (number? amount)
|
||||
amount
|
||||
(get-amount prompt))))
|
||||
|
||||
(define (get-item-from-list lst elt->string prompt)
|
||||
(define (get-amount-line) (get-amount prompt))
|
||||
(let lp ((idx 1) (lst lst))
|
||||
(unless (null? lst)
|
||||
(format #t "~a. ~a\n" idx (elt->string (car lst)))
|
||||
(lp (1+ idx) (cdr lst))))
|
||||
(let lp ((idx (get-amount-line)))
|
||||
(cond
|
||||
((and (integer? idx) (positive? idx))
|
||||
(let lp1 ((idx (1- idx)) (lst lst))
|
||||
(cond
|
||||
((null? lst) (lp (get-amount-line)))
|
||||
((zero? idx) (car lst))
|
||||
(else (lp1 (1- idx) (cdr lst))))))
|
||||
(else (lp (get-amount-line))))))
|
||||
|
||||
(define (get-account prompt parent)
|
||||
(define descendants (gnc-account-get-descendants-sorted parent))
|
||||
(get-item-from-list descendants gnc-account-get-full-name "Select account by index"))
|
||||
|
||||
(define (get-binary-response prompt)
|
||||
(match (get-line prompt)
|
||||
((or "Y" "y") #t)
|
||||
((or "N" "n") #f)
|
||||
(else (get-binary-response prompt))))
|
||||
|
||||
(define (add-to-transaction book txn account amount memo)
|
||||
(let ((split (xaccMallocSplit book)))
|
||||
(xaccSplitSetAccount split account)
|
||||
(xaccSplitSetAmount split amount)
|
||||
(xaccSplitSetValue split amount)
|
||||
(xaccSplitSetMemo split memo)
|
||||
(xaccSplitSetParent split txn)))
|
||||
|
||||
(define (quit-program exitlevel)
|
||||
(gnc-clear-current-session)
|
||||
(exit exitlevel))
|
||||
|
||||
(define (get-new-uri session)
|
||||
(define filepath (get-line "please input correct path, or leave blank to abort"))
|
||||
(gnc-clear-current-session)
|
||||
(cond
|
||||
((string-null? filepath) (quit-program 1))
|
||||
((qof-session-load-quiet filepath SESSION-NORMAL-OPEN) #f) ;success
|
||||
(else (get-new-uri session))))
|
||||
|
||||
(define session (gnc-get-current-session))
|
||||
(define root (gnc-get-current-root-account))
|
||||
|
||||
(let check-book-loop ()
|
||||
(cond
|
||||
((or (null? (gnc-account-lookup-by-full-name root "Assets:Current:Bank"))
|
||||
(null? (gnc-account-lookup-by-full-name root "Expenses"))
|
||||
(null? (gnc-account-lookup-by-full-name root "Expenses:Govt:Taxes")))
|
||||
(display "\n\n\nWARNING: It doesn't seem the correct book is loaded.\n")
|
||||
(get-new-uri session)
|
||||
(check-book-loop))))
|
||||
|
||||
(define book (gnc-get-current-book))
|
||||
(define acc-BANK (gnc-account-lookup-by-full-name root "Assets:Current:Bank"))
|
||||
(define acc-EXP (gnc-account-lookup-by-full-name root "Expenses"))
|
||||
(define acc-EXP-TAX (gnc-account-lookup-by-full-name root "Expenses:Govt:Taxes"))
|
||||
(define acc-EXP-LEAF (get-account "Expense leaf account" acc-EXP))
|
||||
|
||||
(define (accounts-action action-fn)
|
||||
(action-fn acc-BANK)
|
||||
(action-fn acc-EXP-LEAF)
|
||||
(action-fn acc-EXP-TAX))
|
||||
|
||||
(define description (get-line "Description"))
|
||||
|
||||
(let lp ()
|
||||
(define txn (xaccMallocTransaction book))
|
||||
(define net-amount (get-amount "Amount, without tax"))
|
||||
(define tax-amount (* net-amount 1/10))
|
||||
(define total-amount (+ tax-amount net-amount))
|
||||
|
||||
(xaccTransBeginEdit txn)
|
||||
(xaccTransSetCurrency txn (xaccAccountGetCommodity acc-BANK))
|
||||
(xaccTransSetDatePostedSecsNormalized txn (current-time))
|
||||
(xaccTransSetDescription txn description)
|
||||
(add-to-transaction book txn acc-BANK (- total-amount) "from bank")
|
||||
(add-to-transaction book txn acc-EXP-LEAF net-amount "expense net")
|
||||
(add-to-transaction book txn acc-EXP-TAX tax-amount "tax paid")
|
||||
(newline)
|
||||
(gnc:dump-transaction txn)
|
||||
|
||||
(cond
|
||||
((not (xaccTransIsBalanced txn))
|
||||
(display "WARNING: transaction is not balanced. Try again.\n")
|
||||
(xaccTransRollbackEdit txn)
|
||||
(xaccTransDestroy txn)
|
||||
(lp))
|
||||
((get-binary-response "Please confirm transaction [YN]")
|
||||
(accounts-action xaccAccountBeginEdit)
|
||||
(xaccTransCommitEdit txn)
|
||||
(accounts-action xaccAccountCommitEdit))
|
||||
(else
|
||||
(xaccTransRollbackEdit txn)
|
||||
(xaccTransDestroy txn))))
|
||||
|
||||
;; (gnc:dump-book)
|
||||
(when (qof-book-session-not-saved book)
|
||||
(display "Saving book...\n")
|
||||
(qof-session-save-quiet))
|
||||
|
||||
(quit-program 0)
|
@ -18,3 +18,4 @@ gnucash/gschemas/org.gnucash.GnuCash.deprecated.gschema.xml.in
|
||||
|
||||
# These files are example scripts for gnucash-cli
|
||||
doc/examples/book-to-hledger.scm
|
||||
doc/examples/simple-book-add-txn.scm
|
||||
|
Loading…
Reference in New Issue
Block a user