emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Alan Schmitt <alan.schmitt@polytechnique.org>
To: Vikas Rawal <vikaslists@agrarianresearch.org>
Cc: org-mode mailing list <emacs-orgmode@gnu.org>
Subject: Re: Org and ledger
Date: Thu, 06 Nov 2014 18:27:32 +0100	[thread overview]
Message-ID: <m24mucdyt7.fsf@polytechnique.org> (raw)
In-Reply-To: 4AA4F46C-5ABD-481A-8F95-2401FC407E03@agrarianresearch.org

[-- Attachment #1: Type: text/plain, Size: 3574 bytes --]

On 2014-10-31 12:32, Vikas Rawal <vikaslists@agrarianresearch.org> writes:

> 2. Generating reports: Babel results do not use the standard Org table
> syntax. Given my limited knowledge of lisp, I am finding it difficult
> to programme customising these reports in Org. It would be of much
> benefit if other users could share how they customise ledger reports
> in Org. Some examples would be great.

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

-- 
OpenPGP Key ID : 040D0A3B4ED2E5C7

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 494 bytes --]

  parent reply	other threads:[~2014-11-06 17:27 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-31  7:02 Org and ledger Vikas Rawal
2014-10-31 18:56 ` Eric Abrahamsen
2014-11-03 16:32 ` Eric S Fraga
2014-11-06 17:27 ` Alan Schmitt [this message]
2014-11-07 13:19   ` Sharon Kimble
2014-11-07 13:36     ` Eric Abrahamsen
2014-11-07 19:53       ` Sharon Kimble
2014-11-08 15:45         ` Eric S Fraga
2014-11-10  7:37         ` Eric S Fraga
2014-11-07 18:51     ` Eric S Fraga
2014-11-09  4:34       ` Daniel Clemente
2014-11-09 13:29         ` Eric S Fraga
2014-11-10  7:08           ` Bernhard Pröll
2014-11-10  9:08             ` Daniel Clemente
  -- strict thread matches above, loose matches on Subject: below --
2008-11-26 18:01 [ANN] Org Invoice 1.0.0 Peter Jones
2008-12-06 19:36 ` Mark A. Hershberger
2008-12-06 21:34   ` Peter Jones
2008-12-07 20:23     ` Mark A. Hershberger
2008-12-07 22:25       ` Org and Ledger (was: Re: [ANN] Org Invoice 1.0.0) Carsten Dominik
2008-12-08 16:58         ` Org and Ledger Mark A. Hershberger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m24mucdyt7.fsf@polytechnique.org \
    --to=alan.schmitt@polytechnique.org \
    --cc=emacs-orgmode@gnu.org \
    --cc=vikaslists@agrarianresearch.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).