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,176 @@
(ns auto-ap.ssr.admin.sales-summaries
(:require [auto-ap.client-routes :as client-routes]
[auto-ap.datomic
:refer [apply-pagination apply-sort-3 conn merge-query pull-many query2]]
[auto-ap.graphql.utils :refer [extract-client-ids]]
[auto-ap.routes.admin.sales-summaries :as route]
[auto-ap.routes.utils
:refer [wrap-admin wrap-client-redirect-unauthenticated]]
[auto-ap.ssr-routes :as ssr-routes]
[auto-ap.ssr.components :as com]
[auto-ap.ssr.components.date-range :refer [date-range-field]]
[auto-ap.ssr.grid-page-helper :as helper]
[auto-ap.ssr.svg :as svg]
[auto-ap.ssr.utils
:refer [apply-middleware-to-all-handlers]]
[auto-ap.time :as atime]
[bidi.bidi :as bidi]
[clj-time.coerce :as c]
[datomic.api :as dc]
[hiccup.util :as hu]))
(defn filters [request]
[:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms"
"hx-get" (bidi/path-for ssr-routes/only-routes
::route/table)
"hx-target" "#entity-table"
"hx-indicator" "#entity-table"}
#_[:fieldset.space-y-6
(date-range-field {:value {:start (:start-date (:parsed-query-params request))
:end (:end-date (:parsed-query-params request))}
:id "date-range"})
(com/field {:label "Source"}
(com/select {:name "source"
:class "hot-filter w-full"
:value (:source (:parsed-query-params request))
:placeholder ""
:options (ref->select-options "import-source" :allow-nil? true)}))
#_(com/field {:label "Code"}
(com/text-input {:name "code"
:id "code"
:class "hot-filter"
:value (:code (:parsed-query-params request))
:placeholder "11101"
:size :small}))]])
(def default-read '[:db/id
[ :sales-summary/date :xform clj-time.coerce/from-date]
*]) ;; TODO
(defn fetch-ids [db request]
(let [query-params (:parsed-query-params request)
valid-clients (extract-client-ids (:clients request)
(:client request)
(:client-id query-params)
(when (:client-code query-params)
[:client/code (:client-code query-params)]))
query (cond-> {:query {:find []
:in '[$ [?client ...]]
:where '[ [?e :sales-summary/client ?client]]}
:args [db valid-clients]}
(or (:start-date query-params)
(:end-date query-params))
(merge-query {:query '{:where [[?e :sales-summary/date ?d]]}})
(:start-date query-params)
(merge-query {:query '{:in [?start-date]
:where [[(>= ?d ?start-date)]]}
:args [(-> query-params :start-date c/to-date)]})
(:end-date query-params)
(merge-query {:query '{:in [?end-date]
:where [[(< ?d ?end-date)]]}
:args [(-> query-params :end-date c/to-date)]})
true
(merge-query {:query {:find ['?sort-default '?e]
:where ['[?e :sales-summary/date ?sort-default]]}}))]
(cond->> (query2 query)
true (apply-sort-3 query-params)
true (apply-pagination query-params))))
(defn hydrate-results [ids db _]
(let [results (->> (pull-many db default-read ids)
(group-by :db/id))
refunds (->> ids
(map results)
(map first))]
refunds))
(defn fetch-page [request]
(let [db (dc/db conn)
{ids-to-retrieve :ids matching-count :count} (fetch-ids db request)]
[(->> (hydrate-results ids-to-retrieve db request))
matching-count]))
(def grid-page
(helper/build {:id "entity-table"
:id-fn :db/id
:nav (com/admin-aside-nav)
:fetch-page fetch-page
:page-specific-nav filters
:row-buttons (fn [_ entity]
[])
:oob-render
(fn [request]
[#_(assoc-in (date-range-field {:value {:start (:start-date (:parsed-query-params request))
:end (:end-date (:parsed-query-params request))}
:id "date-range"}) [1 :hx-swap-oob] true)]) ;; TODO
:parse-query-params (comp
(helper/default-parse-query-params grid-page))
:breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
:admin)}
"Admin"]
[:a {:href (bidi/path-for ssr-routes/only-routes
::route/page)}
"Sales Summaries"]]
:title "Sales Summaries"
:entity-name "Daily Summary"
:route ::route/table
:headers [{:key "date"
:name "Date"
:sort-key "date"
:render #(some-> % :sales-summary/date (atime/unparse-local atime/normal-date))}
{:key "items"
:name "items"
:sort-key "source"
:render (fn [ss]
[:ul
(for [[ n x] (group-by :sales-summary-item/category (:sales-summary/sales-items ss))]
[:li n ": " (format "$%,.2f" (reduce + 0.0 (map :sales-summary-item/total x)))])]
#_(count ))}
{:key "payments"
:name "payments"
:sort-key "payments"
:render (fn [ss]
[:ul
[:li "Card Payments: "
(format "$%,.2f" (:sales-summary/total-card-payments ss 0.0))
", fees: "
(format "$%,.2f" (:sales-summary/total-card-fees ss 0.0))
", refunds: "
(format "$%,.2f" (:sales-summary/total-card-refunds ss 0.0))]
[:li "Cash Payments: "
(format "$%,.2f" (:sales-summary/total-cash-payments ss 0.0))
", refunds: "
(format "$%,.2f" (:sales-summary/total-cash-refunds ss 0.0))]
[:li "Food App Payments: "
(format "$%,.2f" (:sales-summary/total-food-app-payments ss 0.0))
", refunds: "
(format "$%,.2f" (:sales-summary/total-food-app-refunds ss 0.0)) ]]
#_(count ))}]}))
(def row* (partial helper/row* grid-page))
(def table* (partial helper/table* grid-page))
(def key->handler
(apply-middleware-to-all-handlers
(->>
{::route/page (helper/page-route grid-page)
::route/table (helper/table-route grid-page)})
(fn [h]
(-> h
(wrap-admin)
(wrap-client-redirect-unauthenticated)))))