Makes simple sales summaries
This commit is contained in:
@@ -1,52 +1,50 @@
|
||||
(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]]
|
||||
(:require [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]]
|
||||
: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]]
|
||||
: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]))
|
||||
[iol-ion.query :refer [dollars=]]))
|
||||
|
||||
(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)
|
||||
::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)}))
|
||||
#_[: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}))]])
|
||||
#_(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]
|
||||
[:sales-summary/date :xform clj-time.coerce/from-date]
|
||||
*]) ;; TODO
|
||||
|
||||
(defn fetch-ids [db request]
|
||||
@@ -58,7 +56,7 @@
|
||||
[:client/code (:client-code query-params)]))
|
||||
query (cond-> {:query {:find []
|
||||
:in '[$ [?client ...]]
|
||||
:where '[ [?e :sales-summary/client ?client]]}
|
||||
:where '[[?e :sales-summary/client ?client]]}
|
||||
:args [db valid-clients]}
|
||||
(or (:start-date query-params)
|
||||
(:end-date query-params))
|
||||
@@ -74,7 +72,7 @@
|
||||
: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]]}}))]
|
||||
@@ -97,6 +95,19 @@
|
||||
[(->> (hydrate-results ids-to-retrieve db request))
|
||||
matching-count]))
|
||||
|
||||
(defn get-credits [ss]
|
||||
{:card-payments (+ (:sales-summary/total-card-payments ss 0.0)
|
||||
(:sales-summary/total-card-fees ss 0.0)
|
||||
(- (:sales-summary/total-card-refunds ss 0.0)))
|
||||
:food-app-payments (+ (:sales-summary/total-food-app-payments ss 0.0)
|
||||
(:sales-summary/total-food-app-fees ss 0.0)
|
||||
(- (:sales-summary/total-food-app-refunds ss 0.0)))
|
||||
:fees (- (:sales-summary/total-card-fees ss 0.0))
|
||||
:cash-payments (+ (:sales-summary/total-cash-payments ss 0.0)
|
||||
(- (:sales-summary/total-cash-refunds ss 0.0)))
|
||||
:discounts (+ (:sales-summary/discount ss 0.0))
|
||||
:returns (+ (:sales-summary/total-returns ss 0.0))})
|
||||
|
||||
(def grid-page
|
||||
(helper/build {:id "entity-table"
|
||||
:id-fn :db/id
|
||||
@@ -108,10 +119,10 @@
|
||||
: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
|
||||
: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))
|
||||
(helper/default-parse-query-params grid-page))
|
||||
:breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
|
||||
:admin)}
|
||||
"Admin"]
|
||||
@@ -126,51 +137,91 @@
|
||||
:name "Date"
|
||||
:sort-key "date"
|
||||
:render #(some-> % :sales-summary/date (atime/unparse-local atime/normal-date))}
|
||||
{:key "items"
|
||||
:name "items"
|
||||
:sort-key "source"
|
||||
{:key "credits"
|
||||
:name "Credits"
|
||||
:sort-key "credits"
|
||||
: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"
|
||||
(let [total-credits (reduce + 0.0 (vals (get-credits ss)))
|
||||
total-debits (+ (- (+ (reduce + 0.0 (map :sales-summary-item/total (:sales-summary/sales-items ss)))
|
||||
|
||||
(reduce + 0.0 (map :sales-summary-item/discount (:sales-summary/sales-items ss))))
|
||||
(reduce + 0.0 (map :sales-summary-item/tax (:sales-summary/sales-items ss))))
|
||||
|
||||
(:sales-summary/total-tax ss 0.0)
|
||||
(:sales-summary/total-tip ss 0.0))]
|
||||
[: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))
|
||||
(reduce + 0.0 (map :sales-summary-item/discount x)))
|
||||
(reduce + 0.0 (map :sales-summary-item/tax x))))])
|
||||
[:li "Sales subtotal: " (- (+ (reduce + 0.0 (map :sales-summary-item/total (:sales-summary/sales-items ss)))
|
||||
(reduce + 0.0 (map :sales-summary-item/discount (:sales-summary/sales-items ss))))
|
||||
|
||||
(reduce + 0.0 (map :sales-summary-item/tax (:sales-summary/sales-items ss))))]
|
||||
[:li "Tax: " (format "$%,.2f" (:sales-summary/total-tax ss))]
|
||||
[:li "Tips: " (format "$%,.2f" (:sales-summary/total-tip ss))]
|
||||
[:li (com/pill {:color (if (dollars= total-credits total-debits)
|
||||
:primary
|
||||
:red)} "Total: " (format "$%,.2f" total-debits))]])
|
||||
|
||||
#_(count))}
|
||||
|
||||
{:key "debits"
|
||||
:name "debits"
|
||||
:sort-key "debits"
|
||||
:render (fn [ss]
|
||||
[:ul
|
||||
[:li "Card Payments: "
|
||||
(format "$%,.2f" (:sales-summary/total-card-payments ss 0.0))
|
||||
(let [{:keys [card-payments food-app-payments
|
||||
cash-payments discounts fees
|
||||
returns] :as credits} (get-credits ss)
|
||||
total-credits (reduce + 0.0 (vals credits))
|
||||
total-debits (+ (- (+ (reduce + 0.0 (map :sales-summary-item/total (:sales-summary/sales-items ss)))
|
||||
|
||||
", fees: "
|
||||
(format "$%,.2f" (:sales-summary/total-card-fees ss 0.0))
|
||||
(reduce + 0.0 (map :sales-summary-item/discount (:sales-summary/sales-items ss))))
|
||||
(reduce + 0.0 (map :sales-summary-item/tax (:sales-summary/sales-items ss))))
|
||||
|
||||
", refunds: "
|
||||
(format "$%,.2f" (:sales-summary/total-card-refunds ss 0.0))]
|
||||
|
||||
[:li "Cash Payments: "
|
||||
(format "$%,.2f" (:sales-summary/total-cash-payments ss 0.0))
|
||||
(:sales-summary/total-tax ss 0.0)
|
||||
(:sales-summary/total-tip ss 0.0))]
|
||||
[:ul
|
||||
[:li "Card Payments: "
|
||||
(format "$%,.2f" card-payments)]
|
||||
|
||||
", 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))
|
||||
[:li "Food App Payments: "
|
||||
(format "$%,.2f" food-app-payments)]
|
||||
[:li "Cash Payments: "
|
||||
|
||||
", refunds: "
|
||||
(format "$%,.2f" (:sales-summary/total-food-app-refunds ss 0.0)) ]]
|
||||
|
||||
#_(count ))}]}))
|
||||
(format "$%,.2f" cash-payments)]
|
||||
[:li "Discounts: "
|
||||
|
||||
(format "$%,.2f" discounts)]
|
||||
|
||||
[:li "Fees: "
|
||||
(format "$%,.2f" fees)]
|
||||
[:li "Returns: "
|
||||
(format "$%,.2f" returns)]
|
||||
|
||||
|
||||
[:li (com/pill {:color (if (dollars= total-credits total-debits)
|
||||
:primary
|
||||
:red)} "Total: " (format "$%,.2f" total-credits))]])
|
||||
|
||||
#_(count))}]}))
|
||||
|
||||
;; TODO schema cleanup
|
||||
;; Decide on what should be calculated as generating ledger entries, and what should be calculated
|
||||
;; as part of the summary
|
||||
;; default thought here is that the summary has more detail (e.g., line items), fees broken out by type
|
||||
;; and aggregated into the final ledger entry
|
||||
;; that allows customization at any level.
|
||||
;; TODO rename refunds/returns
|
||||
|
||||
(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)))))
|
||||
(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)))))
|
||||
|
||||
Reference in New Issue
Block a user