Adds rudimentary version of summarizing sales

This commit is contained in:
2024-03-31 00:22:53 -07:00
parent bff70e04b6
commit d1a660c5c1
7 changed files with 691 additions and 349 deletions

View File

@@ -0,0 +1,96 @@
(ns auto-ap.jobs.sales-summaries
(:require [auto-ap.datomic :refer [conn]]
[auto-ap.jobs.core :refer [execute]]
[auto-ap.logging :as alog]
[auto-ap.time :as atime]
[clj-time.coerce :as c]
[clj-time.core :as time]
[clj-time.periodic :as per]
[com.brunobonacci.mulog :as mu]
[datomic.api :as dc]))
(defn mark-dirty [client start end]
(let [client (dc/entid (dc/db conn) client)]
@(dc/transact conn
(for [s (per/periodic-seq start
end
(time/days 1))]
{:sales-summary/client client
:sales-summary/date (c/to-date s)
:sales-summary/dirty true
:sales-summary/client+date [client (c/to-date s)]}))))
(defn last-n-days [n]
[(.toDateMidnight (atime/localize (time/plus (time/now) (time/days (- n)))))
(.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))))
(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]
:start [:sales-summary/client+dirty [client-id true]]})
(filter (fn [sales-summary]
(= client-id (:db/id (:sales-summary/client sales-summary))))))))
(defn sales-summaries []
(doseq [[c client-code] (dc/q '[:find ?c ?client-code
:in $
:where [?c :client/code ?client-code]]
(dc/db conn))
{:sales-summary/keys [date]} (dirty-sales-summaries c)]
(mu/with-context {:client-code client-code
:date date}
(alog/info ::updating)
(let [sales (->> (dc/q '[:find ?item-name ?category (sum ?total) (sum ?tax) (sum ?discount)
:with ?e ?li
:in $ [?clients ?start-date ?end-date]
:where [(iol-ion.query/scan-sales-orders $ ?clients ?start-date ?end-date) [[?e _ ?sort-default] ...]]
[?e :sales-order/line-items ?li]
[?li :order-line-item/item-name ?item-name]
[?li :order-line-item/category ?category]
[?li :order-line-item/total ?total]
[?li :order-line-item/tax ?tax]
[?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))
:sales-summary/dirty false
:sales-summary/client+date [c (c/to-date (atime/parse date atime/normal-date))]
:sales-summary/sales-items
(for [[item-name category total tax discount] sales]
{: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})}]
(when (seq (:sales-summary/sales-items result))
(alog/info ::upserting-summaries
:category-count (count (:sales-summary/sales-items result)))
@(dc/transact conn [result]))))))
(defn reset-summaries []
@(dc/transact conn (->> (dc/q '[:find ?sos
:in $
:where [?sos :sales-summary/client]]
(dc/db conn))
(map (fn [[sos]]
[:db/retractEntity sos])))))
(defn -main [& _]
(execute "sales-summaries" sales-summaries))