Adds rudimentary version of summarizing sales
This commit is contained in:
96
src/clj/auto_ap/jobs/sales_summaries.clj
Normal file
96
src/clj/auto_ap/jobs/sales_summaries.clj
Normal 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))
|
||||
|
||||
Reference in New Issue
Block a user