emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] Multi-step ledger org-capture template


From: ST
Subject: Re: [O] Multi-step ledger org-capture template
Date: Mon, 27 Aug 2018 11:05:32 +0300

Thank you for sharing!

It would be nice to be able to generate a .pdf invoice based on a
predefined template (in .org/.tex/etc formats; maybe utilizing org-mode
exporter) for certain ledger transaction (by default the current one,
highlighted by cursor in ledger-mode).

Did anybody wrote something similar in the past?

On Sun, 2018-08-26 at 23:53 +0200, Stefan Huchler wrote:
> In case somebody wants something similar, I post my solution I came up
> with here:
> 
> %(progn
>    (defun get-table-content (&optional start end)
>      (let* ((start (or start (buffer-end -1)))
>           (end (or end (buffer-end 1)))
>           (lines
>            (s-split "\n" (buffer-substring-no-properties
>                           start end))))
>        (remove nil
>              (mapcar
>               (lambda (line)
>                 (mapcar
>                  (lambda (elem)
>                    (string-trim elem))
>                  (remove "" (split-string
>                              line "|"))))
>               lines))))
>    (with-current-buffer (org-capture-get :original-buffer)
>      (call-interactively 'copy-region-as-kill))
>    (let* (mapping)
>      (with-temp-buffer
>        "*shop-name-mapping*"
>        (erase-buffer)
>        (insert-file-contents "capture-templates/products-mapping.org")
>        (let* ((start (progn (goto-char (point-min))
>                           (forward-line 1) (point))))
>        (setq mapping (mapcar (lambda (x) (cons (nth 1 x) (car x)))            
>        
>                      (get-table-content start)))))
>      (with-temp-buffer
>        "*shop-import-temp*"
>        (erase-buffer)
>        (yank)
>        (org-table-convert-region (buffer-end -1) (buffer-end 1) 2)    
>        (let* ((data (get-table-content)))
>        (erase-buffer)
>        (insert
>         (concat "  " (org-read-date nil nil) " * Shop-name\n"
>                 (mapconcat
>                  (lambda (line) (format "      %s \t\t%s St {=€%s}"
>                            (assoc-default (nth 1 line) mapping)
>                            (nth 0 line) (nth 4 line)))
>                  data "\n")
>                 "\n      assets:bank:chequing"))
>        (ledger-mode)
>        (let ((start (progn
>                       (goto-char (point-min))
>                       (forward-line 1) (point)))
>              (end (progn
>                     (goto-char (point-max))
>                     (forward-line -1) (point))))
>          (ledger-post-align-postings start end))       
>        (buffer-string)))))
> 
> products-mapping would like like that:
> 
> #+NAME: food
> | expenses:food:spice:Basilikum | Basilikum bio Sonnentor, 15g |
> | expenses:food:spice:Oregano   | Oregano bio Sonnentor, 20g   |
> 
> Of course it asumes that you have some html or email bill with a table
> selected and you would have to change the (nth x line) depending where
> in the bill the name, amount and price is listed, and maybe change the
> currency.
> 
> 
> 
> 
> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]