updating general ledger automatically.

This commit is contained in:
BC
2019-03-14 23:23:58 -07:00
parent 0551879b51
commit e35bc97a7d
7 changed files with 160 additions and 41 deletions

View File

@@ -1,6 +1,6 @@
(ns auto-ap.ledger
(:require [datomic.api :as d]
[auto-ap.datomic :refer [uri]]))
[auto-ap.datomic :refer [uri remove-nils]]))
(defonce report-queue (d/tx-report-queue (d/connect uri) ) )
@@ -30,23 +30,23 @@
(defmethod entity-change->ledger :invoice
[db [type id]]
(println "HI")
(let [entity (d/pull db ['* {:invoice/vendor '[*] :invoice/payment '[*]}] id)]
(map
(fn [ea]
{:general-ledger/source "invoice"
:general-ledger/client (:invoice/client entity)
:general-ledger/date (:invoice/date entity)
:general-ledger/original-entity (:db/id entity)
:general-ledger/vendor (:db/id (:invoice/vendor entity))
:general-ledger/amount (- (:invoice-expense-account/amount ea))
:general-ledger/location (:invoice-expense-account/location ea)
:general-ledger/from-expense-account 2110
:general-ledger/to-expense-account (:invoice-expense-account/expense-account-id ea)
:general-ledger/cleared (and (< (:invoice/outstanding-balance entity) 0.01)
(every? #(= :payment-status/cleared (:payment/status %)) (:invoice/payments entity))
)})
(remove-nils
{:general-ledger/source "invoice"
:general-ledger/client (:db/id (:invoice/client entity))
:general-ledger/date (:invoice/date entity)
:general-ledger/original-entity (:db/id entity)
:general-ledger/vendor (:db/id (:invoice/vendor entity))
:general-ledger/amount (- (:invoice-expense-account/amount ea))
:general-ledger/location (:invoice-expense-account/location ea)
:general-ledger/from-expense-account 2110
:general-ledger/to-expense-account (:invoice-expense-account/expense-account-id ea)
:general-ledger/cleared (and (< (:invoice/outstanding-balance entity) 0.01)
(every? #(= :payment-status/cleared (:payment/status %)) (:invoice/payments entity))
)}))
(:invoice/expense-accounts entity))))
(defmethod entity-change->ledger :invoice-expense-account
@@ -65,19 +65,39 @@
(into [[:replace-general-ledger (:general-ledger/original-entity (first entries))]]
entries))
(let [transaction (.peek report-queue)
db (:db-after transaction)]
(->> (:tx-data transaction)
(map (fn [^datomic.db.Datum x]
{:e (:e x)
:a (d/ident db (:a x))
:v (:v x)
:added (:added x)}))
(group-by :e)
(mapcat #(datums->impacted-entity db %))
(set)
(map #(entity-change->ledger db %))
(filter seq)
(map ledger-entries->transaction)))
(defn process-one []
(let [transaction (.take report-queue)
db (:db-after transaction)
affected-entities (->> (:tx-data transaction)
(map (fn [^datomic.db.Datum x]
{:e (:e x)
:a (d/ident db (:a x))
:v (:v x)
:added (:added x)}))
(group-by :e)
(mapcat #(datums->impacted-entity db %))
(set))
d-txs (->> affected-entities
(map #(entity-change->ledger db %))
(filter seq))
retractions (map (fn [[_ e]] [:replace-general-ledger e]) affected-entities)]
@(d/transact (d/connect uri) retractions)
(doseq [d-tx d-txs]
(println "updating general-ledger " d-tx)
@(d/transact (d/connect uri) d-tx))))
(defn process-all []
(while (not (Thread/interrupted))
(process-one)))
#_(process-one)
#_(process-all)