summaryrefslogtreecommitdiff
path: root/lisp/ledger-reconcile.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/ledger-reconcile.el')
-rw-r--r--lisp/ledger-reconcile.el101
1 files changed, 73 insertions, 28 deletions
diff --git a/lisp/ledger-reconcile.el b/lisp/ledger-reconcile.el
index fa38bcc2..d5188112 100644
--- a/lisp/ledger-reconcile.el
+++ b/lisp/ledger-reconcile.el
@@ -44,7 +44,8 @@
:group 'ledger-reconcile)
(defcustom ledger-narrow-on-reconcile t
- "If t, limit transactions shown in main buffer to those matching the reconcile regex."
+ "If t, limit transactions shown in main buffer to those
+matching the reconcile regex."
:type 'boolean
:group 'ledger-reconcile)
@@ -55,7 +56,8 @@ Then that transaction will be shown in its source buffer."
:group 'ledger-reconcile)
(defcustom ledger-reconcile-force-window-bottom nil
- "If t make the reconcile window appear along the bottom of the register window and resize."
+ "If t make the reconcile window appear along the bottom of the
+register window and resize."
:type 'boolean
:group 'ledger-reconcile)
@@ -75,8 +77,26 @@ reconcile-finish will mark all pending posting cleared."
:type 'string
:group 'ledger-reconcile)
+(defcustom ledger-reconcile-buffer-header "Reconciling account %s\n\n"
+ "Default header string for the reconcile buffer. If non-nil,
+ the name of the account being reconciled will be substituted
+ into the '%s'. If nil, no header willbe displayed."
+ :type 'string
+ :group 'ledger-reconcile)
+
+(defcustom ledger-reconcile-buffer-line-format "%(date)s %-4(code)s %-50(payee)s %-30(account)s %15(amount)s\n"
+ "Format string for the ledger reconcile posting
+format. Available fields are date, status, code, payee, account,
+amount. The format for each field is %WIDTH(FIELD), WIDTH can be
+preced by a minus sign which mean to left justify and pad the
+field."
+ :type 'string
+ :group 'ledger-reconcile)
+
(defcustom ledger-reconcile-sort-key "(0)"
- "Default key for sorting reconcile buffer. Possible values are '(date)', '(amount)', '(payee)'. For no sorting, i.e. using ledger file order, use '(0)'."
+ "Default key for sorting reconcile buffer. Possible values are
+'(date)', '(amount)', '(payee)'. For no sorting, i.e. using
+ledger file order, use '(0)'."
:type 'string
:group 'ledger-reconcile)
@@ -298,6 +318,51 @@ POSTING is used in `ledger-clear-whole-transactions' is nil."
(nth 1 emacs-xact) ;; return line-no of xact
(nth 0 posting))))) ;; return line-no of posting
+(defun ledger-reconcile-compile-format-string (fstr)
+ "return a function that implements the format string in fstr"
+ (let (fields
+ (start 0))
+ (while (string-match "(\\(.*?\\))" fstr start)
+ (setq fields (list fields (intern (substring fstr (match-beginning 1) (match-end 1)))))
+ (setq start (match-end 0)))
+ (setq fields (flatten (list 'format (replace-regexp-in-string "(.*?)" "" fstr) (cdr (flatten fields)))))
+ `(lambda (date code status payee account amount)
+ ,fields)))
+
+
+
+(defun ledger-reconcile-format-posting (beg where fmt date code status payee account amount)
+ (insert (funcall fmt date code status payee account amount))
+
+ ; Set face depending on cleared status
+ (if status
+ (if (eq status 'pending)
+ (set-text-properties beg (1- (point))
+ (list 'face 'ledger-font-reconciler-pending-face
+ 'where where))
+ (set-text-properties beg (1- (point))
+ (list 'face 'ledger-font-reconciler-cleared-face
+ 'where where)))
+ (set-text-properties beg (1- (point))
+ (list 'face 'ledger-font-reconciler-uncleared-face
+ 'where where))))
+
+(defun ledger-reconcile-format-xact (xact fmt)
+ (let ((date-format (or (cdr (assoc "date-format" ledger-environment-alist))
+ ledger-default-date-format)))
+ (dolist (posting (nthcdr 5 xact))
+ (let ((beg (point))
+ (where (ledger-marker-where-xact-is xact posting)))
+ (ledger-reconcile-format-posting beg
+ where
+ fmt
+ (format-time-string date-format (nth 2 xact)) ; date
+ (if (nth 3 xact) (nth 3 xact) "") ; code
+ (nth 3 posting) ; status
+ (nth 4 xact) ; payee
+ (nth 1 posting) ; account
+ (nth 2 posting)))))) ; amount
+
(defun ledger-do-reconcile (&optional sort)
"Return the number of uncleared transactions in the account and display them in the *Reconcile* buffer."
(let* ((buf ledger-buf)
@@ -314,33 +379,13 @@ POSTING is used in `ledger-clear-whole-transactions' is nil."
(goto-char (point-min))
(unless (eobp)
(if (looking-at "(")
- (read (current-buffer)))))))) ;current-buffer is the *temp* created above
+ (read (current-buffer))))))) ;current-buffer is the *temp* created above
+ (fmt (ledger-reconcile-compile-format-string ledger-reconcile-buffer-line-format)))
(if (and ledger-success (> (length xacts) 0))
- (let ((date-format (or (cdr (assoc "date-format" ledger-environment-alist))
- ledger-default-date-format)))
+ (progn
+ (insert (format ledger-reconcile-buffer-header account))
(dolist (xact xacts)
- (dolist (posting (nthcdr 5 xact))
- (let ((beg (point))
- (where (ledger-marker-where-xact-is xact posting)))
- (insert (format "%s %-4s %-50s %-30s %15s\n"
- (format-time-string date-format (nth 2 xact))
- (if (nth 3 xact)
- (nth 3 xact)
- "")
- (truncate-string-to-width
- (nth 4 xact) 49)
- (nth 1 posting) (nth 2 posting)))
- (if (nth 3 posting)
- (if (eq (nth 3 posting) 'pending)
- (set-text-properties beg (1- (point))
- (list 'face 'ledger-font-reconciler-pending-face
- 'where where))
- (set-text-properties beg (1- (point))
- (list 'face 'ledger-font-reconciler-cleared-face
- 'where where)))
- (set-text-properties beg (1- (point))
- (list 'face 'ledger-font-reconciler-uncleared-face
- 'where where)))) ))
+ (ledger-reconcile-format-xact xact fmt))
(goto-char (point-max))
(delete-char -1)) ;gets rid of the extra line feed at the bottom of the list
(if ledger-success