merged
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -6,10 +6,12 @@
|
|||||||
[auto-ap.datomic.accounts :as d-accounts]
|
[auto-ap.datomic.accounts :as d-accounts]
|
||||||
[auto-ap.graphql.utils :refer [extract-client-ids]]
|
[auto-ap.graphql.utils :refer [extract-client-ids]]
|
||||||
[auto-ap.query-params :refer [wrap-copy-qp-pqp]]
|
[auto-ap.query-params :refer [wrap-copy-qp-pqp]]
|
||||||
|
[auto-ap.client-routes :as client-routes]
|
||||||
[auto-ap.routes.pos.sales-summaries :as route]
|
[auto-ap.routes.pos.sales-summaries :as route]
|
||||||
[auto-ap.ssr-routes :as ssr-routes]
|
[auto-ap.ssr-routes :as ssr-routes]
|
||||||
[auto-ap.ssr.common-handlers :refer [add-new-entity-handler]]
|
[auto-ap.ssr.common-handlers :refer [add-new-entity-handler]]
|
||||||
[auto-ap.ssr.components :as com]
|
[auto-ap.ssr.components :as com]
|
||||||
|
[auto-ap.ssr.components.link-dropdown :refer [link-dropdown]]
|
||||||
[auto-ap.ssr.components.multi-modal :as mm]
|
[auto-ap.ssr.components.multi-modal :as mm]
|
||||||
[auto-ap.ssr.form-cursor :as fc]
|
[auto-ap.ssr.form-cursor :as fc]
|
||||||
[auto-ap.ssr.grid-page-helper :as helper :refer [wrap-apply-sort]]
|
[auto-ap.ssr.grid-page-helper :as helper :refer [wrap-apply-sort]]
|
||||||
@@ -27,7 +29,7 @@
|
|||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[datomic.api :as dc]
|
[datomic.api :as dc]
|
||||||
[hiccup.util :as hu]
|
[hiccup.util :as hu]
|
||||||
[iol-ion.query :refer [dollars=]]
|
[iol-ion.query :refer [dollars= dollars-0?]]
|
||||||
[malli.core :as mc]
|
[malli.core :as mc]
|
||||||
[malli.util :as mut]))
|
[malli.util :as mut]))
|
||||||
|
|
||||||
@@ -55,15 +57,14 @@
|
|||||||
*
|
*
|
||||||
[:sales-summary/date :xform clj-time.coerce/from-date]
|
[:sales-summary/date :xform clj-time.coerce/from-date]
|
||||||
{:sales-summary/client [:client/code :client/name :db/id]}
|
{:sales-summary/client [:client/code :client/name :db/id]}
|
||||||
{:sales-summary/items [{[:ledger-mapped/ledger-side :xform iol-ion.query/ident] [:db/ident]
|
{:sales-summary/items [{[:ledger-mapped/ledger-side :xform iol-ion.query/ident] [:db/ident]}
|
||||||
}
|
|
||||||
:ledger-mapped/account
|
:ledger-mapped/account
|
||||||
:ledger-mapped/amount
|
:ledger-mapped/amount
|
||||||
:sales-summary-item/category
|
:sales-summary-item/category
|
||||||
:sales-summary-item/sort-order
|
:sales-summary-item/sort-order
|
||||||
:db/id
|
:db/id
|
||||||
:sales-summary-item/manual?]
|
:sales-summary-item/manual?]}
|
||||||
} ])
|
{:journal-entry/original-entity [:db/id]}])
|
||||||
|
|
||||||
(defn fetch-ids [db request]
|
(defn fetch-ids [db request]
|
||||||
(let [query-params (:query-params request)
|
(let [query-params (:query-params request)
|
||||||
@@ -90,7 +91,6 @@
|
|||||||
:where [[(< ?d ?end-date)]]}
|
:where [[(< ?d ?end-date)]]}
|
||||||
:args [(-> query-params :end-date c/to-date)]})
|
:args [(-> query-params :end-date c/to-date)]})
|
||||||
|
|
||||||
|
|
||||||
true
|
true
|
||||||
(merge-query {:query {:find ['?sort-default '?e]
|
(merge-query {:query {:find ['?sort-default '?e]
|
||||||
:where ['[?e :sales-summary/date ?sort-default]]}}))]
|
:where ['[?e :sales-summary/date ?sort-default]]}}))]
|
||||||
@@ -116,9 +116,6 @@
|
|||||||
(defn sort-items [ss]
|
(defn sort-items [ss]
|
||||||
(sort-by (juxt :ledger-mapped/ledger-side :sales-summary-item/sort-order :sales-summary-item/category) ss))
|
(sort-by (juxt :ledger-mapped/ledger-side :sales-summary-item/sort-order :sales-summary-item/category) ss))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defn total-debits [items]
|
(defn total-debits [items]
|
||||||
(->> items
|
(->> items
|
||||||
(filter #(= :ledger-side/debit (:ledger-mapped/ledger-side %)))
|
(filter #(= :ledger-side/debit (:ledger-mapped/ledger-side %)))
|
||||||
@@ -131,6 +128,11 @@
|
|||||||
(map #(:ledger-mapped/amount % 0.0))
|
(map #(:ledger-mapped/amount % 0.0))
|
||||||
(reduce + 0.0)))
|
(reduce + 0.0)))
|
||||||
|
|
||||||
|
(defn truncate [s max-len]
|
||||||
|
(if (> (count s) max-len)
|
||||||
|
(str (subs s 0 (- max-len 3)) "...")
|
||||||
|
s))
|
||||||
|
|
||||||
(def grid-page
|
(def grid-page
|
||||||
(helper/build {:id "entity-table"
|
(helper/build {:id "entity-table"
|
||||||
:id-fn :db/id
|
:id-fn :db/id
|
||||||
@@ -163,46 +165,107 @@
|
|||||||
(= (count (:clients args)) 1))
|
(= (count (:clients args)) 1))
|
||||||
:render #(-> % :sales-summary/client :client/code)}
|
:render #(-> % :sales-summary/client :client/code)}
|
||||||
|
|
||||||
|
|
||||||
{:key "date"
|
{:key "date"
|
||||||
:name "Date"
|
:name "Date"
|
||||||
:sort-key "date"
|
:sort-key "date"
|
||||||
:render #(some-> % :sales-summary/date (atime/unparse-local atime/normal-date))}
|
:render #(some-> % :sales-summary/date (atime/unparse-local atime/normal-date))}
|
||||||
|
|
||||||
|
|
||||||
{:key "debits"
|
{:key "debits"
|
||||||
:name "debits"
|
:name "Debits"
|
||||||
:sort-key "debits"
|
:sort-key "debits"
|
||||||
|
:class "w-64 align-top"
|
||||||
:render (fn [ss]
|
:render (fn [ss]
|
||||||
(let [total-debits (total-debits (:sales-summary/items ss))
|
(let [items (:sales-summary/items ss)
|
||||||
total-credits (total-credits (:sales-summary/items ss))]
|
debit-items (filter #(= :ledger-side/debit (:ledger-mapped/ledger-side %)) (sort-items items))
|
||||||
[:ul
|
credit-count (count (filter #(= :ledger-side/credit (:ledger-mapped/ledger-side %)) items))
|
||||||
(for [si (sort-items (:sales-summary/items ss))
|
total-debits (total-debits items)
|
||||||
:when (= :ledger-side/debit (:ledger-mapped/ledger-side si))]
|
total-credits (total-credits items)
|
||||||
[:li (:sales-summary-item/category si) ": " (format "$%,.2f" (:ledger-mapped/amount si))
|
delta (- total-debits total-credits)]
|
||||||
|
[:div.flex.flex-col.h-full
|
||||||
|
[:div.font-semibold.text-sm "Debits"]
|
||||||
|
[:ul.space-y-0.5.flex-grow
|
||||||
|
(for [si debit-items]
|
||||||
|
[:li.text-sm.text-gray-700
|
||||||
|
[:span.text-gray-500 (truncate (:sales-summary-item/category si) 30)]
|
||||||
|
[:span.ml-2 "→"]
|
||||||
|
[:span.ml-2.font-mono (format "$%,.2f" (:ledger-mapped/amount si))]
|
||||||
(when-not (:ledger-mapped/account si)
|
(when-not (:ledger-mapped/account si)
|
||||||
[:span.pl-4 (com/pill {:color :red}
|
[:span.ml-2 (com/pill {:color :red} "?")])])
|
||||||
"missing account")])]
|
(for [_ (range (max 0 (- credit-count (count debit-items))))]
|
||||||
)
|
[:li "\u00a0"])]
|
||||||
[:li (com/pill {:color (if (dollars= total-debits total-credits)
|
[:div.border-t.mt-1.pt-1.flex.justify-between.items-center.w-full
|
||||||
:primary
|
[:span.font-semibold "Total"]
|
||||||
:red)} "Total: " (format "$%,.2f" total-debits))]]))}
|
[:span.font-mono.font-semibold (format "$%,.2f" total-debits)]]
|
||||||
|
(when-not (dollars-0? delta)
|
||||||
|
[:div.text-xs.text-red-600.flex.justify-between.w-full.mt-1
|
||||||
|
[:span "Delta:"]
|
||||||
|
[:span.font-mono (format "$%,.2f" delta)]])]))}
|
||||||
|
|
||||||
{:key "credits"
|
{:key "credits"
|
||||||
:name "credits"
|
:name "Credits"
|
||||||
:sort-key "credits"
|
:sort-key "credits"
|
||||||
|
:class "w-64 align-top"
|
||||||
:render (fn [ss]
|
:render (fn [ss]
|
||||||
(let [total-debits (total-debits (:sales-summary/items ss))
|
(let [items (:sales-summary/items ss)
|
||||||
total-credits (total-credits (:sales-summary/items ss))]
|
credit-items (filter #(= :ledger-side/credit (:ledger-mapped/ledger-side %)) (sort-items items))
|
||||||
[:ul
|
debit-count (count (filter #(= :ledger-side/debit (:ledger-mapped/ledger-side %)) items))
|
||||||
(for [si (sort-items (:sales-summary/items ss))
|
total-debits (total-debits items)
|
||||||
:when (= :ledger-side/credit (:ledger-mapped/ledger-side si))]
|
total-credits (total-credits items)
|
||||||
[:li (:sales-summary-item/category si) ": " (format "$%,.2f" (:ledger-mapped/amount si))
|
delta (- total-credits total-debits)]
|
||||||
|
[:div.flex.flex-col.h-full
|
||||||
|
[:div.font-semibold.text-sm "Credits"]
|
||||||
|
[:ul.space-y-0.5.flex-grow
|
||||||
|
(for [si credit-items]
|
||||||
|
[:li.text-sm.text-gray-700
|
||||||
|
[:span.text-gray-500 (truncate (:sales-summary-item/category si) 30)]
|
||||||
|
[:span.ml-2 "→"]
|
||||||
|
[:span.ml-2.font-mono (format "$%,.2f" (:ledger-mapped/amount si))]
|
||||||
(when-not (:ledger-mapped/account si)
|
(when-not (:ledger-mapped/account si)
|
||||||
[:span.pl-4 (com/pill {:color :red}
|
[:span.ml-2 (com/pill {:color :red} "?")])])
|
||||||
"missing account")])])
|
(for [_ (range (max 0 (- debit-count (count credit-items))))]
|
||||||
[:li (com/pill {:color (if (dollars= total-debits total-credits)
|
[:li "\u00a0"])]
|
||||||
:primary
|
[:div.border-t.mt-1.pt-1.flex.justify-between.items-center.w-full
|
||||||
:red)} "Total: " (format "$%,.2f" total-credits))]]))}]}))
|
[:span.font-semibold "Total"]
|
||||||
|
[:span.font-mono.font-semibold (format "$%,.2f" total-credits)]]
|
||||||
|
(when-not (dollars-0? delta)
|
||||||
|
[:div.text-xs.text-green-600.flex.justify-between.w-full.mt-1
|
||||||
|
[:span "Delta:"]
|
||||||
|
[:span.font-mono (format "$%,.2f" delta)]])]))}
|
||||||
|
|
||||||
|
{:key "balance"
|
||||||
|
:name "Balance"
|
||||||
|
:sort-key "balance"
|
||||||
|
:class "w-24"
|
||||||
|
:render (fn [ss]
|
||||||
|
(let [items (:sales-summary/items ss)
|
||||||
|
total-debits (total-debits items)
|
||||||
|
total-credits (total-credits items)
|
||||||
|
delta (- total-debits total-credits)
|
||||||
|
balanced? (dollars= total-debits total-credits)
|
||||||
|
missing-account? (some #(not (:ledger-mapped/account %)) items)]
|
||||||
|
[:div.flex.flex-col.items-center.pt-2
|
||||||
|
(when missing-account?
|
||||||
|
[:span.text-red-600.font-bold.text-xs "Missing acct"])
|
||||||
|
(if balanced?
|
||||||
|
(when-not missing-account?
|
||||||
|
[:span.text-green-600.font-bold "✓ Balanced"])
|
||||||
|
(list
|
||||||
|
[:span.text-red-600.font-mono (format "$%,.2f" (Math/abs delta))]
|
||||||
|
[:span.text-xs.text-gray-500.mt-1
|
||||||
|
(if (> total-debits total-credits) "Debit over" "Credit over")]))]))}
|
||||||
|
|
||||||
|
{:key "links"
|
||||||
|
:name "Links"
|
||||||
|
:show-starting "lg"
|
||||||
|
:class "w-8"
|
||||||
|
:render (fn [ss]
|
||||||
|
(let [ledger-entry (:journal-entry/original-entity ss)]
|
||||||
|
(when (seq ledger-entry)
|
||||||
|
(link-dropdown
|
||||||
|
[{:link (hu/url (bidi/path-for client-routes/routes :ledger)
|
||||||
|
{:exact-match-id (:db/id (first ledger-entry))})
|
||||||
|
:color :yellow
|
||||||
|
:content "Ledger entry"}]))))}]}))
|
||||||
|
|
||||||
(def row* (partial helper/row* grid-page))
|
(def row* (partial helper/row* grid-page))
|
||||||
(def table* (partial helper/table* grid-page))
|
(def table* (partial helper/table* grid-page))
|
||||||
@@ -235,7 +298,6 @@
|
|||||||
(not (and (:credit x)
|
(not (and (:credit x)
|
||||||
(:debit x))))]]]]])
|
(:debit x))))]]]]])
|
||||||
|
|
||||||
|
|
||||||
(defn summary-total-row* [request]
|
(defn summary-total-row* [request]
|
||||||
(let [total-credits (-> request
|
(let [total-credits (-> request
|
||||||
:multi-form-state
|
:multi-form-state
|
||||||
@@ -450,8 +512,7 @@
|
|||||||
(if (:sales-summary-item/manual? i)
|
(if (:sales-summary-item/manual? i)
|
||||||
(attach-ledger i)
|
(attach-ledger i)
|
||||||
{:db/id (:db/id i)
|
{:db/id (:db/id i)
|
||||||
:ledger-mapped/account (:ledger-mapped/account i)
|
:ledger-mapped/account (:ledger-mapped/account i)}))
|
||||||
}))
|
|
||||||
(:sales-summary/items result))}]]
|
(:sales-summary/items result))}]]
|
||||||
(clojure.pprint/pprint (:sales-summary/items result))
|
(clojure.pprint/pprint (:sales-summary/items result))
|
||||||
@(dc/transact conn [transaction])
|
@(dc/transact conn [transaction])
|
||||||
|
|||||||
Reference in New Issue
Block a user