logging updates, makes invoice voiding trigger refresh of running balances.

This commit is contained in:
2024-09-27 16:59:35 -07:00
parent 4c14e43734
commit e25e2bfc46
5 changed files with 124 additions and 204 deletions

View File

@@ -382,66 +382,100 @@
:in $
:where [?c :client/code]]
(dc/db conn))]
{:db/id c :client/ledger-last-change (c/to-date (t/now))})
{:db/id c :client/ledger-last-change (c/to-date (t/now))
:client/last-running-balance #inst "2000-01-01"})
{:user/name "backfill-client and dates"}))
(defn refresh-bank-account-balances [client-ids]
(mu/with-context {:source "current-balance-refresh"}
(let [db (dc/db conn)
clients (map first (dc/q '[:find (pull ?c [:db/id :client/code {:client/bank-accounts [:db/id :bank-account/code]}])
:in $ [?c ...]
:where [?c :client/code]]
db
client-ids))]
(dorun
(for [{client :db/id code :client/code bank-accounts :client/bank-accounts} clients
{bank-account :db/id bac :bank-account/code} bank-accounts]
(let [{[_ _ _ _ _ running-balance] :v} (->> (dc/index-range db :journal-entry-line/running-balance-tuple [client bank-account "A"] [client bank-account "A" #inst "2050-01-01"])
seq
(sort-by (fn [{id :e [_ _ _ current-date] :v}]
[current-date id]))
(last))
running-balance (or running-balance 0.0)]
(alog/info ::updating-bank-account-balance
:bank-account bac
:balance running-balance)
@(dc/transact conn [{:db/id bank-account
:bank-account/current-balance-synced (c/to-date (t/now))
:bank-account/current-balance running-balance}])))))))
(defn upsert-running-balance []
(let [db (dc/db conn)
starting-at (c/to-date (t/now))
clients (clients-needing-refresh db)
_ (alog/info ::clients-needing-update :clients clients :count (count clients))
client-change-stats (atom {})
changes (for [c clients
:let [client-id (:db/id c)
account-lookup (build-account-lookup client-id)]
running-balance-set (->> (dc/index-range db :journal-entry-line/running-balance-tuple [client-id] [(inc client-id)])
(seq)
(partition-by (fn [{[current-client current-account current-location current-date debit credit running-balance]
:v}]
[current-client current-account current-location])))
running-balance-change (->> running-balance-set
(sort-by (fn [{id :e [_ _ _ current-date] :v}]
[current-date id]))
(reduce
(fn [{:keys [changes last-running-balance]}
{id :e
[current-client current-account current-location current-date debit credit running-balance]
:v}]
(let [delta (if (#{:account-type/asset
:account-type/dividend
:account-type/expense} (:account_type (account-lookup current-account)))
(- (or debit 0.0) (or credit 0.0))
(- (or credit 0.0) (or debit 0.0)))
correct-running-balance (+ last-running-balance delta)
running-balance-changed? (not (dollars= correct-running-balance (or running-balance 0.0)))]
(when running-balance-changed?
(swap! client-change-stats update (:client/code c) (fnil inc 0)))
(cond-> {:last-account-lookup account-lookup
:last-running-balance correct-running-balance
:changes changes}
running-balance-changed?
(update :changes conj {:db/id id
:journal-entry-line/running-balance correct-running-balance}))))
{:last-running-balance 0.0})
:changes)]
running-balance-change)]
(alog/info ::change-stats :stats @client-change-stats)
(mu/trace ::update-running-balance []
(auto-ap.datomic/audit-transact-batch changes
{:user/name "running balance updater"}))
(auto-ap.datomic/audit-transact (mapv (fn [c]
{:db/id (:db/id c)
:client/last-running-balance starting-at})
clients)
{:user/name "running balance updater"})
(count changes)))
(mu/with-context {:service "upsert-running-balance"
:source "upsert-running-balance" }
(mu/trace ::updating-balance
[:service "upsert-running-balance"
:source "upsert-running-balance" ]
(let [db (dc/db conn)
starting-at (c/to-date (t/now))
clients (clients-needing-refresh db)
_ (alog/info ::clients-needing-update :clients clients :count (count clients))
client-change-stats (atom {})
changes (for [c clients
:let [client-id (:db/id c)
account-lookup (build-account-lookup client-id)]
running-balance-set (->> (dc/index-range db :journal-entry-line/running-balance-tuple [client-id] [(inc client-id)])
(seq)
(partition-by (fn [{[current-client current-account current-location current-date debit credit running-balance]
:v}]
[current-client current-account current-location])))
running-balance-change (->> running-balance-set
(sort-by (fn [{id :e [_ _ _ current-date] :v}]
[current-date id]))
(reduce
(fn [{:keys [changes last-running-balance]}
{id :e
[current-client current-account current-location current-date debit credit running-balance]
:v}]
(let [delta (if (#{:account-type/asset
:account-type/dividend
:account-type/expense} (:account_type (account-lookup current-account)))
(- (or debit 0.0) (or credit 0.0))
(- (or credit 0.0) (or debit 0.0)))
correct-running-balance (+ last-running-balance delta)
running-balance-changed? (not (dollars= correct-running-balance (or running-balance 0.0)))]
(when running-balance-changed?
(swap! client-change-stats update (:client/code c) (fnil inc 0)))
(cond-> {:last-account-lookup account-lookup
:last-running-balance correct-running-balance
:changes changes}
running-balance-changed?
(update :changes conj {:db/id id
:journal-entry-line/running-balance correct-running-balance}))))
{:last-running-balance 0.0})
:changes)]
running-balance-change)]
(mu/trace ::update-running-balance []
(auto-ap.datomic/audit-transact-batch changes
{:user/name "running balance updater"}))
(auto-ap.datomic/audit-transact (mapv (fn [c]
{:db/id (:db/id c)
:client/last-running-balance starting-at})
clients)
{:user/name "running balance updater"})
(alog/info ::change-stats :stats @client-change-stats)
(refresh-bank-account-balances (map :db/id clients))
(count changes)))))
(comment
(mark-all-clients-dirty)
(clients-needing-refresh (dc/db conn))
(upsert-running-balance)
;; SETUP running-balance-tuple