Makes new balance sheet page. It's much faster.
This commit is contained in:
@@ -164,63 +164,91 @@
|
||||
(defn ident [x]
|
||||
(:db/ident x))
|
||||
|
||||
(deftype Line [^Long id ^Long client-id ^Long account-id ^String location ^java.util.Date date ^Double debit ^Double credit ^Double running-balance])
|
||||
|
||||
(defn ->line [{[current-client current-account current-location current-date debit credit running-balance]
|
||||
:v
|
||||
id :e}]
|
||||
(Line. id current-client current-account current-location current-date debit credit running-balance)
|
||||
)
|
||||
|
||||
(defn compare-account [^Line l1 ^Line l2]
|
||||
|
||||
(let [a (compare (.-date l1) (.-date l2))]
|
||||
(if (not= 0 a)
|
||||
a
|
||||
(compare (.-id l1) (.-id l2)))))
|
||||
|
||||
(defn account-sets [db client-id]
|
||||
(for [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]))) ]
|
||||
(map ->line)
|
||||
(partition-by (fn set-partition [^Line l]
|
||||
[(.-account-id l) (.-location l)]))) ]
|
||||
(->> running-balance-set
|
||||
(sort-by (fn [{id :e [_ _ _ current-date] :v}]
|
||||
[current-date id])))))
|
||||
(sort compare-account))))
|
||||
|
||||
(defn account-snapshot [db client-id end]
|
||||
(defn account-snapshot [db client-id ^java.util.Date end]
|
||||
(for [running-balance-set (account-sets db client-id)
|
||||
:let [{id :e [client-id account-id location date _ _ current-balance] :v}
|
||||
(->> running-balance-set
|
||||
(take-while (fn [{id :e [_ _ _ current-date] :v}]
|
||||
(<= (.compareTo current-date end) 0)))
|
||||
(take-while (fn until-date [^Line l]
|
||||
(let [^java.util.Date d (.-date l)]
|
||||
(<= (.compareTo ^java.util.Date d end) 0))))
|
||||
last)]
|
||||
:when id]
|
||||
[client-id account-id location date current-balance]))
|
||||
|
||||
(defn detailed-account-snapshot [db client-id end]
|
||||
|
||||
(defn detailed-account-snapshot [db client-id ^java.util.Date end]
|
||||
(for [running-balance-set (account-sets db client-id)
|
||||
:let [{:keys [account-id client-id location current-balance debits credits count]}
|
||||
(->> running-balance-set
|
||||
|
||||
(take-while (fn [{id :e [_ _ _ current-date] :v}]
|
||||
(<= (.compareTo current-date end) 0)))
|
||||
(take-while (fn until-date [^Line l]
|
||||
(let [^java.util.Date d (.-date l)]
|
||||
(<= (.compareTo ^java.util.Date d end) 0))))
|
||||
(reduce
|
||||
(fn [acc {id :e [current-client current-account current-location current-date debit credit balance] :v}]
|
||||
(-> acc
|
||||
(update :count inc)
|
||||
(update :debits + (or debit 0.0))
|
||||
(update :credits + (or credit 0.0))
|
||||
(assoc :current-balance balance
|
||||
:account-id current-account
|
||||
:client-id current-client
|
||||
:location current-location)))
|
||||
{:count 0
|
||||
:debits 0.0
|
||||
:credits 0.0
|
||||
:current-balance 0.0}))]
|
||||
(fn step [acc ^Line l]
|
||||
(assoc! acc
|
||||
:count (unchecked-inc (:count acc))
|
||||
:debits (unchecked-add (:debits acc) (or (.-debit l) 0.0))
|
||||
:credits (unchecked-add (:credits acc) (or (.-credit l) 0.0))
|
||||
:current-balance (.-running-balance l)
|
||||
:account-id (.-account-id l)
|
||||
:client-id (.-client-id l)
|
||||
:location (.-location l)))
|
||||
(transient {:count 0
|
||||
:debits 0.0
|
||||
:credits 0.0
|
||||
:current-balance 0.0})))]
|
||||
:when client-id]
|
||||
[client-id account-id location debits credits current-balance count]))
|
||||
|
||||
|
||||
|
||||
(comment
|
||||
(detailed-account-snapshot (dc/db auto-ap.datomic/conn)
|
||||
(auto-ap.datomic/pull-id (dc/db auto-ap.datomic/conn)
|
||||
[:client/code "NGOP"])
|
||||
#inst "2024-01-01")
|
||||
#inst "2020-01-01")
|
||||
|
||||
(account-snapshot (dc/db auto-ap.datomic/conn)
|
||||
(auto-ap.datomic/pull-id (dc/db auto-ap.datomic/conn)
|
||||
[:client/code "NGOP"])
|
||||
#inst "2022-01-01")
|
||||
|
||||
(def orig (into [] (take 5000 (mapcat (fn [ls]
|
||||
(map #(.-id %) ls)) (account-sets (dc/db auto-ap.datomic/conn)
|
||||
(auto-ap.datomic/pull-id (dc/db auto-ap.datomic/conn)
|
||||
[:client/code "NGOP"]))))))
|
||||
|
||||
(def n (into [] (take 5000 (mapcat (fn [ls]
|
||||
(map #(.-id %) ls)) (account-sets (dc/db auto-ap.datomic/conn)
|
||||
(auto-ap.datomic/pull-id (dc/db auto-ap.datomic/conn)
|
||||
[:client/code "NGOP"]))))))
|
||||
|
||||
(= orig n)
|
||||
|
||||
#_(seq (dc/q '[:find ?c ?a ?l ?date ?balance
|
||||
:in $
|
||||
:where [?c :client/code "NGOP"]
|
||||
|
||||
Reference in New Issue
Block a user