Alan Schmitt writes: Thanks Alan for this. Ledger is something that I would dearly love to be using, but I can't find a good tutorial [by which I mean, it works in small steps which build on the previous steps]. I've looked at http://lists.gnu.org/archive/html/emacs-orgmode/2014-04/msg00727.html http://orgmode.org/worg/org-tutorials/weaving-a-budget.html http://hledger.org/step-by-step The last one looked the most promising until I tried "ledger add" which replied - --8<---------------cut here---------------start------------->8--- ledger add -f ~/.emacs.d/ledger/ledger.journal Error: Unrecognized command 'add' --8<---------------cut here---------------end--------------->8--- So now I'm stumped! Sharon. > On 2014-10-31 12:32, Vikas Rawal writes: . > > I generate reports and deal with my budget using org. I describe my > setup here: > http://lists.gnu.org/archive/html/emacs-orgmode/2014-04/msg00727.html > > Since then, I've slightly refined these functions, here is the current > version: > > #+begin_src org > #+name: call_ledger > #+begin_src emacs-lisp :var lcmd="bal" :var bucket="Quotidien" :var prefix="Expenses:" :var period=() > (let* ((name (org-trim bucket)) > (bname (concat "'^" prefix name "'")) > (ledger "ledger -f ~/Documents/Org/mescomptes.ledger") > (parg (when period (concat " -p '" period "'"))) > (cutcmd "tail -1 | cut -d ' ' -f 2") > (cmd > (concat ledger " -J " parg " " lcmd " " bname " | " cutcmd)) > (res (org-trim (shell-command-to-string cmd)))) > (if (equal res "") 0 res)) > #+end_src > #+name: monthly_average_since > #+begin_src emacs-lisp :var start-date="2014-03-01" :var amount=100 > (let ((nbdays (- (time-to-days (current-time)) > (time-to-days (org-read-date nil t start-date))))) > (calc-eval "round($ / (12 * ($$ / 365.25)), 2)" nil amount nbdays)) > #+end_src > > #+name: monthly_average > #+begin_src emacs-lisp :var starty=2014 :var startm=3 :var amount=100 > (let* ((tm (decode-time)) > (cmonth (nth 4 tm)) > (cyear (nth 5 tm)) > (nbmonths (+ (* 12 (- cyear starty)) (- cmonth startm)))) > (calc-eval "round($ / $$, 2)" nil amount nbmonths)) > #+end_src > > #+name: ledger_average > #+begin_src emacs-lisp :var b="Quotidien" :var sy=2014 :var sm=3 :var sd="2014-03-01" :var p="Expenses:" > (let* ((per (format "from %d-%d-01 to this month" sy sm)) > (a (org-sbe call_ledger (bucket (eval b)) (prefix (eval p)) (period (eval per))))) > (org-sbe monthly_average (amount (eval a)) (starty (eval sy)) (startm (eval sm)))) > #+end_src > > #+name: ledger_budget > #+BEGIN_SRC emacs-lisp :results output :var table=budget :var year=2014 :var month=04 > (princ (format "%d-%02d-01 * Budget %d %02d\n" year month year month)) > (mapcar > (lambda (tuple) > (princ (format " Bucket:Expenses:%s %d €\n" (car tuple) (cadr tuple)))) > (butlast (cdr table) 1)) > (princ " Bucket:Unallocated:EUR\n") > #+END_SRC > #+end_src > > The table looks like this now > > #+begin_src org > #+name: budget > | Bucket | Planned | Remaining | This Month | Last Month | Average | > |--------+---------+-----------+------------+------------+---------| > | Name | & | & | & | & | & | > |--------+---------+-----------+------------+------------+---------| > | Total | & | & | & | & | & | > #+TBLFM: @2$3..@>>$3='(org-sbe call_ledger (bucket (concat "\"" $1 "\"")) (prefix "\"Bucket:Expenses:\"")) > #+TBLFM: @2$4..@>>$4='(org-sbe call_ledger (bucket (concat "\"" $1 "\"")) (period "\"this month\"")) > #+TBLFM: @2$5..@>>$5='(org-sbe call_ledger (bucket (concat "\"" $1 "\"")) (period "\"last month\"")) > #+TBLFM: @2$6..@>>$6='(org-sbe ledger_average (b (concat "\"" $1 "\""))) > #+TBLFM: @>$2..@>$6=vsum(@2..@-1) > #+end_src > > Best, > > Alan -- A taste of linux = http://www.sharons.org.uk my git repo = https://bitbucket.org/boudiccas/dots TGmeds = http://www.tgmeds.org.uk Debian testing, fluxbox 1.3.5, emacs 24.4.1.0