Adds rudimentary version of summarizing sales
This commit is contained in:
@@ -1850,6 +1850,81 @@
|
|||||||
:db/valueType :db.type/tuple
|
:db/valueType :db.type/tuple
|
||||||
:db/tupleAttrs [:expected-deposit/client :expected-deposit/date]
|
:db/tupleAttrs [:expected-deposit/client :expected-deposit/date]
|
||||||
:db/cardinality :db.cardinality/one
|
:db/cardinality :db.cardinality/one
|
||||||
:db/index true}]
|
:db/index true}
|
||||||
|
|
||||||
|
{:db/ident :sales-summary/client
|
||||||
|
:db/valueType :db.type/ref
|
||||||
|
:db/cardinality :db.cardinality/one
|
||||||
|
:db/index true}
|
||||||
|
{:db/ident :sales-summary/date
|
||||||
|
:db/valueType :db.type/instant
|
||||||
|
:db/cardinality :db.cardinality/one
|
||||||
|
:db/index true}
|
||||||
|
{:db/ident :sales-summary/sales-items
|
||||||
|
:db/valueType :db.type/ref
|
||||||
|
:db/isComponent true,
|
||||||
|
:db/cardinality :db.cardinality/many}
|
||||||
|
{:db/ident :sales-summary-item/category
|
||||||
|
:db/valueType :db.type/string
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary-item/item-name
|
||||||
|
:db/valueType :db.type/string
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary-item/total
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary-item/tax
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary-item/discount
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary/dirty
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/boolean
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary/client+date
|
||||||
|
:db/valueType :db.type/tuple
|
||||||
|
:db/tupleAttrs [:sales-summary/client :sales-summary/date]
|
||||||
|
:db/cardinality :db.cardinality/one
|
||||||
|
:db/unique :db.unique/identity
|
||||||
|
:db/index true}
|
||||||
|
{:db/ident :sales-summary/client+dirty
|
||||||
|
:db/valueType :db.type/tuple
|
||||||
|
:db/tupleAttrs [:sales-summary/client :sales-summary/dirty]
|
||||||
|
:db/cardinality :db.cardinality/one
|
||||||
|
:db/index true}
|
||||||
|
|
||||||
|
{:db/ident :sales-summary/total-card-payments
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary/total-card-fees
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary/total-card-refunds
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary/total-cash-payments
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary/total-cash-refunds
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary/total-food-app-payments
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one}
|
||||||
|
{:db/ident :sales-summary/total-food-app-refunds
|
||||||
|
:db/noHistory true,
|
||||||
|
:db/valueType :db.type/double
|
||||||
|
:db/cardinality :db.cardinality/one} ]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
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))
|
||||||
|
|
||||||
@@ -178,14 +178,10 @@
|
|||||||
|
|
||||||
(defn pc [start end]
|
(defn pc [start end]
|
||||||
{"query" {"filter" {"date_time_filter"
|
{"query" {"filter" {"date_time_filter"
|
||||||
{
|
{"created_at" {"start_at" (->square-date start)
|
||||||
"created_at" {
|
"end_at" (->square-date end)}}}
|
||||||
"start_at" (->square-date start)
|
|
||||||
"end_at" (->square-date end)
|
|
||||||
}}}
|
|
||||||
|
|
||||||
"sort" {
|
"sort" {"sort_field" "CREATED_AT"
|
||||||
"sort_field" "CREATED_AT"
|
|
||||||
"sort_order" "DESC"}}})
|
"sort_order" "DESC"}}})
|
||||||
|
|
||||||
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
||||||
@@ -197,8 +193,7 @@
|
|||||||
(let [result (->> (client/get (str "https://connect.squareup.com/v2/orders/" order-id)
|
(let [result (->> (client/get (str "https://connect.squareup.com/v2/orders/" order-id)
|
||||||
{:headers (client-base-headers client)
|
{:headers (client-base-headers client)
|
||||||
:as :json})
|
:as :json})
|
||||||
:body
|
:body)]
|
||||||
)]
|
|
||||||
result)))
|
result)))
|
||||||
|
|
||||||
(defn continue-search [client location start end cursor]
|
(defn continue-search [client location start end cursor]
|
||||||
@@ -268,8 +263,7 @@
|
|||||||
(:sales-order/service-charge i))
|
(:sales-order/service-charge i))
|
||||||
(:sales-order/returns i)
|
(:sales-order/returns i)
|
||||||
|
|
||||||
(:sales-order/discount i)
|
(:sales-order/discount i))))
|
||||||
)))
|
|
||||||
0.0
|
0.0
|
||||||
[]))
|
[]))
|
||||||
|
|
||||||
@@ -345,8 +339,7 @@
|
|||||||
(de/catch (fn [e]
|
(de/catch (fn [e]
|
||||||
(log/error ::cant-transform
|
(log/error ::cant-transform
|
||||||
:exception e
|
:exception e
|
||||||
:line-item li)))))))
|
:line-item li))))))))
|
||||||
)
|
|
||||||
(s/buffer 5)
|
(s/buffer 5)
|
||||||
(s/realize-each)
|
(s/realize-each)
|
||||||
(s/reduce conj []))]
|
(s/reduce conj []))]
|
||||||
@@ -467,8 +460,7 @@
|
|||||||
:begin_time (->square-date start)
|
:begin_time (->square-date start)
|
||||||
:end_time (->square-date end)}))
|
:end_time (->square-date end)}))
|
||||||
:method :get
|
:method :get
|
||||||
:headers (client-base-headers client "2023-04-19")
|
:headers (client-base-headers client "2023-04-19")})
|
||||||
})
|
|
||||||
:body
|
:body
|
||||||
:payouts
|
:payouts
|
||||||
(fn [payouts]
|
(fn [payouts]
|
||||||
@@ -530,12 +522,10 @@
|
|||||||
[?s :expected-deposit/external-id ?eid]
|
[?s :expected-deposit/external-id ?eid]
|
||||||
[(clojure.string/includes? ?eid "settlement")]
|
[(clojure.string/includes? ?eid "settlement")]
|
||||||
[?s :expected-deposit/total ?t]
|
[?s :expected-deposit/total ?t]
|
||||||
[(iol-ion.query/dollars= ?t ?a)]
|
[(iol-ion.query/dollars= ?t ?a)]]
|
||||||
]
|
|
||||||
(dc/db conn)
|
(dc/db conn)
|
||||||
(:db/id client)
|
(:db/id client)
|
||||||
(amount->money (:amount_money payout))
|
(amount->money (:amount_money payout))))]
|
||||||
))]
|
|
||||||
:when (not equivalent-already-exists?)]
|
:when (not equivalent-already-exists?)]
|
||||||
#:expected-deposit {:external-id (str "square/payout/" (:id payout))
|
#:expected-deposit {:external-id (str "square/payout/" (:id payout))
|
||||||
:vendor :vendor/ccp-square
|
:vendor :vendor/ccp-square
|
||||||
@@ -663,9 +653,7 @@
|
|||||||
|
|
||||||
|
|
||||||
(defn get-cash-shift [client id]
|
(defn get-cash-shift [client id]
|
||||||
(de/chain (manifold-api-call {:url (str (url/url "https://connect.squareup.com/v2/cash-drawers/shifts" id
|
(de/chain (manifold-api-call {:url (str (url/url "https://connect.squareup.com/v2/cash-drawers/shifts" id))
|
||||||
|
|
||||||
))
|
|
||||||
:method :get
|
:method :get
|
||||||
|
|
||||||
:headers (client-base-headers client "2023-04-19")
|
:headers (client-base-headers client "2023-04-19")
|
||||||
@@ -707,8 +695,7 @@
|
|||||||
:opened-cash (amount->money (:opened_cash_money cash-drawer-shift))
|
:opened-cash (amount->money (:opened_cash_money cash-drawer-shift))
|
||||||
:date (coerce/to-date (:opened_at cash-drawer-shift))
|
:date (coerce/to-date (:opened_at cash-drawer-shift))
|
||||||
:client (:db/id client)
|
:client (:db/id client)
|
||||||
:location (:square-location/client-location l)
|
:location (:square-location/client-location l)}))))
|
||||||
}))))
|
|
||||||
(s/buffer 5)
|
(s/buffer 5)
|
||||||
(s/realize-each)
|
(s/realize-each)
|
||||||
(s/reduce conj []))))))
|
(s/reduce conj []))))))
|
||||||
@@ -875,3 +862,4 @@
|
|||||||
[:clients clients]
|
[:clients clients]
|
||||||
@(apply upsert-all clients)))
|
@(apply upsert-all clients)))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
176
src/clj/auto_ap/ssr/admin/sales_summaries.clj
Normal file
176
src/clj/auto_ap/ssr/admin/sales_summaries.clj
Normal 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)))))
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
[auto-ap.ssr.admin.transaction-rules :as admin-rules]
|
[auto-ap.ssr.admin.transaction-rules :as admin-rules]
|
||||||
[auto-ap.ssr.admin.vendors :as admin-vendors]
|
[auto-ap.ssr.admin.vendors :as admin-vendors]
|
||||||
[auto-ap.ssr.admin.clients :as admin-clients]
|
[auto-ap.ssr.admin.clients :as admin-clients]
|
||||||
|
[auto-ap.ssr.admin.sales-summaries :as admin-sales-summaries]
|
||||||
[auto-ap.ssr.auth :as auth]
|
[auto-ap.ssr.auth :as auth]
|
||||||
[auto-ap.ssr.indicators :as indicators]
|
[auto-ap.ssr.indicators :as indicators]
|
||||||
[auto-ap.ssr.company :as company]
|
[auto-ap.ssr.company :as company]
|
||||||
@@ -91,6 +92,7 @@
|
|||||||
(into admin-excel-invoices/key->handler)
|
(into admin-excel-invoices/key->handler)
|
||||||
(into admin/key->handler)
|
(into admin/key->handler)
|
||||||
(into admin-jobs/key->handler)
|
(into admin-jobs/key->handler)
|
||||||
|
(into admin-sales-summaries/key->handler)
|
||||||
(into admin-vendors/key->handler)
|
(into admin-vendors/key->handler)
|
||||||
(into admin-clients/key->handler)
|
(into admin-clients/key->handler)
|
||||||
(into admin-rules/key->handler)
|
(into admin-rules/key->handler)
|
||||||
|
|||||||
3
src/cljc/auto_ap/routes/admin/sales_summaries.cljc
Normal file
3
src/cljc/auto_ap/routes/admin/sales_summaries.cljc
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
(ns auto-ap.routes.admin.sales-summaries)
|
||||||
|
(def routes {"" {:get ::page}
|
||||||
|
"/table" ::table})
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
[auto-ap.routes.indicators :as indicator-routes]
|
[auto-ap.routes.indicators :as indicator-routes]
|
||||||
[auto-ap.routes.admin.vendors :as v-routes]
|
[auto-ap.routes.admin.vendors :as v-routes]
|
||||||
[auto-ap.routes.admin.clients :as ac-routes]
|
[auto-ap.routes.admin.clients :as ac-routes]
|
||||||
|
[auto-ap.routes.admin.sales-summaries :as ss-routes]
|
||||||
[auto-ap.routes.admin.transaction-rules :as tr-routes]))
|
[auto-ap.routes.admin.transaction-rules :as tr-routes]))
|
||||||
|
|
||||||
(def routes {"impersonate" :impersonate
|
(def routes {"impersonate" :impersonate
|
||||||
@@ -53,7 +54,8 @@
|
|||||||
["/disapprove/" [#"\d+" :transaction-id]] {:delete :transaction-insight-disapprove}
|
["/disapprove/" [#"\d+" :transaction-id]] {:delete :transaction-insight-disapprove}
|
||||||
["/rows/" [#"\d+" :after]] {:get :transaction-insight-rows}
|
["/rows/" [#"\d+" :after]] {:get :transaction-insight-rows}
|
||||||
["/explain/" [#"\d+" :transaction-id]] {:get :transaction-insight-explain}}}
|
["/explain/" [#"\d+" :transaction-id]] {:get :transaction-insight-explain}}}
|
||||||
"pos" {"/sales" {"" {:get :pos-sales}
|
"pos" {"/summaries" ss-routes/routes
|
||||||
|
"/sales" {"" {:get :pos-sales}
|
||||||
"/table" {:get :pos-sales-table}}
|
"/table" {:get :pos-sales-table}}
|
||||||
"/expected-deposit" {"" {:get :pos-expected-deposits}
|
"/expected-deposit" {"" {:get :pos-expected-deposits}
|
||||||
"/table" {:get :pos-expected-deposit-table}}
|
"/table" {:get :pos-expected-deposit-table}}
|
||||||
|
|||||||
Reference in New Issue
Block a user