External ledger

This commit is contained in:
2024-08-24 23:12:14 -07:00
parent 4316ebb34a
commit bb7e0abeed
4 changed files with 44 additions and 58 deletions

File diff suppressed because one or more lines are too long

View File

@@ -94,7 +94,7 @@
"sales"
(#{::payment-routes/all-page ::payment-routes/pending-page ::payment-routes/cleared-page ::payment-routes/voided-page} (:matched-route request))
"payments"
(#{::ledger-routes/all-page} (:matched-route request))
(#{::ledger-routes/all-page ::ledger-routes/external-page} (:matched-route request))
"ledger"
:else
nil)]
@@ -285,6 +285,14 @@
(tags/pill- {:color :secondary} "WIP")])
(menu-button- {:href (bidi/path-for client-routes/routes
:ledger)} "Register"))
(menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes
::ledger-routes/external-page)
{:date-range "month"})
:active? (= ::ledger-routes/external-page (:matched-route request))
:hx-boost "true"}
[:div.flex.gap-2
"External Register"
(tags/pill- {:color :secondary} "WIP")])
(when (is-admin? (:identity request))
(menu-button- {:href (bidi/path-for client-routes/routes
:ledger)} "Old Register")

View File

@@ -173,6 +173,8 @@
(merge-query {:query {:in ['?source]
:where ['[?e :journal-entry/source ?source]]}
:args [(:source args)]})
(:external? route-params)
(merge-query {:query { :where ['[?e :journal-entry/external-id]]} })
(:vendor args)
(merge-query {:query {:in ['?vendor-id]
@@ -261,6 +263,8 @@
(def default-read
'[:journal-entry/amount
:journal-entry/alternate-description
:journal-entry/source
:journal-entry/external-id
:db/id
[:journal-entry/date :xform clj-time.coerce/from-date]
{:journal-entry/vendor [:vendor/name :db/id]
@@ -448,8 +452,14 @@
:entity-name "register"
:route ::route/table
:break-table (fn [request entity]
(when (= (-> request :query-params :sort first :name) "Vendor")
(-> entity :journal-entry/vendor :vendor/name)))
(cond
(= (-> request :query-params :sort first :name) "Vendor")
(-> entity :journal-entry/vendor :vendor/name)
(= (-> request :query-params :sort first :name) "Source")
(-> entity :journal-entry/source)
:else nil))
:headers [{:key "client"
:name "Client"
:sort-key "client"
@@ -459,11 +469,25 @@
:render (fn [x] [:div.flex.items-center.gap-2 (-> x :invoice/client :client/name)
(map #(com/pill {:color :primary} (-> % :invoice-expense-account/location))
(:invoice/expense-accounts x)) ])}
{:key "vendor"
:name "Vendor"
:sort-key "vendor"
:render (fn [e] (or (-> e :journal-entry/vendor :vendor/name)
[:span.italic.text-gray-400 (-> e :journal-entry/alternate-description)]))}
{:key "source"
:name "Source"
:sort-key "source"
:hide? (fn [args]
(not (:external? (:route-params args))))
:render :journal-entry/source}
{:key "external-id"
:name "External Id"
:sort-key "external-id"
:class "max-w-[12rem]"
:hide? (fn [args]
(not (:external? (:route-params args))))
:render (fn [x] [:p.truncate ( :journal-entry/external-id x)])}
{:key "date"
:sort-key "date"
:name "Date"
@@ -510,40 +534,6 @@
(def row* (partial helper/row* grid-page))
(defn unvoid-invoice [{:as request :keys [identity entity]}]
(let [invoice entity
id (:db/id entity)
_ (assert-can-see-client identity (:db/id (:invoice/client invoice)))
_ (assert-not-locked (:db/id (:invoice/client invoice)) (:invoice/date invoice))
history (dc/history (dc/db conn))
txs (dc/q {:find ['?tx '?e '?original-status '?original-outstanding '?total '?ea '?ea-amount]
:where ['[?e :invoice/status :invoice-status/voided ?tx true]
'[?e :invoice/status ?original-status ?tx false]
'[?e :invoice/outstanding-balance ?original-outstanding ?tx false]
'[?e :invoice/total ?total ?tx false]
'[?ea :invoice-expense-account/amount ?ea-amount ?tx false]]
:in ['$ '?e]}
history id)
[last-transaction] (->> txs (sort-by first) (last))
tx [[:upsert-invoice
(->> txs
(filter (fn [[tx]] (= tx last-transaction)))
(reduce (fn [new-transaction [_ entity original-status original-outstanding total expense-account expense-account-amount]]
(-> new-transaction
(assoc :db/id entity
:invoice/total total
:invoice/status original-status
:invoice/outstanding-balance original-outstanding)
(update :invoice/expense-accounts (fnil conj []) {:db/id expense-account :invoice-expense-account/amount expense-account-amount})))
{}))]]
_ (audit-transact tx identity)]
(alog/info ::unvoiding-invoice :transaction :tx)
(html-response
(row* identity (dc/pull (dc/db conn) default-read id) {:flash? true
:request request})
:headers (cond-> {"hx-retarget" (format "#entity-table tr[data-id=\"%d\"]" id)
"hx-reswap" "outerHTML"}))))
(defn delete [{invoice :entity :as request identity :identity}]
(exception->notification
#(when-not (= :invoice-status/unpaid (:invoice/status invoice))
@@ -653,18 +643,6 @@
(defn bulk-delete-dialog-confirm [request]
(alog/peek (:form-params request))
(let [ids (selected->ids request (:form-params request))
updated-count (void-invoices-internal ids (:identity request))]
(html-response [:div]
:headers {"hx-trigger" (hx/json {:modalclose ""
:notification (format "Successfully voided %d of %d invoices."
updated-count
(count ids))})})))
@@ -678,30 +656,29 @@
(not bank-account-belongs?)
(update :query-params dissoc :bank-account))))))
(defn wrap-status-from-source [handler]
(defn wrap-external-from-route [handler]
(fn [{:keys [matched-current-page-route] :as request}]
(let [request (cond-> request
(= ::route/paid-page matched-current-page-route) (assoc-in [:route-params :status] :invoice-status/paid)
(= ::route/unpaid-page matched-current-page-route) (assoc-in [:route-params :status] :invoice-status/unpaid)
(= ::route/voided-page matched-current-page-route) (assoc-in [:route-params :status] :invoice-status/voided)
(= ::route/all-page matched-current-page-route) (assoc-in [:route-params :status] nil))]
(= ::route/external-page matched-current-page-route) (assoc-in [:route-params :external?] true))]
(handler request))))
(def key->handler
(apply-middleware-to-all-handlers
(->
{::route/all-page (-> (helper/page-route grid-page :parse-query-params? false)
(wrap-implied-route-param :status nil))
(wrap-implied-route-param :external? false))
::route/external-page (-> (helper/page-route grid-page :parse-query-params? false)
(wrap-implied-route-param :external? true))
::route/table (helper/table-route grid-page :parse-query-params? false)
::route/bank-account-filter bank-account-filter})
(fn [h]
(-> h
(wrap-copy-qp-pqp)
(wrap-status-from-source)
(wrap-apply-sort grid-page)
(wrap-ensure-bank-account-belongs)
(wrap-merge-prior-hx)
(wrap-external-from-route)
(wrap-schema-enforce :query-schema query-schema)
(wrap-schema-enforce :hx-schema query-schema)
(wrap-client-redirect-unauthenticated)))))

View File

@@ -1,5 +1,6 @@
(ns auto-ap.routes.ledger)
(def routes {"" {:get ::all-page}
"/external-new" ::external-page
"/table" ::table
"/bank-account-filter" ::bank-account-filter})