emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Stefan Huchler <stefan.huchler@mail.de>
To: emacs-orgmode@gnu.org
Subject: Re: org-capture template to type in bills from shops in ledger format
Date: Sat, 22 Jun 2019 16:14:40 +0200	[thread overview]
Message-ID: <87imsxlnan.fsf@mail.de> (raw)
In-Reply-To: 87woi4rgwf.fsf@mail.de

If somebody is interested I uploaded a reworked version of this there:

https://github.com/spiderbit/org-capture-ledger-shopping


Stefan Huchler <stefan.huchler@mail.de> writes:

> I wrote this template to capture my bills from mostly one shop, but it
> has support for multiple shops and the important feature is that it
> suggests previous item names and remembers last prices, that gives you
> lot's of autocompletion if you repetetivly buy often the same stuff over
> and over again.
>
> #+begin_src emacs-lisp
> %(let* ((default-directory (file-name-directory "%F"))
> 	(map-file "shop-items.txt"))
>    (load-file "helper.el")
>    (require 'dash)
>    (let* ((shops (if (file-exists-p map-file)
> 		     (read-from-file map-file) '()))
> 	  (names (mapcar 'car shops))
> 	  (shop-name (ido-completing-read "Shop: " names nil nil nil))
> 	  (new-prices) (new-names) (new-amounts)
> 	  (products (assoc-default shop-name shops)))
>      (while (let* ((names (mapcar 'car products))
>      		   (name (ido-completing-read "Name: " names))
>        		   (amount (read-number "Amount: " 1))
>      		   (item (alist-get name products))
>      		   (item (if (stringp item) (string-to-number item) item))
>        		   (price (read-number "Price: " (or item 2.00))))
>      	      (setq new-names (append new-names (list name)))
>      	      (setq new-prices (append new-prices (list price)))	   
>      	      (setq new-amounts (append new-amounts (list amount)))
>      	      (y-or-n-p "More items? ")))
>      (let* ((-compare-fn (lambda (x y) (equal (car x) (car y))))
>      	    (new-products (mapcar* 'cons new-names new-prices))
>      	    (combined-products (-distinct (append new-products products)))
> 	    (combined-shops (-distinct (append `((,shop-name . ,combined-products)) shops)))
>      	    (format-string "      expenses:food:%s \t\t%s St @ =€%s")
>      	    (format-function (lambda (name amount price)
>      			       (format format-string name amount price)))
> 	    (product-lines (mapcar* format-function new-names
>      					     new-amounts new-prices))
>      	    (shopping-items (s-join "\n" product-lines))
>      	    (total (reduce '+ (mapcar* '* new-amounts new-prices))))
>        (print-to-file map-file combined-shops)
>        (concat (format "  %(org-read-date nil nil) * %s\n%s"
>      		       shop-name shopping-items)
>      	       (format "\n      assets:bank:chequing\t\t€-%s"
>        		       (read-string "Total: " (format "%.2f" total)))))))
> #+end_src
>
>
> Any thoughts? It's supposed to output into a org file with a embeded
> ledger src block so you would have to check the alignment if you would
> want to output to a normal ledger file.
>
> here are the 2 functions from helper.el:
>
> #+begin_src emacs-lisp
> (defun print-to-file (filename data)
>   (with-temp-file filename
>     (let* ((print-length 5000))
>       (prin1 data (current-buffer)))))
>
> (defun read-from-file (filename)
>   (with-temp-buffer
>     (insert-file-contents filename)
>     (cl-assert (eq (point) (point-min)))
>     (read (current-buffer))))
> #+end_src
>
>
> Maybe that's useful for somebody else or somebody wants to suggest other
> features or something. The only thing I would maybe consider to switch
> is to use a json format for the shop-items.txt for the prices for easier
> manual editing.
>
> that's how I set it up:
>
> #+begin_src emacs-lisp
> ("s" "(S)hopping" plain
> 	 (file+function "path/finances.org"
> 			(lambda () ""
> 			  (progn (org-babel-goto-named-src-block "balance")   
> 				 (org-babel-goto-src-block-head)(forward-line))))
> 	 "%[~/capture-templates/template-name]" 
> 	 :jump-to-captured t
> 	 :empty-lines-after 1
> 	 :immediate-finish nil)
> #+end_src         

      parent reply	other threads:[~2019-06-22 14:14 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-02  0:05 org-capture template to type in bills from shops in ledger format Stefan Huchler
2019-06-02 13:37 ` Michael Welle
2019-06-04 16:42   ` Stefan Huchler
2019-06-22 14:14 ` Stefan Huchler [this message]

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=87imsxlnan.fsf@mail.de \
    --to=stefan.huchler@mail.de \
    --cc=emacs-orgmode@gnu.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).