|
|
@@ -178,7 +178,8 @@
|
|
|
|
|
|
(defun ledger/handle-journal (chat-id query)
|
|
|
(with-chat-journal (chat-id journal updated)
|
|
|
- (let* ((entries (pta-ledger:journal-print journal query))
|
|
|
+ (let* ((pta-ledger:*posting-length* 40)
|
|
|
+ (entries (pta-ledger:journal-print journal query))
|
|
|
(len (length entries))
|
|
|
(count (min len 20)))
|
|
|
(bot-send-message chat-id (format nil "```~%~{~A~^ ~%~%~}```Обновлено: ~A"
|
|
|
@@ -191,6 +192,47 @@
|
|
|
((null args) (ledger/handle-journal chat-id "date:thisweek"))
|
|
|
(:otherwise (ledger/handle-journal chat-id (spaced args)))))
|
|
|
|
|
|
+(defun match-entry (text journal)
|
|
|
+ (labels ((two-post (entries)
|
|
|
+ (remove-if-not #'(lambda (e)
|
|
|
+ (= 2 (length (pta-ledger:entry-postings e))))
|
|
|
+ entries)))
|
|
|
+ (let ((desc (two-post
|
|
|
+ (pta-ledger:journal-entries journal (format nil "desc:'~A'" text)))))
|
|
|
+ (if desc (car (last desc))
|
|
|
+ (let ((comment (two-post
|
|
|
+ (pta-ledger:journal-entries journal (format nil "comment:'~A'" text)))))
|
|
|
+ (when comment (car (last comment))))))))
|
|
|
+
|
|
|
+(defun create-entry (chat-id text amount currency)
|
|
|
+ (with-chat-journal (chat-id journal updated)
|
|
|
+ (let* ((old (match-entry text journal))
|
|
|
+ (new (or (when old (pta-ledger:clone-entry old))
|
|
|
+ (pta-ledger:make-entry
|
|
|
+ :description text
|
|
|
+ :postings (list
|
|
|
+ (pta-ledger:make-posting :account "expenses")
|
|
|
+ (pta-ledger:make-posting)))))
|
|
|
+ (postings (pta-ledger:entry-postings new)))
|
|
|
+ (setf (pta-ledger:entry-date new) (get-universal-time)
|
|
|
+ (pta-ledger:posting-amount (car postings)) (pta-ledger:make-amount
|
|
|
+ :quantity amount
|
|
|
+ :commodity currency)
|
|
|
+ (pta-ledger:posting-amount (cadr postings)) (pta-ledger:make-amount
|
|
|
+ :quantity (- amount)
|
|
|
+ :commodity currency)
|
|
|
+ (pta-ledger:posting-account (cadr postings)) (format nil "assets:Cash:~A" currency))
|
|
|
+ new)))
|
|
|
+
|
|
|
+(def-message-cmd-handler handler-create (:rub :usd :eur :thb :btc)
|
|
|
+ (cond
|
|
|
+ ((>= (length args) 2)
|
|
|
+ (ledger/new-chat-entry chat-id (create-entry chat-id
|
|
|
+ (spaced (subseq args 1))
|
|
|
+ (parse-float (car args))
|
|
|
+ (symbol-name cmd))))
|
|
|
+ (:otherwise (send-response chat-id (format nil "/~A <amount> <description>" cmd)))))
|
|
|
+
|
|
|
(def-webhook-handler ledger/handle-webhook ("ledger")
|
|
|
(when (= 2 (length paths))
|
|
|
(destructuring-bind (chat-id hmac) paths
|
|
|
@@ -209,13 +251,12 @@
|
|
|
(let ((pta-ledger:*posting-length* 40))
|
|
|
(format nil "```~%~A```" (pta-ledger:render entry))))
|
|
|
|
|
|
-
|
|
|
(defun ledger/format-add-entry-message (from)
|
|
|
(format nil "Ledger add from ~A ~A at ~A"
|
|
|
(aget "first_name" from) (aget "last_name" from)
|
|
|
(ledger/format-time (get-universal-time))))
|
|
|
|
|
|
-(defun ledger/process-add-entry (chat-id callback)
|
|
|
+(defun ledger/process-add-entry (chat-id from entry)
|
|
|
(with-secret (info (list :ledger chat-id))
|
|
|
(if info
|
|
|
(cond
|
|
|
@@ -224,8 +265,8 @@
|
|
|
(ledger/add-git
|
|
|
chat-id
|
|
|
(car info) (cadr info)
|
|
|
- (agets callback "message" "text")
|
|
|
- (ledger/format-add-entry-message (agets callback "from")))
|
|
|
+ (pta-ledger:render entry)
|
|
|
+ (ledger/format-add-entry-message from))
|
|
|
"Добавил!")
|
|
|
(error (e)
|
|
|
(log:error "~A" e)
|
|
|
@@ -253,7 +294,7 @@
|
|
|
(list (inline-button ("➕")
|
|
|
(telegram-answer-callback-query query-id :text "Добавляю...")
|
|
|
(telegram-send-message source-chat-id (ledger/process-add-entry
|
|
|
- source-chat-id callback))
|
|
|
+ source-chat-id from entry))
|
|
|
(telegram-edit-message-reply-markup
|
|
|
nil :chat-id source-chat-id :message-id source-message-id))
|
|
|
(inline-button ("💲")
|