Files
integreat/scratch-sessions/make_ledger_fast_again.clj
Bryce Covert 3737cfa628 minor fixes.
2020-07-17 12:46:44 -07:00

148 lines
7.7 KiB
Clojure

(ns make-ledger-fast-again
(:require [datomic.api :as d]
[auto-ap.datomic :refer[uri]]
[auto-ap.utils :refer [by]]
[clj-time.coerce :as coerce]
))
(time
(def old-results
(map (fn [o] (update o :amount int)) (:balance_sheet_accounts (auto-ap.graphql.ledger/get-balance-sheet nil {:client_id 17592186046483
:date (coerce/to-date-time #inst "2020-09-01")} nil)))))
#_(defn roll-up-2 [jes]
)
(def new-results
(let [client-id 17592186046483
brackets [#inst "2019-01-01" #inst "2020-01-01"]
accounts (by :db/id (map first (d/query {:query {:find ['(pull ?e [:db/id :account/name
:account/numeric-code
{:account/type [:db/ident]
:account/client-overrides [:account-client-override/client :account-client-override/name]}
])]
:in ['$]
:where ['[?e :account/name]]}
:args [(d/db (d/connect uri) )]})))
bank-accounts (by :db/id (map first (d/query {:query {:find ['(pull ?e [:db/id :bank-account/name {:bank-account/type [:db/ident]}])]
:in ['$]
:where ['[?e :bank-account/name]]}
:args [(d/db (d/connect uri))]})))
overrides-by-client (->> accounts
vals
(mapcat (fn [a]
(map (fn [o]
[[[(:db/id a) (:db/id (:account-client-override/client o))]]
(:account-client-override/name o)])
(:account/client-overrides a))
) )
(into {} ))
account->name (fn [a]
(or (:bank-account/name (bank-accounts a))
(overrides-by-client [a client-id])
(:account/name (accounts a))))
account->numeric-code (fn [a]
(or (:account/numeric-code (accounts a))
(and (#{:bank-account-type/check} (:db/ident (:bank-account/type (bank-accounts a))))
11100)
(and (#{:bank-account-type/credit} (:db/ident (:bank-account/type (bank-accounts a))))
28000)))
account->type (fn [a]
(or (:db/ident (:account/type (accounts a)))
({:bank-account-type/check :account-type/asset
:bank-account-type/credit :account-type/liability}
(:db/ident (:bank-account/type (bank-accounts a))))))
all-ledger-entries (->> (d/query
{:query {:find ['?d '?jel '?account '?location '?debit '?credit ]
:in ['$ '?client-id]
:where ['[?e :journal-entry/client ?client-id]
'[?e :journal-entry/date ?d]
'[(<= ?d #inst "2020-09-01")]
'[?e :journal-entry/line-items ?jel]
'[(get-else $ ?jel :journal-entry-line/account :account/unknown) ?account]
'[(get-else $ ?jel :journal-entry-line/debit 0.0) ?debit]
'[(get-else $ ?jel :journal-entry-line/credit 0.0) ?credit]
'[(get-else $ ?jel :journal-entry-line/location "") ?location]]
}
:args [(d/db (d/connect uri)) client-id]})
(sort-by first))]
(reduce
(fn [acc bracket]
(println (first all-ledger-entries))
(assoc acc bracket (->> all-ledger-entries
(filter (fn [[d]]
(<= (compare d bracket) 0)))
(reduce
(fn [acc [_ _ account location debit credit]]
(-> acc
(update-in [[location account] :debit] (fnil + 0.0) debit)
(update-in [[location account] :credit] (fnil + 0.0) credit)
(update-in [[location account] :count] (fnil + 0) 1))
)
{})
(reduce-kv
(fn [acc [location account] {:keys [debit credit count]}]
(let [account-type (account->type account)]
(conj acc {:name (if-not (= "A" location)
(str (account->name account) "-" location)
(account->name account))
:id (str account "-" location)
:numeric_code (account->numeric-code account)
:location (or location "")
:amount (if account-type (if (#{:account-type/asset
:account-type/dividend
:account-type/expense} account-type)
(- debit credit)
(- credit debit)
)
0.0)
:account_type account-type}))
)
[]))))
{}
brackets))
)
;; 9804
new-results
old-results
(for [[k1 a1] (by :id (map #(dissoc % :location :account_type ) (filter :numeric_code new-results)))
:let [a2 (get (by :id (map #(dissoc % :location :account_type ) (filter :numeric_code old-results)))
k1)]
:when (not= a1 a2)]
[a1 a2]
)
(clojure.data/diff (set new-results) (set old-results))
;;16275
#_(d/query
{:query {:find ['?account '?location '?debit '?credit ]
:in ['$]
:where ['[?e :journal-entry/client 17592186046483]
'[?e :journal-entry/date ?d]
'[(<= ?d #inst "2020-09-01")]
'[?e :journal-entry/line-items ?jel]
'[(get-else $ ?jel :journal-entry-line/account :account/unknown) ?account]
'[(get-else $ ?jel :journal-entry-line/debit 0.0) ?debit]
'[(get-else $ ?jel :journal-entry-line/credit 0.0) ?credit]
'[(get-else $ ?jel :journal-entry-line/location "") ?location]]
}
:args [(d/db (d/connect uri))]})