vendor querying step 1.
This commit is contained in:
@@ -15,5 +15,4 @@
|
|||||||
"--output-filename" :final-output-filename]
|
"--output-filename" :final-output-filename]
|
||||||
:default ["npx" "webpack" "--mode=production" :output-to
|
:default ["npx" "webpack" "--mode=production" :output-to
|
||||||
"--output-path" :final-output-dir
|
"--output-path" :final-output-dir
|
||||||
"--output-filename" :final-output-filename]}
|
"--output-filename" :final-output-filename]}}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
(ns auto-ap.datomic.migrate.vendors
|
(ns auto-ap.datomic.migrate.vendors
|
||||||
(:require [datomic.api :as d]
|
(:require [datomic.api :as d]))
|
||||||
[auto-ap.datomic :refer [uri]]))
|
|
||||||
|
(defn add-vendor-search-terms [conn]
|
||||||
|
[(->> (d/q '[:find ?i ?n
|
||||||
|
:in $
|
||||||
|
:where [?i :vendor/name ?n]]
|
||||||
|
(d/db conn))
|
||||||
|
(map (fn [[i n]]
|
||||||
|
{:db/id i
|
||||||
|
:vendor/search-terms n})))])
|
||||||
|
|
||||||
(def norms-map {:add-1099-stuff {:txes [[{:db/ident :vendor/legal-entity-first-name
|
(def norms-map {:add-1099-stuff {:txes [[{:db/ident :vendor/legal-entity-first-name
|
||||||
:db/doc "The first name for the legal entity"
|
:db/doc "The first name for the legal entity"
|
||||||
@@ -56,7 +64,15 @@
|
|||||||
:db/valueType :db.type/long
|
:db/valueType :db.type/long
|
||||||
:db/cardinality :db.cardinality/one
|
:db/cardinality :db.cardinality/one
|
||||||
:db/noHistory true}]
|
:db/noHistory true}]
|
||||||
]}})
|
]}
|
||||||
|
::make-fulltext-search {:txes [[{:db/ident :vendor/search-terms
|
||||||
|
:db/valueType :db.type/string
|
||||||
|
:db/cardinality :db.cardinality/many
|
||||||
|
:db/doc "a name search for vendors"
|
||||||
|
:db/fulltext true}]]
|
||||||
|
:requires [:auto-ap/base-schema]}
|
||||||
|
::add-vendor-search-terms {:txes-fn `add-vendor-search-terms
|
||||||
|
:requires [::make-fulltext-search]}})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -85,6 +85,18 @@
|
|||||||
(map #(trim-usage % (limited-clients (:id args))))
|
(map #(trim-usage % (limited-clients (:id args))))
|
||||||
#_(map #(assoc % :usage (get usages (:db/id %))))))
|
#_(map #(assoc % :usage (get usages (:db/id %))))))
|
||||||
|
|
||||||
|
(defn get-graphql-by-id [args id]
|
||||||
|
(->> (cond-> {:query {:find [(list 'pull '?e default-read)]
|
||||||
|
:in ['$ '?e]
|
||||||
|
:where ['[?e :vendor/name]]}
|
||||||
|
:args [(d/db (d/connect uri)) id]})
|
||||||
|
(d/query)
|
||||||
|
(map first)
|
||||||
|
(map #(cleanse (:id args) %))
|
||||||
|
(map <-datomic)
|
||||||
|
(map #(trim-usage % (limited-clients (:id args))))
|
||||||
|
first))
|
||||||
|
|
||||||
(defn get-by-id [id]
|
(defn get-by-id [id]
|
||||||
|
|
||||||
(->> (d/q '[:find (pull ?e [*
|
(->> (d/q '[:find (pull ?e [*
|
||||||
|
|||||||
@@ -98,6 +98,10 @@
|
|||||||
:message
|
:message
|
||||||
{:fields {:message {:type 'String}}}
|
{:fields {:message {:type 'String}}}
|
||||||
|
|
||||||
|
:search_result
|
||||||
|
{:fields {:name {:type 'String}
|
||||||
|
:id {:type :id}}}
|
||||||
|
|
||||||
:yodlee_provider_account
|
:yodlee_provider_account
|
||||||
{:fields {:id {:type 'Int}
|
{:fields {:id {:type 'Int}
|
||||||
:client {:type :client}
|
:client {:type :client}
|
||||||
@@ -347,6 +351,10 @@
|
|||||||
:args {:account_set {:type 'String}}
|
:args {:account_set {:type 'String}}
|
||||||
:resolve :get-accounts}
|
:resolve :get-accounts}
|
||||||
|
|
||||||
|
:search_vendor {:type '(list :search_result)
|
||||||
|
:args {:query {:type 'String}}
|
||||||
|
:resolve :search-vendor}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
:all_sales_orders {:type '(list :sales_order)
|
:all_sales_orders {:type '(list :sales_order)
|
||||||
@@ -393,7 +401,10 @@
|
|||||||
:vendor {:type '(list :vendor)
|
:vendor {:type '(list :vendor)
|
||||||
:resolve :get-vendor}
|
:resolve :get-vendor}
|
||||||
:user {:type '(list :user)
|
:user {:type '(list :user)
|
||||||
:resolve :get-user}}
|
:resolve :get-user}
|
||||||
|
:vendor_by_id {:type :vendor
|
||||||
|
:args {:id {:type :id}}
|
||||||
|
:resolve :vendor-by-id}}
|
||||||
|
|
||||||
:input-objects
|
:input-objects
|
||||||
{
|
{
|
||||||
@@ -777,6 +788,7 @@
|
|||||||
:get-cash-flow get-cash-flow
|
:get-cash-flow get-cash-flow
|
||||||
:get-yodlee-merchants ym/get-yodlee-merchants
|
:get-yodlee-merchants ym/get-yodlee-merchants
|
||||||
:get-intuit-bank-accounts gq-intuit-bank-accounts/get-intuit-bank-accounts
|
:get-intuit-bank-accounts gq-intuit-bank-accounts/get-intuit-bank-accounts
|
||||||
|
:vendor-by-id gq-vendors/get-by-id
|
||||||
:get-user get-user
|
:get-user get-user
|
||||||
:mutation/delete-transaction-rule gq-transaction-rules/delete-transaction-rule
|
:mutation/delete-transaction-rule gq-transaction-rules/delete-transaction-rule
|
||||||
:mutation/edit-user gq-users/edit-user
|
:mutation/edit-user gq-users/edit-user
|
||||||
@@ -787,7 +799,8 @@
|
|||||||
:mutation/upsert-account gq-accounts/upsert-account
|
:mutation/upsert-account gq-accounts/upsert-account
|
||||||
:mutation/merge-vendors gq-vendors/merge-vendors
|
:mutation/merge-vendors gq-vendors/merge-vendors
|
||||||
:mutation/request-import gq-requests/request-import
|
:mutation/request-import gq-requests/request-import
|
||||||
:get-vendor gq-vendors/get-graphql})
|
:get-vendor gq-vendors/get-graphql
|
||||||
|
:search-vendor gq-vendors/search})
|
||||||
gq-checks/attach
|
gq-checks/attach
|
||||||
gq-ledger/attach
|
gq-ledger/attach
|
||||||
gq-reports/attach
|
gq-reports/attach
|
||||||
|
|||||||
@@ -117,3 +117,21 @@
|
|||||||
(defn get-graphql [context args value]
|
(defn get-graphql [context args value]
|
||||||
(->graphql
|
(->graphql
|
||||||
(d-vendors/get-graphql (assoc args :id (:id context)))))
|
(d-vendors/get-graphql (assoc args :id (:id context)))))
|
||||||
|
|
||||||
|
(defn get-by-id [context args value]
|
||||||
|
(->graphql
|
||||||
|
(d-vendors/get-graphql-by-id (assoc args :id (:id context))
|
||||||
|
(:id args))))
|
||||||
|
|
||||||
|
(defn search [context args value]
|
||||||
|
(->> (d/q '[:find ?n ?i ?s
|
||||||
|
:in $ ?q
|
||||||
|
:where [(fulltext $ :vendor/search-terms ?q) [[?i ?n _ ?s]]]
|
||||||
|
(not [?i :vendor/hidden true])]
|
||||||
|
(d/db conn)
|
||||||
|
(:query args))
|
||||||
|
(sort-by last)
|
||||||
|
(map (fn [[n i]]
|
||||||
|
{:name n
|
||||||
|
:id i}
|
||||||
|
))))
|
||||||
|
|||||||
@@ -10,6 +10,13 @@
|
|||||||
(fn [db [_ x]]
|
(fn [db [_ x]]
|
||||||
(get (-> db ::forms) x)))
|
(get (-> db ::forms) x)))
|
||||||
|
|
||||||
|
(re-frame/reg-sub
|
||||||
|
::field
|
||||||
|
(fn [db [_ x f]]
|
||||||
|
(-> (get (-> db ::forms) x)
|
||||||
|
:data
|
||||||
|
(get-in f))))
|
||||||
|
|
||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::is-loading?
|
::is-loading?
|
||||||
|
|||||||
@@ -14,8 +14,7 @@
|
|||||||
(not (get-in accounts [0 :account :id]))))
|
(not (get-in accounts [0 :account :id]))))
|
||||||
|
|
||||||
(defn default-account [accounts default-account amount locations]
|
(defn default-account [accounts default-account amount locations]
|
||||||
[{:id (get-in accounts [0 :id]
|
[{:id (str "new-" (random-uuid))
|
||||||
(str "new-" (random-uuid)))
|
|
||||||
:amount (Math/abs amount)
|
:amount (Math/abs amount)
|
||||||
:amount-percentage 100
|
:amount-percentage 100
|
||||||
:amount-mode "%"
|
:amount-mode "%"
|
||||||
|
|||||||
134
src/cljs/auto_ap/views/components/typeahead/vendor.cljs
Normal file
134
src/cljs/auto_ap/views/components/typeahead/vendor.cljs
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
(ns auto-ap.views.components.typeahead.vendor
|
||||||
|
(:require
|
||||||
|
[downshift :as ds :refer [useCombobox]]
|
||||||
|
[re-frame.core :as re-frame]
|
||||||
|
[auto-ap.views.utils :refer [with-user]]
|
||||||
|
[react]))
|
||||||
|
|
||||||
|
(set! *warn-on-infer* true)
|
||||||
|
|
||||||
|
;; TODO: This avoids the use of inferred externs by using aget. You could just use the ^js tag though
|
||||||
|
(defn state-reducer [^js/FakeStateObject state ^js/FakeActionsAndChanges actions-and-changes]
|
||||||
|
(let [useCombobox ^js/Downshift useCombobox]
|
||||||
|
(cond
|
||||||
|
(= (.-type actions-and-changes) (.-InputChange (.-stateChangeTypes ^js/Downshift useCombobox)))
|
||||||
|
(set! (.-selectedItem (.-changes actions-and-changes)) nil)
|
||||||
|
|
||||||
|
(and (= (.-type actions-and-changes) (.-InputBlur (.-stateChangeTypes ^js/Downshift useCombobox)))
|
||||||
|
(not (.-selectedItem state)))
|
||||||
|
(set! (.-inputValue (.-changes actions-and-changes ))
|
||||||
|
nil)
|
||||||
|
|
||||||
|
:else
|
||||||
|
nil))
|
||||||
|
(.-changes actions-and-changes))
|
||||||
|
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::search-completed
|
||||||
|
(fn [_ [_ set-items set-loading-status result]]
|
||||||
|
(set-loading-status nil)
|
||||||
|
(set-items (:search-results result))
|
||||||
|
{}))
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::search-failed
|
||||||
|
(fn [_ _]
|
||||||
|
{}))
|
||||||
|
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::input-value-settled
|
||||||
|
[with-user]
|
||||||
|
(fn [{:keys [user]} [_ input-value search-query set-items set-loading-status]]
|
||||||
|
(when (> (count input-value) 2)
|
||||||
|
(set-loading-status :loading)
|
||||||
|
|
||||||
|
|
||||||
|
{:graphql {:token user
|
||||||
|
:query-obj {:venia/queries [{:query/data (search-query input-value )
|
||||||
|
:query/alias :search-results}]}
|
||||||
|
:on-success [::search-completed set-items set-loading-status]
|
||||||
|
:on-error [::search-failed set-loading-status]}})))
|
||||||
|
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::input-value-changed
|
||||||
|
(fn [_ [_ input-value search-query set-items set-loading-status]]
|
||||||
|
(set-items [])
|
||||||
|
(when (> (count input-value) 2)
|
||||||
|
(set-loading-status :loading)
|
||||||
|
{:dispatch-debounce {:event [::input-value-settled input-value search-query set-items set-loading-status]
|
||||||
|
:time 250
|
||||||
|
:key ::input-value-settled}})))
|
||||||
|
|
||||||
|
(defn typeahead-v3-internal [{:keys [class style ^js entity->text on-change disabled value name search-query auto-focus] :or {disabled false} :as i}]
|
||||||
|
(let [[items set-items] (react/useState [])
|
||||||
|
[loading-status set-loading-status] (react/useState false)
|
||||||
|
[getLabelProps getMenuProps getComboboxProps getToggleButtonProps getInputProps getItemProps isOpen highlightedIndex selectItem selectedItem setInputValue]
|
||||||
|
(as-> (useCombobox (clj->js {:items items
|
||||||
|
:defaultHighlightedIndex 0
|
||||||
|
:defaultSelectedItem value
|
||||||
|
:onInputValueChange (fn [input]
|
||||||
|
(re-frame/dispatch [::input-value-changed (aget input "inputValue") search-query set-items set-loading-status])
|
||||||
|
true)
|
||||||
|
:stateReducer state-reducer
|
||||||
|
:onSelectedItemChange (fn [z]
|
||||||
|
(when on-change
|
||||||
|
(on-change (js->clj (aget z "selectedItem") :keywordize-keys true))))})) $
|
||||||
|
(map #(aget $ %) ["getLabelProps" "getMenuProps" "getComboboxProps" "getToggleButtonProps" "getInputProps" "getItemProps" "isOpen" "highlightedIndex" "selectItem" "selectedItem" "setInputValue"]))]
|
||||||
|
#_(println (getInputProps))
|
||||||
|
|
||||||
|
[:<>
|
||||||
|
[:div.typeahead (assoc (js->clj (getComboboxProps))
|
||||||
|
:style style)
|
||||||
|
(cond
|
||||||
|
selectedItem
|
||||||
|
^{:key "typeahead"}
|
||||||
|
[:div.input (assoc (js->clj (getInputProps #js {:disabled (if disabled
|
||||||
|
"disabled"
|
||||||
|
"")}))
|
||||||
|
:on-key-up (fn [e]
|
||||||
|
(when (= 8 (aget e "keyCode" ))
|
||||||
|
(selectItem nil)
|
||||||
|
(setInputValue nil)
|
||||||
|
(when on-change
|
||||||
|
(on-change nil))))
|
||||||
|
:class (if (= :loading loading-status)
|
||||||
|
"is-loading"
|
||||||
|
class)
|
||||||
|
:tab-index "0")
|
||||||
|
[:div.control
|
||||||
|
[:div.tags.has-addons
|
||||||
|
[:span.tag (entity->text (js->clj selectedItem :keywordize-keys true))]
|
||||||
|
(when name
|
||||||
|
[:input {:type "hidden" :name name :value (:id (js->clj selectedItem :keywordize-keys true))}])
|
||||||
|
(when-not disabled
|
||||||
|
[:a.tag.is-delete {:on-click (fn []
|
||||||
|
(setInputValue nil)
|
||||||
|
(selectItem nil)
|
||||||
|
(when on-change
|
||||||
|
(on-change nil)))}])]]]
|
||||||
|
|
||||||
|
:else
|
||||||
|
^{:key "typeahead"} [:div.control {:class (when (= :loading loading-status)
|
||||||
|
"is-loading")}
|
||||||
|
[:input.input (js->clj
|
||||||
|
(getInputProps #js {:disabled (if disabled
|
||||||
|
"disabled"
|
||||||
|
"")
|
||||||
|
:autoFocus (if auto-focus
|
||||||
|
"autoFocus"
|
||||||
|
"")}))]])
|
||||||
|
[:div {:class (when (and isOpen (seq items))
|
||||||
|
"typeahead-menu")}
|
||||||
|
[:ul (js->clj (getMenuProps))
|
||||||
|
(if (and isOpen (seq items))
|
||||||
|
(for [[index item] (map vector (range) (js->clj items :keywordize-keys true))]
|
||||||
|
^{:key item}
|
||||||
|
[:li.typeahead-suggestion (assoc (js->clj (getItemProps #js {:item item :index index}))
|
||||||
|
:class (if (= index highlightedIndex)
|
||||||
|
"typeahead-highlighted"))
|
||||||
|
(entity->text item)]))]]]]))
|
||||||
|
|
||||||
|
(defn search-backed-typeahead [props]
|
||||||
|
[:div
|
||||||
|
[:f> typeahead-v3-internal (assoc props
|
||||||
|
:entity->text :name
|
||||||
|
)]])
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
[auto-ap.views.components.money-field :refer [money-field]]
|
[auto-ap.views.components.money-field :refer [money-field]]
|
||||||
[auto-ap.views.components.switch-field :refer [switch-field]]
|
[auto-ap.views.components.switch-field :refer [switch-field]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
|
[auto-ap.views.components.typeahead.vendor :refer [search-backed-typeahead]]
|
||||||
[auto-ap.views.pages.invoices.common :refer [invoice-read]]
|
[auto-ap.views.pages.invoices.common :refer [invoice-read]]
|
||||||
[auto-ap.views.utils
|
[auto-ap.views.utils
|
||||||
:refer
|
:refer
|
||||||
@@ -26,13 +27,14 @@
|
|||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[reagent.core :as r]
|
[reagent.core :as r]
|
||||||
[vimsical.re-frame.fx.track :as track]))
|
[vimsical.re-frame.fx.track :as track]
|
||||||
|
[vimsical.re-frame.cofx.inject :as inject]))
|
||||||
|
|
||||||
;; SUBS
|
;; SUBS
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::can-submit
|
::can-submit
|
||||||
:<- [::forms/form ::form]
|
:<- [::forms/form ::form]
|
||||||
(fn [{:keys [data status]} _]
|
(fn [{:keys [data]} _]
|
||||||
(let [min-total (if (= (:total (:original data)) (:outstanding-balance (:original data)))
|
(let [min-total (if (= (:total (:original data)) (:outstanding-balance (:original data)))
|
||||||
nil
|
nil
|
||||||
(- (:total (:original data)) (:outstanding-balance (:original data))))
|
(- (:total (:original data)) (:outstanding-balance (:original data))))
|
||||||
@@ -45,7 +47,7 @@
|
|||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::create-query
|
::create-query
|
||||||
:<- [::forms/form ::form]
|
:<- [::forms/form ::form]
|
||||||
(fn [{:keys [data] {:keys [id invoice-number date due scheduled-payment location total expense-accounts vendor client]} :data}]
|
(fn [{{:keys [invoice-number date due scheduled-payment location total expense-accounts vendor client]} :data}]
|
||||||
{:venia/operation {:operation/type :mutation
|
{:venia/operation {:operation/type :mutation
|
||||||
:operation/name "AddInvoice"}
|
:operation/name "AddInvoice"}
|
||||||
:venia/queries [{:query/data [:add-invoice
|
:venia/queries [{:query/data [:add-invoice
|
||||||
@@ -69,7 +71,7 @@
|
|||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::edit-query
|
::edit-query
|
||||||
:<- [::forms/form ::form]
|
:<- [::forms/form ::form]
|
||||||
(fn [{:keys [data] {:keys [id invoice-number date due scheduled-payment location total expense-accounts vendor client]} :data}]
|
(fn [{{:keys [id invoice-number date due scheduled-payment total expense-accounts]} :data}]
|
||||||
{:venia/operation {:operation/type :mutation
|
{:venia/operation {:operation/type :mutation
|
||||||
:operation/name "EditInvoice"}
|
:operation/name "EditInvoice"}
|
||||||
:venia/queries [{:query/data [:edit-invoice
|
:venia/queries [{:query/data [:edit-invoice
|
||||||
@@ -90,8 +92,8 @@
|
|||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::add-and-print-query
|
::add-and-print-query
|
||||||
(fn [db [_ bank-account-id type]]
|
(fn [_ [_ bank-account-id type]]
|
||||||
(let [{:keys [data] {:keys [id invoice-number date location total expense-accounts scheduled-payment vendor client]} :data} @(re-frame/subscribe [::forms/form ::form])]
|
(let [{{:keys [invoice-number date location total expense-accounts scheduled-payment vendor client]} :data} @(re-frame/subscribe [::forms/form ::form])]
|
||||||
{:venia/operation {:operation/type :mutation
|
{:venia/operation {:operation/type :mutation
|
||||||
:operation/name "AddAndPrintInvoice"}
|
:operation/name "AddAndPrintInvoice"}
|
||||||
:venia/queries [{:query/data [:add-and-print-invoice
|
:venia/queries [{:query/data [:add-and-print-invoice
|
||||||
@@ -119,7 +121,7 @@
|
|||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-db
|
||||||
::updated
|
::updated
|
||||||
(fn [db [_ invoice command]]
|
(fn [db [_ _ command]]
|
||||||
(if (= :create command)
|
(if (= :create command)
|
||||||
(-> db
|
(-> db
|
||||||
(forms/stop-form ::form )
|
(forms/stop-form ::form )
|
||||||
@@ -178,34 +180,7 @@
|
|||||||
(forms/change-handler ::form
|
(forms/change-handler ::form
|
||||||
(fn [data field value]
|
(fn [data field value]
|
||||||
(let [locations @(re-frame/subscribe [::subs/locations-for-client (:id (:client data))])]
|
(let [locations @(re-frame/subscribe [::subs/locations-for-client (:id (:client data))])]
|
||||||
|
(cond (= [:total] field)
|
||||||
(cond (and (= [:vendor] field)
|
|
||||||
value)
|
|
||||||
(let [schedule-payment-dom (get (by (comp :id :client ) :dom (:schedule-payment-dom value))
|
|
||||||
(:id (:client data)))]
|
|
||||||
(cond-> []
|
|
||||||
|
|
||||||
(expense-accounts-field/can-replace-with-default? (:expense-accounts data))
|
|
||||||
(into [[:expense-accounts] (expense-accounts-field/default-account (:expense-accounts data)
|
|
||||||
@(re-frame/subscribe [::subs/vendor-default-account (:id value) (:client data)])
|
|
||||||
(:total data)
|
|
||||||
locations)])
|
|
||||||
|
|
||||||
|
|
||||||
(boolean ((set (map :id (:automatically-paid-when-due value))) (:id (:client data))))
|
|
||||||
(into [[:scheduled-payment] (:due data)
|
|
||||||
[:schedule-when-due] true
|
|
||||||
[:vendor-autopay? ] true])
|
|
||||||
|
|
||||||
|
|
||||||
schedule-payment-dom
|
|
||||||
(into [[:scheduled-payment] (date->str (next-dom (str->date (:date data) standard) schedule-payment-dom) standard)
|
|
||||||
[:vendor-autopay?] true])
|
|
||||||
|
|
||||||
true
|
|
||||||
(into [[:schedule-payment-dom] schedule-payment-dom])))
|
|
||||||
|
|
||||||
(= [:total] field)
|
|
||||||
[[:expense-accounts] (recalculate-amounts (:expense-accounts data) value)]
|
[[:expense-accounts] (recalculate-amounts (:expense-accounts data) value)]
|
||||||
|
|
||||||
(and (= [:date] field)
|
(and (= [:date] field)
|
||||||
@@ -231,7 +206,7 @@
|
|||||||
(re-frame/reg-event-fx
|
(re-frame/reg-event-fx
|
||||||
::add-and-print
|
::add-and-print
|
||||||
[with-user (forms/in-form ::form)]
|
[with-user (forms/in-form ::form)]
|
||||||
(fn [{:keys [user] {:keys [data]} :db} [_ bank-account-id type]]
|
(fn [{:keys [user]} [_ bank-account-id type]]
|
||||||
{:graphql
|
{:graphql
|
||||||
{:token user
|
{:token user
|
||||||
:owns-state {:single ::form}
|
:owns-state {:single ::form}
|
||||||
@@ -263,7 +238,7 @@
|
|||||||
(re-frame/reg-event-fx
|
(re-frame/reg-event-fx
|
||||||
::save-requested
|
::save-requested
|
||||||
[with-user (forms/in-form ::form)]
|
[with-user (forms/in-form ::form)]
|
||||||
(fn [{:keys [user db]} [_ fwd-event]]
|
(fn [{:keys [db]} [_ fwd-event]]
|
||||||
(if (and (:scheduled-payment (:data db))
|
(if (and (:scheduled-payment (:data db))
|
||||||
(not (:vendor-autopay? (:data db))))
|
(not (:vendor-autopay? (:data db))))
|
||||||
{:dispatch
|
{:dispatch
|
||||||
@@ -282,16 +257,80 @@
|
|||||||
|
|
||||||
(re-frame/reg-event-fx
|
(re-frame/reg-event-fx
|
||||||
::added-and-printed
|
::added-and-printed
|
||||||
(fn [{:keys [db]} [_ result]]
|
(fn [_ [_ result]]
|
||||||
(let [invoice (first (:invoices (:add-and-print-invoice result)))]
|
(let [invoice (first (:invoices (:add-and-print-invoice result)))]
|
||||||
{:dispatch-n [[::updated (assoc invoice :class "live-added") :create]
|
{:dispatch-n [[::updated (assoc invoice :class "live-added") :create]
|
||||||
[::checks-printed [invoice] (:pdf-url (:add-and-print-invoice result))]]})))
|
[::checks-printed [invoice] (:pdf-url (:add-and-print-invoice result))]]})))
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-db
|
||||||
::checks-printed
|
::checks-printed
|
||||||
(fn [db [_ invoices pdf-url]]
|
(fn [db _]
|
||||||
db))
|
db))
|
||||||
|
|
||||||
|
(re-frame/reg-sub
|
||||||
|
::client-accounts
|
||||||
|
:<- [::forms/field ::form [:client]]
|
||||||
|
:<- [::subs/all-accounts]
|
||||||
|
(fn [[client all-accounts]]
|
||||||
|
(subs/accounts-by-id all-accounts client)))
|
||||||
|
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::changed-vendor
|
||||||
|
[with-user (forms/in-form ::form) (re-frame/inject-cofx ::inject/sub [::client-accounts])]
|
||||||
|
(fn [{::keys [client-accounts] :keys [user] {{:keys [client date due expense-accounts total]} :data} :db} [_ vendor]]
|
||||||
|
(when (:id vendor)
|
||||||
|
{:graphql {:token user
|
||||||
|
:query-obj {:venia/queries [[:vendor-by-id
|
||||||
|
{:id (:id vendor)}
|
||||||
|
[[:automatically-paid-when-due [:id]]
|
||||||
|
[:schedule-payment-dom [[:client [:id]] :dom]]
|
||||||
|
[:default-account [:id]]]]]}
|
||||||
|
:on-success (fn [r]
|
||||||
|
(let [schedule-payment-dom (->> r
|
||||||
|
:vendor-by-id
|
||||||
|
:schedule-payment-dom
|
||||||
|
(filter (fn [spd]
|
||||||
|
(= (-> spd :client :id)
|
||||||
|
(:id client))))
|
||||||
|
first
|
||||||
|
:dom)
|
||||||
|
|
||||||
|
default-account (let [client-override (->> r
|
||||||
|
:vendor-by-id
|
||||||
|
:account-overrides
|
||||||
|
(filter #(= (:id (:client %)) (:id client)))
|
||||||
|
first
|
||||||
|
:account
|
||||||
|
:id)
|
||||||
|
default-id (->> r :vendor-by-id :default-account :id)
|
||||||
|
i (or client-override default-id)]
|
||||||
|
(client-accounts i))
|
||||||
|
changes (cond-> []
|
||||||
|
(expense-accounts-field/can-replace-with-default? expense-accounts)
|
||||||
|
(into [[:expense-accounts] (expense-accounts-field/default-account expense-accounts
|
||||||
|
default-account
|
||||||
|
total
|
||||||
|
(:locations client)
|
||||||
|
)])
|
||||||
|
|
||||||
|
(boolean ((->> r :vendor-by-id :automatically-paid-when-due (map :id) set) (:id client)))
|
||||||
|
(into [[:scheduled-payment] due
|
||||||
|
[:schedule-when-due] true
|
||||||
|
[:vendor-autopay? ] true])
|
||||||
|
|
||||||
|
schedule-payment-dom
|
||||||
|
(into [[:scheduled-payment] (date->str (next-dom (str->date date standard) schedule-payment-dom) standard)
|
||||||
|
[:vendor-autopay?] true])
|
||||||
|
|
||||||
|
true
|
||||||
|
(into [[:schedule-payment-dom] schedule-payment-dom]))]
|
||||||
|
(if (seq changes)
|
||||||
|
(into [::changed ] changes)
|
||||||
|
[:ignore]))
|
||||||
|
)
|
||||||
|
:on-failure [:bad]
|
||||||
|
}})))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; VIEWS
|
;; VIEWS
|
||||||
@@ -308,16 +347,21 @@
|
|||||||
:subscription [::subs/client]
|
:subscription [::subs/client]
|
||||||
:event-fn (fn [c]
|
:event-fn (fn [c]
|
||||||
|
|
||||||
[::maybe-change-client c])}]}))
|
[::maybe-change-client c])}
|
||||||
|
{:id ::vendor-change
|
||||||
|
:subscription [::forms/field ::form [:vendor]]
|
||||||
|
:event-fn (fn [v]
|
||||||
|
[::changed-vendor v])}]}))
|
||||||
|
|
||||||
(re-frame/reg-event-fx
|
(re-frame/reg-event-fx
|
||||||
::unmounted
|
::unmounted
|
||||||
(fn []
|
(fn []
|
||||||
{::track/dispose [{:id ::client}]}))
|
{::track/dispose [{:id ::client}
|
||||||
|
{:id ::vendor-change}]}))
|
||||||
|
|
||||||
(defn form-content [{:keys [can-change-amount?] :as params}]
|
(defn form-content [params]
|
||||||
[layouts/side-bar {:on-close (dispatch-event [::forms/form-closing ::form ])}
|
[layouts/side-bar {:on-close (dispatch-event [::forms/form-closing ::form ])}
|
||||||
(let [{:keys [data active? error id]} @(re-frame/subscribe [::forms/form ::form])
|
(let [{:keys [data id]} @(re-frame/subscribe [::forms/form ::form])
|
||||||
{:keys [form-inline field raw-field error-notification submit-button ]} invoice-form
|
{:keys [form-inline field raw-field error-notification submit-button ]} invoice-form
|
||||||
can-submit? (boolean @(re-frame/subscribe [::can-submit]))
|
can-submit? (boolean @(re-frame/subscribe [::can-submit]))
|
||||||
status @(re-frame/subscribe [::status/single ::form])
|
status @(re-frame/subscribe [::status/single ::form])
|
||||||
@@ -339,7 +383,7 @@
|
|||||||
(not (seq (:payments data))))
|
(not (seq (:payments data))))
|
||||||
[:div.tag.is-info.is-light "Automatically paid"]
|
[:div.tag.is-info.is-light "Automatically paid"]
|
||||||
|
|
||||||
(and (#{:paid ":paid"} (:status data)))
|
(#{:paid ":paid"} (:status data))
|
||||||
(if-let [check-number (:check-number (:payment (first (:payments data))))]
|
(if-let [check-number (:check-number (:payment (first (:payments data))))]
|
||||||
[:div.tag.is-info.is-light "Paid by check #" check-number ]
|
[:div.tag.is-info.is-light "Paid by check #" check-number ]
|
||||||
[:div.tag.is-info.is-light "Paid"])
|
[:div.tag.is-info.is-light "Paid"])
|
||||||
@@ -359,13 +403,14 @@
|
|||||||
:spec ::invoice/client}]))
|
:spec ::invoice/client}]))
|
||||||
(field [:span "Vendor"
|
(field [:span "Vendor"
|
||||||
[:span.has-text-danger " *"]]
|
[:span.has-text-danger " *"]]
|
||||||
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
[search-backed-typeahead {:disabled exists?
|
||||||
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
:search-query (fn [i]
|
||||||
:entity->text :name
|
[:search_vendor
|
||||||
:type "typeahead-v3"
|
{:query i}
|
||||||
:disabled exists?
|
[:name :id]])
|
||||||
:auto-focus (if @(re-frame/subscribe [::subs/client]) true false)
|
:type "typeahead-v3"
|
||||||
:field [:vendor]}])
|
:auto-focus (if @(re-frame/subscribe [::subs/client]) true false)
|
||||||
|
:field [:vendor]}])
|
||||||
|
|
||||||
(field [:span "Date"
|
(field [:span "Date"
|
||||||
[:span.has-text-danger " *"]]
|
[:span.has-text-danger " *"]]
|
||||||
@@ -374,6 +419,7 @@
|
|||||||
:format-week-number (fn [] "")
|
:format-week-number (fn [] "")
|
||||||
:previous-month-button-label ""
|
:previous-month-button-label ""
|
||||||
:placeholder "mm/dd/yyyy"
|
:placeholder "mm/dd/yyyy"
|
||||||
|
:disable-keyboard-navigation true
|
||||||
:next-month-button-label ""
|
:next-month-button-label ""
|
||||||
:next-month-label ""
|
:next-month-label ""
|
||||||
:type "date"
|
:type "date"
|
||||||
@@ -386,6 +432,7 @@
|
|||||||
:format-week-number (fn [] "")
|
:format-week-number (fn [] "")
|
||||||
:previous-month-button-label ""
|
:previous-month-button-label ""
|
||||||
:placeholder "mm/dd/yyyy"
|
:placeholder "mm/dd/yyyy"
|
||||||
|
:disable-keyboard-navigation true
|
||||||
:next-month-button-label ""
|
:next-month-button-label ""
|
||||||
:next-month-label ""
|
:next-month-label ""
|
||||||
:type "date"
|
:type "date"
|
||||||
@@ -440,11 +487,7 @@
|
|||||||
:max (:total data)
|
:max (:total data)
|
||||||
:client (or (:client data) @(re-frame/subscribe [::subs/client]))
|
:client (or (:client data) @(re-frame/subscribe [::subs/client]))
|
||||||
:field [:expense-accounts]}])
|
:field [:expense-accounts]}])
|
||||||
{:key (str (:id (:vendor data)))})
|
{:key (str (:id (:vendor data) "none") "-" (:id (:client data) "none") )})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(error-notification)
|
(error-notification)
|
||||||
|
|
||||||
@@ -464,7 +507,7 @@
|
|||||||
:id ::add-and-print-invoice}
|
:id ::add-and-print-invoice}
|
||||||
[:div
|
[:div
|
||||||
(list
|
(list
|
||||||
(for [{:keys [id number name type]} (->> (:bank-accounts (:client data)) (filter :visible) (sort-by :sort-order))]
|
(for [{:keys [id name type]} (->> (:bank-accounts (:client data)) (filter :visible) (sort-by :sort-order))]
|
||||||
(if (= :cash type)
|
(if (= :cash type)
|
||||||
^{:key id} [:a.dropdown-item {:on-click (dispatch-event [::save-requested [::add-and-print id :cash]])} "With cash"]
|
^{:key id} [:a.dropdown-item {:on-click (dispatch-event [::save-requested [::add-and-print id :cash]])} "With cash"]
|
||||||
(list
|
(list
|
||||||
@@ -476,7 +519,7 @@
|
|||||||
{:key id}))])
|
{:key id}))])
|
||||||
|
|
||||||
|
|
||||||
(defn form [p]
|
(defn form [_]
|
||||||
(r/create-class
|
(r/create-class
|
||||||
{:display-name "invoice-form"
|
{:display-name "invoice-form"
|
||||||
:component-did-mount #(re-frame/dispatch [::mounted])
|
:component-did-mount #(re-frame/dispatch [::mounted])
|
||||||
|
|||||||
Reference in New Issue
Block a user