From 74313613bfeee185b7a3669d6a244f18ace4f0af Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Thu, 11 Apr 2019 15:48:14 -0700 Subject: [PATCH] build a ledger from transactions --- src/clj/auto_ap/datomic/ledger.clj | 9 ++++--- src/clj/auto_ap/ledger.clj | 42 +++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/clj/auto_ap/datomic/ledger.clj b/src/clj/auto_ap/datomic/ledger.clj index 0cf20a05..30caee5a 100644 --- a/src/clj/auto_ap/datomic/ledger.clj +++ b/src/clj/auto_ap/datomic/ledger.clj @@ -3,10 +3,13 @@ [auto-ap.datomic :refer [uri]])) (defn get-graphql [args] - (->> (d/q '[:find (pull ?e [* {:general-ledger/client [:client/name :client/code :db/id] - :general-ledger/vendor [:vendor/name :db/id] + (->> (d/q '[:find (pull ?e [* {:journal-entry/client [:client/name :client/code :db/id] + :journal-entry/vendor [:vendor/name :db/id] + :journal-entry/line-items [* {:journal-entry-line/account [* + {:account/type [*]}]}] + }]) - :where [?e :general-ledger/original-entity]] + :where [?e :journal-entry/original-entity]] (d/db (d/connect uri))) (map first))) diff --git a/src/clj/auto_ap/ledger.clj b/src/clj/auto_ap/ledger.clj index 8ce794b4..f3c3a482 100644 --- a/src/clj/auto_ap/ledger.clj +++ b/src/clj/auto_ap/ledger.clj @@ -12,8 +12,11 @@ (cond (namespaces "invoice" ) [[:invoice e]] (namespaces "invoice-expense-account" ) [[:invoice (:db/id (:invoice/_expense-accounts entity))]] + (namespaces "transaction" ) [[:transaction e]] :else nil))) + + (defn infer-entity [_ [_ changes]] (let [namespaces (->> changes (map :a) @@ -53,6 +56,29 @@ (every? #(= :payment-status/cleared (:payment/status %)) (:invoice/payments entity)) )}))) +(defmethod entity-change->ledger :transaction + [db [type id]] + (let [entity (d/pull db ['* {:transaction/vendor '[*] :transaction/client '[*] :transaction/account '[*]}] id)] + (remove-nils + {:journal-entry/source "transaction" + :journal-entry/client (:db/id (:transaction/client entity)) + :journal-entry/date (:transaction/date entity) + :journal-entry/original-entity (:db/id entity) + :journal-entry/vendor (:db/id (:transaction/vendor entity)) + :journal-entry/amount (Math/abs (:transaction/amount entity)) + + :journal-entry/line-items [{:journal-entry-line/account (:db/id (:transaction/account entity)) + :journal-entry-line/location "HQ" + :journal-entry-line/debit (Math/abs (:transaction/amount entity))} + + {:journal-entry-line/account (:db/id (:transaction/bank-account entity)) + :journal-entry-line/location "HQ" + :journal-entry-line/credit (Math/abs (:transaction/amount entity))} + ] + #_#_:general-ledger/from-expense-account 2110 + #_#_:general-ledger/to-expense-account (:invoice-expense-account/expense-account-id ea) + :journal-entry/cleared true}))) + (defmethod entity-change->ledger :invoice-expense-account [db [entity changes]] nil @@ -70,8 +96,9 @@ entries)) (defn process-one [report-queue] - (println report-queue) + (let [transaction (.take report-queue) + _ (println "processing transaction" transaction) db (:db-after transaction) affected-entities (->> (:tx-data transaction) (map (fn [^datomic.db.Datum x] @@ -85,16 +112,18 @@ d-txs (->> affected-entities (map #(entity-change->ledger db %)) (filter seq)) - retractions (map (fn [[_ e]] [:replace-general-ledger e]) affected-entities)] + retractions (map (fn [[_ e]] [:db/retractEntity [:journal-entry/original-entity e]]) affected-entities)] (when (seq retractions) + (println "Retracting " retractions) @(d/transact (d/connect uri) retractions)) - (println retractions d-txs) + (doseq [d-tx d-txs] + (println "Transacting") (clojure.pprint/pprint d-tx) #_(println "updating general-ledger " d-tx) - @(d/transact (d/connect uri) d-tx)))) + @(d/transact (d/connect uri) [d-tx])))) (defn process-all [] (while (not (Thread/interrupted)) @@ -105,8 +134,3 @@ #_(process-one (d/tx-report-queue (d/connect uri) )) #_(process-all) - - - - -