Makes simple sales summaries

This commit is contained in:
2024-03-31 21:47:40 -07:00
parent d1a660c5c1
commit ded5371e77
3 changed files with 314 additions and 90 deletions

View File

@@ -25,22 +25,20 @@
(.toDateMidnight (atime/localize (time/now)))])
(defn mark-all-dirty [days]
(doseq [c (dc/q '[:find ?c
:in $
:where [_ :sales-order/client ?c]]
(dc/db conn))]
(apply mark-dirty [:client/code "NGOP"] (last-n-days days))))
(doseq [[c] (dc/q '[:find ?c
:in $
:where [_ :sales-order/client ?c]]
(dc/db conn))]
(apply mark-dirty c (last-n-days days))))
(comment
(mark-all-dirty 365))
(str (c/to-local-date (atime/localize (time/now))))
(defn dirty-sales-summaries [c]
(let [client-id (dc/entid (dc/db conn) c)]
(->> (dc/index-pull (dc/db conn)
{:index :avet
:selector '[:sales-summary/date :sales-summary/client]
:selector '[:sales-summary/date :sales-summary/client :db/id]
:start [:sales-summary/client+dirty [client-id true]]})
(filter (fn [sales-summary]
(= client-id (:db/id (:sales-summary/client sales-summary))))))))
@@ -48,9 +46,10 @@
(defn sales-summaries []
(doseq [[c client-code] (dc/q '[:find ?c ?client-code
:in $
:where [?c :client/code ?client-code]]
:where [?c :client/code ?client-code]
[(= ?client-code "NGCL")]]
(dc/db conn))
{:sales-summary/keys [date]} (dirty-sales-summaries c)]
{:sales-summary/keys [date] :db/keys [id]} (dirty-sales-summaries c)]
(mu/with-context {:client-code client-code
:date date}
(alog/info ::updating)
@@ -63,25 +62,157 @@
[?li :order-line-item/category ?category]
[?li :order-line-item/total ?total]
[?li :order-line-item/tax ?tax]
[?li :order-line-item/discount ?discount] ]
[?li :order-line-item/discount ?discount]]
(dc/db conn)
[[c] date date]))
result {:sales-summary/client c
:sales-summary/date (c/to-date (atime/parse date atime/normal-date))
result {:db/id id
:sales-summary/client c
:sales-summary/date date
:sales-summary/dirty false
:sales-summary/client+date [c (c/to-date (atime/parse date atime/normal-date))]
:sales-summary/client+date [c date]
:sales-summary/discount (or (ffirst (dc/q '[:find (sum ?discount)
:with ?e
:in $ [?clients ?start-date ?end-date]
:where [(iol-ion.query/scan-sales-orders $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-order/discount ?discount]]
(dc/db conn)
[[c] date date]))
0.0)
:sales-summary/total-returns (or (let [[t f] (first (dc/q '[:find (sum ?t) (sum ?f)
:with ?e
:in $ [?clients ?start-date ?end-date]
:where [(iol-ion.query/scan-sales-refunds $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-refund/total ?t]
[?e :sales-refund/fee ?f]]
(dc/db conn)
[[c] date date]))]
(when (and t f)
(- t f)))
0.0)
:sales-summary/sales-items
(for [[item-name category total tax discount] sales]
{:sales-summary-item/item-name item-name
{:db/id (str (java.util.UUID/randomUUID))
:sales-summary-item/item-name item-name
:sales-summary-item/category category
:sales-summary-item/total total
:sales-summary-item/tax tax
:sales-summary-item/discount discount})}]
:sales-summary-item/discount discount})
:sales-summary/total-tax
(or (ffirst (dc/q '[:find (sum ?tax)
:with ?e
:in $ [?clients ?start-date ?end-date]
:where [(iol-ion.query/scan-sales-orders $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-order/tax ?tax]
#_[?e :sales-order/charges ?c]
#_[?c :charge/tax ?tax]]
(dc/db conn)
[[c] date date]))
0.0)
:sales-summary/total-tip
(or (ffirst (dc/q '[:find (sum ?tip)
:with ?c
:in $ [?clients ?start-date ?end-date]
:where [(iol-ion.query/scan-sales-orders $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-order/charges ?c]
[?c :charge/tip ?tip]]
(dc/db conn)
[[c] date date]))
0.0)
:sales-summary/total-card-payments
(or (ffirst (dc/q '[:find (sum ?total)
:with ?c
:in $ [?clients ?start-date ?end-date]
:where [(iol-ion.query/scan-sales-orders $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-order/charges ?c]
[?c :charge/type-name "CARD"]
[?c :charge/total ?total]]
(dc/db conn)
[[c] date date]))
0.0)
:sales-summary/total-card-fees
(or (ffirst (dc/q '[:find ?f
:in $ ?client ?d
:where
[?e :expected-deposit/client ?client]
[?e :expected-deposit/sales-date ?d]
[?e :expected-deposit/fee ?f]]
(dc/db conn)
c
date))
0.0)
:sales-summary/total-card-refunds
(or (ffirst (dc/q '[:find (sum ?t)
:in $ [?clients ?start-date ?end-date]
:where
:where [(iol-ion.query/scan-sales-refunds $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-refund/type "CARD"]
[?e :sales-refund/total ?t]]
(dc/db conn)
[[c] date date]))
0.0)
:sales-summary/total-cash-payments
(or (ffirst (dc/q '[:find (sum ?total)
:with ?c
:in $ [?clients ?start-date ?end-date]
:where [(iol-ion.query/scan-sales-orders $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-order/charges ?c]
[?c :charge/total ?total]
[?c :charge/type-name "CASH"]]
(dc/db conn)
[[c] date date]))
0.0)
:sales-summary/total-cash-refunds
(or (ffirst (dc/q '[:find (sum ?t)
:in $ [?clients ?start-date ?end-date]
:where
:where [(iol-ion.query/scan-sales-refunds $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-refund/type "CASH"]
[?e :sales-refund/total ?t]]
(dc/db conn)
[[c] date date]))
0.0)
:sales-summary/total-food-app-payments
(or (ffirst (dc/q '[:find (sum ?total)
:with ?c
:in $ [?clients ?start-date ?end-date] [?processor ...]
:where [(iol-ion.query/scan-sales-orders $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-order/charges ?c]
[?c :charge/processor ?processor]
[?c :charge/total ?total]]
(dc/db conn)
[[c] date date]
#{:ccp-processor/toast
#_:ccp-processor/ezcater
#_:ccp-processor/koala
:ccp-processor/doordash
:ccp-processor/grubhub
:ccp-processor/uber-eats}))
0.0)
:sales-summary/total-food-app-refunds
(or (ffirst (dc/q '[:find (sum ?t)
:in $ [?clients ?start-date ?end-date]
:where
:where [(iol-ion.query/scan-sales-refunds $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
(not [?e :sales-refund/type "CASH"])
(not [?e :sales-refund/type "CARD"])
[?e :sales-refund/total ?t]]
(dc/db conn)
[[c] date date]))
0.0)}]
(when (seq (:sales-summary/sales-items result))
(alog/info ::upserting-summaries
:category-count (count (:sales-summary/sales-items result)))
@(dc/transact conn [result]))))))
@(dc/transact conn [ [:upsert-entity result]]))))))
(defn reset-summaries []
@(dc/transact conn (->> (dc/q '[:find ?sos
@@ -91,6 +222,36 @@
(map (fn [[sos]]
[:db/retractEntity sos])))))
(comment
(auto-ap.datomic/transact-schema conn)
(apply mark-dirty [:client/code "NGCL"] (last-n-days 12))
#_(mark-all-dirty 700)
(sales-summaries)
(dc/q '[:find (pull ?sos [* {:sales-summary/sales-items [*]}])
:in $
:where [?sos :sales-summary/client [:client/code "NGCL"]]
[?sos :sales-summary/date ?d]
[(= ?d #inst "2024-03-25T00:00:00-07:00")]]
(dc/db conn))
)
(defn -main [& _]
(execute "sales-summaries" sales-summaries))