Makes a vendor account acceptable even if the invoice account isn't.

This commit is contained in:
2023-02-04 19:57:42 -08:00
parent afa6b79fcc
commit f7d5454d2c
8 changed files with 229 additions and 46 deletions

View File

@@ -189,8 +189,7 @@
(defn migrate [conn]
(let [
norms-map (merge {:auto-ap/base-schema {:txes auto-ap.datomic/base-schema}
(let [norms-map (merge {:auto-ap/base-schema {:txes auto-ap.datomic/base-schema}
:auto-ap/functions {:txes-fn 'auto-ap.datomic.migrate/functions
:requires [:auto-ap/base-schema]}
:auto-ap/fx-pay-function-10 {:txes-fn 'auto-ap.datomic.migrate/fix-pay-function
@@ -339,7 +338,8 @@
{:db/ident :account-client-override/name
:db/doc "client override"
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}]]}
:db/cardinality :db.cardinality/one}]]
:requires [:auto-ap/base-schema]}
:auto-ap/add-cleared-against {:txes [[{:db/ident :transaction/cleared-against
:db/doc "which entitiy it was cleared against"
:db/valueType :db.type/string
@@ -549,9 +549,10 @@
:db/cardinality :db.cardinality/one
:db/doc "a name search for accounts"
:db/fulltext true}]]
:requires [:auto-ap/add-account-overrides]}
:requires [:auto-ap/add-account-overrides :auto-ap/base-schema]}
:auto-ap/add-search-terms-accounts {:txes-fn `add-account-search-terms
:requires [:auto-ap/fulltext-accounts]}
:first-time-only true
:requires [:auto-ap/fulltext-accounts :auto-ap/base-schema :auto-ap/add-accounts]}
:auto-ap/add-account-options {:txes [[{:db/ident :account/invoice-allowance
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
@@ -564,10 +565,11 @@
:db/doc "Warn on usage"}
{:db/ident :allowance/admin-only
:db/doc "Only admins can use it"}]]
:requires [:auto-ap/add-search-terms-accounts]}
:requires [:auto-ap/add-search-terms-accounts :auto-ap/add-accounts]}
:auto-ap/backfill-account-options {:txes-fn `backfill-account-options
:first-time-only true
:requires [:auto-ap/add-account-options]}
:requires [:auto-ap/add-account-options :auto-ap/add-accounts]}
:auto-ap/add-vendor-account-options2 {:txes [[{:db/ident :account/vendor-allowance
:db/valueType :db.type/ref
@@ -578,10 +580,10 @@
:db/cardinality :db.cardinality/one
:db/doc "Whether this account can be used generally"}
]]
:requires [:auto-ap/backfill-account-options]}
:requires [:auto-ap/backfill-account-options :auto-ap/add-accounts]}
:auto-ap/backfill-account-options3 {:txes-fn `backfill-account-options2
:requires [:auto-ap/add-vendor-account-options2]}}
:first-time-only true
:requires [:auto-ap/add-vendor-account-options2 :auto-ap/add-accounts]}}

View File

@@ -363,7 +363,8 @@
:search_account {:type '(list :account_search_result)
:args {:query {:type 'String}
:allowance {:type :account_allowance}
:client_id {:type :id}}
:client_id {:type :id}
:vendor_id {:type :id}}
:resolve :search-account}

View File

@@ -5,10 +5,11 @@
[auto-ap.graphql.utils
:refer [->graphql
<-graphql
cleanse-query
assert-admin
assert-can-see-client
cleanse-query
enum->keyword
is-admin?
result->page]]
[datomic.api :as d]))
@@ -74,7 +75,13 @@
(->graphql
(d-accounts/get-by-id (or id (get-in result [:tempids "new-account"])))))))
(defn search [context {query :query client :client_id allowance :allowance} _]
(def search-pattern [:db/id
:account/numeric-code
:account/location
{:account/vendor-allowance [:db/ident]
:account/default-allowance [:db/ident]
:account/invoice-allowance [:db/ident]}])
(defn search [context {query :query client :client_id allowance :allowance vendor-id :vendor_id} _]
(when client
(assert-can-see-client (:id context) client))
(let [query (cleanse-query query)
@@ -82,45 +89,58 @@
second
(not-empty )
Integer/parseInt)
pattern [:db/id :account/numeric-code :account/location {:account/vendor-allowance [:db/ident]} {:account/invoice-allowance [:db/ident]}]
valid-allowances (cond-> #{:allowance/allowed
:allowance/warn}
(is-admin? (:id context)) (conj :allowance/admin-only))
allowance (cond (= allowance :vendor)
:account/vendor-allowance
(= allowance :invoice)
:account/invoice-allowance
:else
:account/default-allowance)]
:account/default-allowance)
vendor-account (when vendor-id
(-> (d/q '[:find ?da
:in $ ?v
:where [?v :vendor/default-account ?da]]
(d/db conn)
vendor-id)
ffirst))
xform (comp
(filter (fn [[_ a]]
(or
(valid-allowances (-> a allowance :db/ident))
(= (:db/id a) vendor-account))))
(map (fn [[n a]]
{:name (str (:account/numeric-code a) " - " n)
:id (:db/id a)
:location (:account/location a)
:warning (when (= :allowance/warn (-> a allowance :db/ident))
"This account is not typically used for this purpose.")})))]
(if query
(if num
(->> (d/q '[:find ?n (pull ?i pattern)
:in $ ?numeric-code ?allowance pattern
:where [?i :account/numeric-code ?numeric-code]
[?i :account/name ?n]
(or [?i ?allowance :allowance/allowed]
[?i ?allowance :allowance/warn])]
(or [?i :account/applicability :account-applicability/global]
[?i :account/applicability :account-applicability/optional])]
(d/db conn)
num
allowance
pattern)
(map (fn [[n a]]
{:name (str (:account/numeric-code a) " - " n)
:id (:db/id a)
:location (:account/location a)
:warning (when (= :allowance/warn (-> a allowance :db/ident))
"This account is not typically used for this purpose.")})))
search-pattern)
(sequence xform))
(->> (d/q '[:find ?n (pull ?i pattern) ?s
:in $ ?q ?allowance pattern
:where [(fulltext $ :account/search-terms ?q) [[?i ?n _ ?s]]]
[?i :account/numeric-code ?numeric-code]
(or [?i ?allowance :allowance/allowed]
[?i ?allowance :allowance/warn])
(or [?i :account/applicability :account-applicability/global]
[?i :account/applicability :account-applicability/optional])]
(d/db conn)
query
allowance
pattern)
search-pattern)
(concat (when client
(d/q '[:find ?n (pull ?a pattern) ?s
:in $ ?c ?q ?allowance pattern
@@ -128,20 +148,13 @@
[?i :account-client-override/client ?c]
[(fulltext $ :account-client-override/search-terms ?q) [[?i ?n _ ?s]]]
[?a :account/client-overrides ?i]
[?a :account/numeric-code ?numeric-code]
(or [?a ?allowance :allowance/allowed]
[?a ?allowance :allowance/warn])]
[?a :account/numeric-code ?numeric-code]]
(d/db conn)
client
query
allowance
pattern)))
search-pattern)))
(sort-by (comp - last))
(map (fn [[n a]]
{:name (str (:account/numeric-code a) " - " n)
:id (:db/id a)
:location (:account/location a)
:warning (when (= :allowance/warn (-> a allowance :db/ident))
"This account is not typically used for this purpose.")}))))
(sequence xform)))
[])))