Nearly able to create invoices manually
This commit is contained in:
@@ -14,7 +14,6 @@ document.addEventListener('alpine:init', () => {
|
|||||||
|
|
||||||
effect(() => {
|
effect(() => {
|
||||||
dependent_properties(props => {
|
dependent_properties(props => {
|
||||||
console.log("CHANGED PROPS", expression, props)
|
|
||||||
el.dispatchEvent(
|
el.dispatchEvent(
|
||||||
new CustomEvent(value, {
|
new CustomEvent(value, {
|
||||||
props,
|
props,
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -43,8 +43,12 @@
|
|||||||
[manifold.deferred :as de])
|
[manifold.deferred :as de])
|
||||||
(:import [java.util UUID]))
|
(:import [java.util UUID]))
|
||||||
|
|
||||||
|
|
||||||
;; TODO make more reusable malli schemas, use unions if it would be helpful
|
;; TODO make more reusable malli schemas, use unions if it would be helpful
|
||||||
|
;; TODO copy save logic from graphql version
|
||||||
;; TODO cash drawer shift
|
;; TODO cash drawer shift
|
||||||
|
;; TODO a few bug fixes from slack
|
||||||
|
;; TOOD check pinecone
|
||||||
|
|
||||||
(defn filters [request]
|
(defn filters [request]
|
||||||
[:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms"
|
[:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms"
|
||||||
@@ -1346,14 +1350,16 @@
|
|||||||
:validation-route ::route/navigate))
|
:validation-route ::route/navigate))
|
||||||
mm/Initializable
|
mm/Initializable
|
||||||
(init-step-params
|
(init-step-params
|
||||||
[_ request]
|
[_ multi-form-state request]
|
||||||
(let [bank-account-type (get-in request [:query-params :bank-account-type])]
|
(let [bank-account-type (get-in request [:query-params :bank-account-type])]
|
||||||
(cond->
|
(if (= {} (:step-params multi-form-state))
|
||||||
{:db/id (str (java.util.UUID/randomUUID))
|
(cond->
|
||||||
:new? true}
|
{:db/id (str (java.util.UUID/randomUUID))
|
||||||
|
:new? true}
|
||||||
|
|
||||||
bank-account-type (assoc :bank-account/type (keyword "bank-account-type" bank-account-type)
|
bank-account-type (assoc :bank-account/type (keyword "bank-account-type" bank-account-type)
|
||||||
:bank-account/visible true))))
|
:bank-account/visible true))
|
||||||
|
(:step-params multi-form-state))))
|
||||||
|
|
||||||
mm/Discardable
|
mm/Discardable
|
||||||
(can-discard? [_ step-params]
|
(can-discard? [_ step-params]
|
||||||
|
|||||||
@@ -1,28 +1,19 @@
|
|||||||
(ns auto-ap.ssr.components.multi-modal
|
(ns auto-ap.ssr.components.multi-modal
|
||||||
(:require [auto-ap.ssr.components :as com]
|
(:require [auto-ap.cursor :as cursor]
|
||||||
[auto-ap.ssr.form-cursor :as fc]
|
[auto-ap.ssr-routes :as ssr-routes]
|
||||||
|
[auto-ap.ssr.components :as com]
|
||||||
[auto-ap.ssr.nested-form-params :refer [wrap-nested-form-params]]
|
|
||||||
[auto-ap.ssr.utils
|
|
||||||
:refer [html-response
|
|
||||||
assert-schema
|
|
||||||
main-transformer
|
|
||||||
modal-response
|
|
||||||
wrap-form-4xx-2
|
|
||||||
wrap-schema-enforce]]
|
|
||||||
[auto-ap.ssr.components.timeline :as timeline]
|
[auto-ap.ssr.components.timeline :as timeline]
|
||||||
|
[auto-ap.ssr.form-cursor :as fc]
|
||||||
|
[auto-ap.ssr.hx :as hx]
|
||||||
|
[auto-ap.ssr.nested-form-params :refer [wrap-nested-form-params]]
|
||||||
|
[auto-ap.ssr.svg :as svg]
|
||||||
|
[auto-ap.ssr.utils
|
||||||
|
:refer [assert-schema html-response main-transformer
|
||||||
|
modal-response wrap-form-4xx-2 wrap-schema-enforce]]
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
[hiccup.util :as hu]
|
[hiccup.util :as hu]
|
||||||
[auto-ap.ssr-routes :as ssr-routes]
|
|
||||||
[auto-ap.ssr.svg :as svg]
|
|
||||||
[auto-ap.ssr.hx :as hx]
|
|
||||||
[malli.core :as mc]
|
[malli.core :as mc]
|
||||||
[hiccup2.core :as hiccup2]
|
[malli.core :as m]))
|
||||||
[hiccup2.core :as hiccup]
|
|
||||||
[auto-ap.cursor :as cursor]
|
|
||||||
[malli.core :as m]
|
|
||||||
[auto-ap.logging :as alog])
|
|
||||||
(:import [auto_ap.cursor VecCursor]))
|
|
||||||
|
|
||||||
|
|
||||||
(def default-form-props {:hx-ext "response-targets"
|
(def default-form-props {:hx-ext "response-targets"
|
||||||
@@ -40,18 +31,12 @@
|
|||||||
(step-name [this]))
|
(step-name [this]))
|
||||||
|
|
||||||
(defprotocol Initializable
|
(defprotocol Initializable
|
||||||
(init-step-params [this request]))
|
(init-step-params [this multi-form-state request]))
|
||||||
|
|
||||||
(defprotocol Discardable
|
(defprotocol Discardable
|
||||||
(can-discard? [this step-params])
|
(can-discard? [this step-params])
|
||||||
(discard-changes [this request]))
|
(discard-changes [this request]))
|
||||||
|
|
||||||
|
|
||||||
(defn- init-step-params- [step request]
|
|
||||||
(if (satisfies? Initializable step)
|
|
||||||
(init-step-params step request)
|
|
||||||
{}))
|
|
||||||
|
|
||||||
(defprotocol LinearModalWizard
|
(defprotocol LinearModalWizard
|
||||||
(hydrate-from-request [this request])
|
(hydrate-from-request [this request])
|
||||||
(get-current-step [this])
|
(get-current-step [this])
|
||||||
@@ -175,7 +160,7 @@
|
|||||||
(com/modal-card-advanced
|
(com/modal-card-advanced
|
||||||
{"@keydown.enter.prevent.stop" "$refs.next.click()"
|
{"@keydown.enter.prevent.stop" "$refs.next.click()"
|
||||||
:class (str
|
:class (str
|
||||||
"w-[750px] h-[600px]
|
"w-full h-full md:w-[750px] md:h-[600px]
|
||||||
group-[.forward]/transition:htmx-swapping:opacity-0
|
group-[.forward]/transition:htmx-swapping:opacity-0
|
||||||
group-[.forward]/transition:htmx-swapping:-translate-x-1/4
|
group-[.forward]/transition:htmx-swapping:-translate-x-1/4
|
||||||
group-[.forward]/transition:htmx-swapping:scale-75
|
group-[.forward]/transition:htmx-swapping:scale-75
|
||||||
@@ -207,7 +192,7 @@
|
|||||||
head)
|
head)
|
||||||
#_(com/modal-header-attachment {})
|
#_(com/modal-header-attachment {})
|
||||||
[:div.flex.shrink.overflow-auto.grow
|
[:div.flex.shrink.overflow-auto.grow
|
||||||
[:div.grow-0.pr-6.pt-2.bg-gray-100.self-stretch #_{:style "margin-left:-20px"} (render-timeline linear-wizard step validation-route)]
|
[:div.grow-0.pr-6.pt-2.bg-gray-100.self-stretch.hidden.md:block #_{:style "margin-left:-20px"} (render-timeline linear-wizard step validation-route)]
|
||||||
(com/modal-body {}
|
(com/modal-body {}
|
||||||
body)]
|
body)]
|
||||||
|
|
||||||
@@ -253,9 +238,11 @@
|
|||||||
(-> request
|
(-> request
|
||||||
(assoc :multi-form-state (-> (:multi-form-state request)
|
(assoc :multi-form-state (-> (:multi-form-state request)
|
||||||
(merge-multi-form-state)
|
(merge-multi-form-state)
|
||||||
(select-state
|
(select-state (edit-path new-step request) {})
|
||||||
(edit-path new-step request)
|
(#(cond-> %
|
||||||
(init-step-params- new-step request))))))
|
(satisfies? Initializable new-step)
|
||||||
|
(assoc :step-params
|
||||||
|
(init-step-params new-step % request))))))))
|
||||||
:headers {"HX-reswap" (when transition-type "outerHTML swap:0.16s")
|
:headers {"HX-reswap" (when transition-type "outerHTML swap:0.16s")
|
||||||
"x-transition-type" (or transition-type "none")})))
|
"x-transition-type" (or transition-type "none")})))
|
||||||
(wrap-ensure-step)
|
(wrap-ensure-step)
|
||||||
|
|||||||
@@ -40,7 +40,8 @@
|
|||||||
children ]))
|
children ]))
|
||||||
|
|
||||||
(defn vertical-timeline [params & children]
|
(defn vertical-timeline [params & children]
|
||||||
[:ol {:class "flex flex-col items-start space-y-2 text-xs text-center text-gray-500 bg-gray-100 dark:text-gray-400 sm:text-base dark:bg-gray-800 sm:space-y-4 px-2"}
|
[:ol {:class (hh/add-class "flex flex-col items-start space-y-2 text-xs text-center text-gray-500 bg-gray-100 dark:text-gray-400 sm:text-base dark:bg-gray-800 sm:space-y-4 px-2"
|
||||||
|
(:class params))}
|
||||||
children
|
children
|
||||||
#_[:li {:class "flex items-center"}
|
#_[:li {:class "flex items-center"}
|
||||||
[:span {:class "flex items-center justify-center w-5 h-5 mr-2 text-xs border border-gray-500 rounded-full shrink-0 dark:border-gray-400"}]]])
|
[:span {:class "flex items-center justify-center w-5 h-5 mr-2 text-xs border border-gray-500 rounded-full shrink-0 dark:border-gray-400"}]]])
|
||||||
|
|||||||
@@ -38,6 +38,49 @@
|
|||||||
[:invoice-expense-account/location :string]
|
[:invoice-expense-account/location :string]
|
||||||
[:invoice-expense-account/amount money]]]]])
|
[:invoice-expense-account/amount money]]]]])
|
||||||
|
|
||||||
|
(defn clientize-vendor [{:vendor/keys [terms-overrides automatically-paid-when-due default-account account-overrides] :as vendor} client-id]
|
||||||
|
(let [terms-override (->> terms-overrides
|
||||||
|
(filter (fn [to]
|
||||||
|
(= (->db-id (:vendor-terms-override/client to))
|
||||||
|
client-id)))
|
||||||
|
(map :vendor-terms-override/terms)
|
||||||
|
first)
|
||||||
|
account (or (->> account-overrides
|
||||||
|
(filter (fn [to]
|
||||||
|
(= (->db-id (:vendor-account-override/client to))
|
||||||
|
client-id)))
|
||||||
|
(map :vendor-account-override/account)
|
||||||
|
first)
|
||||||
|
default-account)
|
||||||
|
account (d-accounts/clientize account client-id)
|
||||||
|
|
||||||
|
automatically-paid-when-due (->> automatically-paid-when-due
|
||||||
|
(filter (fn [to]
|
||||||
|
(= (->db-id to)
|
||||||
|
client-id)))
|
||||||
|
seq
|
||||||
|
boolean)
|
||||||
|
vendor (cond-> vendor
|
||||||
|
terms-override (assoc :vendor/terms terms-override)
|
||||||
|
true (assoc :vendor/automatically-paid-when-due automatically-paid-when-due
|
||||||
|
:vendor/default-account account)
|
||||||
|
true (dissoc :vendor/account-overrides :vendor/terms-overrides))]
|
||||||
|
vendor))
|
||||||
|
|
||||||
|
|
||||||
|
(defn get-vendor [vendor-id]
|
||||||
|
(dc/pull
|
||||||
|
(dc/db conn)
|
||||||
|
[:vendor/terms
|
||||||
|
:vendor/automatically-paid-when-due
|
||||||
|
{:vendor/default-account d-accounts/default-read
|
||||||
|
:vendor/account-overrides
|
||||||
|
[:vendor-account-override/client
|
||||||
|
{:vendor-account-override/account d-accounts/default-read}]}
|
||||||
|
{:vendor/terms-overrides
|
||||||
|
[:vendor-terms-override/client :vendor-terms-override/terms]}]
|
||||||
|
vendor-id))
|
||||||
|
|
||||||
(defrecord BasicDetailsStep [linear-wizard]
|
(defrecord BasicDetailsStep [linear-wizard]
|
||||||
mm/ModalWizardStep
|
mm/ModalWizardStep
|
||||||
(step-name [_]
|
(step-name [_]
|
||||||
@@ -95,7 +138,7 @@
|
|||||||
:content-fn (fn [c] (pull-attr (dc/db conn) :vendor/name c))
|
:content-fn (fn [c] (pull-attr (dc/db conn) :vendor/name c))
|
||||||
:x-model "vendorId"})]))
|
:x-model "vendorId"})]))
|
||||||
|
|
||||||
[:div.flex.space-x-8
|
[:div.flex.gap-x-8.md:flex-row.flex-col
|
||||||
(fc/with-field :invoice/date
|
(fc/with-field :invoice/date
|
||||||
(com/validated-field
|
(com/validated-field
|
||||||
{:label "Date"
|
{:label "Date"
|
||||||
@@ -126,7 +169,6 @@
|
|||||||
:name (fc/field-name)
|
:name (fc/field-name)
|
||||||
:x-model "due"
|
:x-model "due"
|
||||||
|
|
||||||
:x-effect "console.log('hello due', [due])"
|
|
||||||
:error? (fc/field-errors)
|
:error? (fc/field-errors)
|
||||||
:placeholder "1/1/2024"})]))
|
:placeholder "1/1/2024"})]))
|
||||||
(fc/with-field :invoice/scheduled-payment
|
(fc/with-field :invoice/scheduled-payment
|
||||||
@@ -138,7 +180,6 @@
|
|||||||
|
|
||||||
:hx-put (bidi.bidi/path-for ssr-routes/only-routes ::route/scheduled-payment-date)
|
:hx-put (bidi.bidi/path-for ssr-routes/only-routes ::route/scheduled-payment-date)
|
||||||
:x-dispatch:changed "[clientId, vendorId, due]"
|
:x-dispatch:changed "[clientId, vendorId, due]"
|
||||||
:x-effect "console.log('hello', [clientId, vendorId, due])"
|
|
||||||
:hx-trigger "changed"
|
:hx-trigger "changed"
|
||||||
:hx-target "this"
|
:hx-target "this"
|
||||||
:hx-swap "innerHTML"}
|
:hx-swap "innerHTML"}
|
||||||
@@ -254,7 +295,7 @@
|
|||||||
(defrecord AccountsStep [linear-wizard]
|
(defrecord AccountsStep [linear-wizard]
|
||||||
mm/ModalWizardStep
|
mm/ModalWizardStep
|
||||||
(step-name [_]
|
(step-name [_]
|
||||||
"Details")
|
"Expense Accounts")
|
||||||
(step-key [_]
|
(step-key [_]
|
||||||
:accounts)
|
:accounts)
|
||||||
|
|
||||||
@@ -293,13 +334,11 @@
|
|||||||
:validation-route ::route/new-wizard-navigate))
|
:validation-route ::route/new-wizard-navigate))
|
||||||
mm/Initializable
|
mm/Initializable
|
||||||
(init-step-params
|
(init-step-params
|
||||||
[_ request]
|
[_ current request]
|
||||||
(alog/peek ::INIT {:invoice/expense-accounts [{:db/id "123"
|
|
||||||
:invoice-expense-account/amount 100}]})
|
|
||||||
{:invoice/expense-accounts [{:db/id "123"
|
{:invoice/expense-accounts [{:db/id "123"
|
||||||
:invoice-expense-account/location "Shared"
|
:invoice-expense-account/location "Shared"
|
||||||
:invoice-expense-account/account (ffirst (dc/q '[:find ?a :where [?a :account/name]]
|
:invoice-expense-account/account (:db/id (:vendor/default-account (clientize-vendor (get-vendor (->db-id (:invoice/vendor (:snapshot current))))
|
||||||
(dc/db conn)))
|
(->db-id (:invoice/client (:snapshot current))))))
|
||||||
:invoice-expense-account/amount 100}]}))
|
:invoice-expense-account/amount 100}]}))
|
||||||
|
|
||||||
|
|
||||||
@@ -353,63 +392,7 @@
|
|||||||
(pull-attr (dc/db conn) :account/location))
|
(pull-attr (dc/db conn) :account/location))
|
||||||
:client-locations (some->> client-id
|
:client-locations (some->> client-id
|
||||||
(pull-attr (dc/db conn) :client/locations))})))
|
(pull-attr (dc/db conn) :client/locations))})))
|
||||||
(defn clientize-vendor [{:vendor/keys [terms-overrides automatically-paid-when-due default-account account-overrides] :as vendor} client-id]
|
|
||||||
(let [terms-override (->> terms-overrides
|
|
||||||
(filter (fn [to]
|
|
||||||
(= (->db-id (:vendor-terms-override/client to))
|
|
||||||
client-id)))
|
|
||||||
(map :vendor-terms-override/terms)
|
|
||||||
first)
|
|
||||||
account (or (->> account-overrides
|
|
||||||
(filter (fn [to]
|
|
||||||
(= (->db-id (:vendor-account-override/client to))
|
|
||||||
client-id)))
|
|
||||||
(map :vendor-account-override/account)
|
|
||||||
first)
|
|
||||||
default-account)
|
|
||||||
account (d-accounts/clientize account client-id)
|
|
||||||
|
|
||||||
automatically-paid-when-due (->> automatically-paid-when-due
|
|
||||||
(filter (fn [to]
|
|
||||||
(= (->db-id to)
|
|
||||||
client-id)))
|
|
||||||
seq
|
|
||||||
boolean)
|
|
||||||
vendor (cond-> vendor
|
|
||||||
terms-override (assoc :vendor/terms terms-override)
|
|
||||||
true (assoc :vendor/automatically-paid-when-due automatically-paid-when-due
|
|
||||||
:vendor/default-account account)
|
|
||||||
true (dissoc :vendor/account-overrides :vendor/terms-overrides))]
|
|
||||||
vendor))
|
|
||||||
|
|
||||||
|
|
||||||
(comment
|
|
||||||
(clojure.pprint/pprint
|
|
||||||
(clientize-vendor (dc/pull
|
|
||||||
(dc/db conn)
|
|
||||||
[:vendor/terms
|
|
||||||
:vendor/automatically-paid-when-due
|
|
||||||
{:vendor/default-account d-accounts/default-read
|
|
||||||
:vendor/account-overrides
|
|
||||||
[:vendor-account-override/client
|
|
||||||
{:vendor-account-override/account d-accounts/default-read}]}
|
|
||||||
{:vendor/terms-overrides
|
|
||||||
[:vendor-terms-override/client :vendor-terms-override/terms]}]
|
|
||||||
(ffirst (dc/q '[:find ?v :in $ :where [?v :vendor/name "Sysco"]] (dc/db conn))))
|
|
||||||
(pull-attr (dc/db conn) :db/id [:client/code "DEMO"]))))
|
|
||||||
|
|
||||||
(defn get-vendor [vendor-id]
|
|
||||||
(dc/pull
|
|
||||||
(dc/db conn)
|
|
||||||
[:vendor/terms
|
|
||||||
:vendor/automatically-paid-when-due
|
|
||||||
{:vendor/default-account d-accounts/default-read
|
|
||||||
:vendor/account-overrides
|
|
||||||
[:vendor-account-override/client
|
|
||||||
{:vendor-account-override/account d-accounts/default-read}]}
|
|
||||||
{:vendor/terms-overrides
|
|
||||||
[:vendor-terms-override/client :vendor-terms-override/terms]}]
|
|
||||||
vendor-id))
|
|
||||||
|
|
||||||
(defn due-date [{:keys [multi-form-state]}]
|
(defn due-date [{:keys [multi-form-state]}]
|
||||||
(alog/peek ::date multi-form-state)
|
(alog/peek ::date multi-form-state)
|
||||||
|
|||||||
Reference in New Issue
Block a user