Makes multiple client selection somewhat possible via graphql.

This commit is contained in:
2023-08-31 13:05:06 -07:00
parent 9c472dfc8e
commit 1d82ec29e0
29 changed files with 274 additions and 139 deletions

View File

@@ -40,15 +40,13 @@
([db args]
(let [check-number-like (try (Long/parseLong (:check-number-like args)) (catch Exception _ nil))
query (if (:exact-match-id args)
(cond-> {:query {:find '[?e]
:in '[$ ?e]
:where '[[?e :payment/client ?c]]}
:args [db
(:exact-match-id args)]}
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :payment/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]}))
{:query {:find '[?e]
:in '[$ ?e [?c ...]]
:where '[[?e :payment/client ?c]]}
:args [db
(:exact-match-id args)
(map :db/id (:clients args))]
}
(cond-> {:query {:find []
:in ['$]
:where []}
@@ -69,10 +67,10 @@
:where []}
:args [(:exact-match-id args)]})
(limited-clients (:id args))
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :payment/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]})
:args [(map :db/id (:clients args))]})
(:client-id args)

View File

@@ -165,18 +165,20 @@
:else
nil)
valid-ids (cond
matching-ids (cond
(and name-like-ids (limited-clients (:id args)))
(set/intersection name-like-ids (limited-clients (:id args)))
(limited-clients (:id args))
(limited-clients (:id args))
name-like-ids
name-like-ids
:else
nil)
valid-ids (if matching-ids
(set/intersection (set (map :db/id (:clients args)))
matching-ids)
(set (map :db/id (:clients args))))
query (cond-> {:query {:find []
:in ['$ ]

View File

@@ -38,10 +38,10 @@
"fee" ['[?e :expected-deposit/fee ?sort-fee]]}
args)
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :expected-deposit/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]})
:args [(set (map :db/id (:clients args)))]})
(:exact-match-id args)
(merge-query {:query {:in ['?e]

View File

@@ -49,24 +49,21 @@
([db args]
(let [query
(if (:exact-match-id args)
(cond-> {:query {:find '[?e]
:in '[$ ?e]
:where '[[?e :invoice/client ?c]]}
:args [db
(:exact-match-id args)]}
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :invoice/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]}))
{:query {:find '[?e]
:in '[$ ?e [?c ...]]
:where '[[?e :invoice/client ?c]]}
:args [db
(:exact-match-id args)
(map :db/id (:clients args))]}
(cond-> {:query {:find []
:in ['$]
:where ['[?e :invoice/client]]}
:args [db]}
(limited-clients (:id args))
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :invoice/client ?xx]]}
:args [ (set (map :db/id (limited-clients (:id args))))]})
:args [ (map :db/id (:clients args))]})
(:client-id args)
(merge-query {:query {:in ['?client-id]
:where ['[?e :invoice/client ?client-id]]}
@@ -87,14 +84,14 @@
(string? (:original-id args)) Long/parseLong )]})
(:start (:date-range args)) (merge-query {:query {:in '[?start-date]
:where ['[?e :invoice/date ?date]
'[(>= ?date ?start-date)]]}
:args [(coerce/to-date (:start (:date-range args)))]})
:where ['[?e :invoice/date ?date]
'[(>= ?date ?start-date)]]}
:args [(coerce/to-date (:start (:date-range args)))]})
(:end (:date-range args)) (merge-query {:query {:in '[?end-date]
:where ['[?e :invoice/date ?date]
'[(<= ?date ?end-date)]]}
:args [(coerce/to-date (:end (:date-range args)))]})
:where ['[?e :invoice/date ?date]
'[(<= ?date ?end-date)]]}
:args [(coerce/to-date (:end (:date-range args)))]})
(:start (:due-range args)) (merge-query {:query {:in '[?start-due]
:where ['[?e :invoice/due ?due]

View File

@@ -16,24 +16,21 @@
(defn raw-graphql-ids [db args]
(let [query
(if (:exact-match-id args)
(cond-> {:query {:find '[?e]
:in '[$ ?e]
:where '[[?e :journal-entry/client ?c]]}
:args [db
(:exact-match-id args)]}
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :journal-entry/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]}))
{:query {:find '[?e]
:in '[$ ?e [?c ...]]
:where '[[?e :journal-entry/client ?c]]}
:args [db
(:exact-match-id args)
(map :db/id (:clients args))]}
(cond-> {:query {:find []
:in ['$ ]
:where []}
:args [db]}
(:client-id args)
(merge-query {:query {:in ['?client-id]
:where ['[?e :journal-entry/client ?client-id]]}
:args [(:client-id args)]})
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :journal-entry/client ?xx]]}
:args [(set (map :db/id (:clients args)))]})
(:only-external args)
(merge-query {:query {:where ['(not [?e :journal-entry/original-entity ])]}})
@@ -86,7 +83,7 @@
'[(>= ?c ?from-numeric-code)]
'[(<= ?c ?to-numeric-code)]]}
:args [(vec (for [{:keys [from to]} (:numeric-code args)]
[(or from 0) (or to 99999)]))]})
[(or from 0) (or to 99999)]))]})
(:amount-gte args)
@@ -127,10 +124,10 @@
:where ['[?e :journal-entry/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]})
(:sort args) (add-sorter-fields {"client" ['[?e :journal-entry/client ?c]
'[?c :client/name ?sort-client]]
'[?c :client/name ?sort-client]]
"date" ['[?e :journal-entry/date ?sort-date]]
"vendor" ['[?e :journal-entry/vendor ?v]
'[?v :vendor/name ?sort-vendor]]
'[?v :vendor/name ?sort-vendor]]
"amount" ['[?e :journal-entry/amount ?sort-amount]]
"external-id" ['[?e :journal-entry/external-id ?sort-external-id]]
"source" ['[?e :journal-entry/source ?sort-source]]}

View File

@@ -21,10 +21,10 @@
:args [db]}
(:client-id args)
(merge-query {:query {:in ['?client-id]
:where ['[?e :report/client ?client-id]]}
:args [(:client-id args)]})
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :report/client ?xx]]}
:args [(set (map :db/id (:clients args)))]})
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]

View File

@@ -57,7 +57,7 @@
{:charge/processor [:db/ident]} {:expected-deposit/_charges [:db/id]}]}])
(defn raw-graphql-ids [db args]
(let [visible-clients (visible-clients (:id args))
(let [visible-clients (set (map :db/id (:clients args)))
selected-clients (->> (cond
(:client-id args)
(set/intersection #{(:client-id args)}

View File

@@ -50,15 +50,10 @@
"amount-gte" ['[?e :transaction-rule/amount-gte ?sort-amount-gte]]}
args)
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :transaction-rule/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]})
(:client-id args)
(merge-query {:query {:in ['?client-id]
:where ['[?e :transaction-rule/client ?client-id]]}
:args [(:client-id args)]})
:args [(set (map :db/id (:clients args)))]})
(:vendor-id args)
(merge-query {:query {:in ['?vendor-id]

View File

@@ -45,14 +45,11 @@
query
(if (:exact-match-id args)
(cond-> {:query {:find '[?e]
:in '[$ ?e]
:in '[$ ?e [?c ...]]
:where '[[?e :transaction/client ?c]]}
:args [db
(:exact-match-id args)]}
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :transaction/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]}))
(:exact-match-id args)
(map :db/id (:clients args))]})
(cond-> {:query {:find []
:in ['$ ]
:where []}
@@ -62,10 +59,10 @@
(merge-query {:query {:in '[[?e ...]]}
:args [potential-duplicates]})
(limited-clients (:id args))
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :transaction/client ?xx]]}
:args [(set (map :db/id (limited-clients (:id args))))]})
:args [(set (map :db/id (:clients args)))]})
(:bank-account-id args)
(merge-query {:query {:in ['?bank-account-id]

View File

@@ -23,10 +23,10 @@
:where ['[?e :yodlee-provider-account/id]]}
:args [db]}
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :yodlee-provider-account/client ?xx]]}
:args [ (set (map :db/id (limited-clients (:id args))))]})
:args [(set (map :db/id (:clients args)))]})
(:client-id args)
(merge-query {:query {:in ['?client-id]

View File

@@ -862,7 +862,9 @@
(lc/with-context {:query q}
(log/info "executing query name" (query-name q))
(try
(let [[result time] (time-it (simplify (execute schema q v {:id id})))]
(let [[result time] (time-it (simplify (execute schema q (dissoc v
:clients) {:id id
:clients (:clients v)})))]
(info-event "Query completed"
{:time (:time time)
:errors (seq (:errors result))})

View File

@@ -433,7 +433,7 @@
(let [[payments checks-count] (d-checks/get-graphql (-> args
:filters
(<-graphql)
(assoc :id (:id context))
(assoc :clients (:clients context))
(update :payment-type enum->keyword "payment-type")
(update :status enum->keyword "payment-status")))]
@@ -557,10 +557,10 @@
(defn void-payments [context args _]
(assert-admin (:id context))
(let [args (assoc args :id (:id context))
(let [args (assoc args :clients (:clients context))
ids (some-> args
:filters
(assoc :id (:id context))
(assoc :clients (:clients context))
(<-graphql)
(update :payment-type enum->keyword "payment-type")
(update :status enum->keyword "payment-status")

View File

@@ -221,7 +221,7 @@
(assert-admin (:id context))
(let [args (assoc args :id (:id context))
[clients clients-count] (d-clients/get-graphql-page (assoc (<-graphql (:filters args))
:id (:id context)))
:clients (:clients context)))
clients (->> clients
(map (fn [c]

View File

@@ -15,7 +15,7 @@
(first (d-expected-deposit/get-graphql (assoc (<-graphql args) :count Integer/MAX_VALUE)))))
(defn get-expected-deposit-page [context args _]
(let [args (assoc args :id (:id context))
(let [args (assoc args :clients (:clients context))
[expected-deposits expected-deposit-count] (d-expected-deposit/get-graphql (<-graphql args))
expected-deposits (map status->graphql expected-deposits)]

View File

@@ -37,7 +37,7 @@
(let [args (assoc args :id (:id context))
[invoices invoice-count outstanding total-amount] (-> args
:filters
(assoc :id (:id context))
(assoc :clients (:clients context))
(<-graphql)
(update :status enum->keyword "invoice-status")
(d-invoices/get-graphql))]

View File

@@ -36,7 +36,7 @@
(defn get-ledger-page [context args _]
(let [args (assoc args :id (:id context))
[journal-entries journal-entries-count] (l/get-graphql (assoc (<-graphql (:filters args))
:id (:id context)))
:clients (:clients context)))
journal-entries (mapv
(fn [je]
@@ -316,7 +316,7 @@
(defn delete-external-ledger [context args _]
(let [_ (assert-admin (:id context))
args (assoc args :id (:id context))
args (assoc args :clients (:clients context))
ids (some-> (:filters args)
(assoc :only-external true)
(<-graphql)

View File

@@ -11,7 +11,7 @@
(defn get-report-page [context args _]
(let [args (assoc args :id (:id context))
[reports reports-count] (r/get-graphql (assoc (<-graphql (:filters args))
:id (:id context)))]
:clients (:clients context)))]
(result->page reports reports-count :reports (:filters args)))
)

View File

@@ -5,7 +5,7 @@
[auto-ap.graphql.utils :refer [attach-tracing-resolvers]]))
(defn get-sales-orders-page [context args _]
(let [args (assoc args :id (:id context))
(let [args (assoc args :clients (:clients context))
[sales-orders sales-orders-count {:keys [total tax]}] (d-sales-orders2/get-graphql (<-graphql args))]
(assoc (result->page sales-orders sales-orders-count :sales_orders args)
:sales_order_total total

View File

@@ -20,7 +20,7 @@
[iol-ion.tx :refer [random-tempid]]))
(defn get-transaction-rule-page [context args _]
(let [args (assoc args :id (:id context))
(let [args (assoc args :clients (:clients context))
[journal-entries journal-entries-count] (tr/get-graphql (<-graphql args))]
(result->page (->> journal-entries
(map (ident->enum-f :transaction-rule/transaction-approval-status)))

View File

@@ -52,7 +52,8 @@
{:validation-error "In order to select potential duplicates, you must filter your view more."})))))
(defn get-transaction-page [context args _]
(let [args (assoc (:filters args) :id (:id context))
(let [args (assoc (:filters args)
:clients (:clients context))
_ (assert-filtered-enough args)
[transactions transactions-count] (d-transactions/get-graphql (update (<-graphql args) :approval-status enum->keyword "transaction-approval-status"))
transactions (map ->graphql (map approval-status->graphql transactions))]
@@ -85,7 +86,7 @@
(map first)))
(defn bulk-change-status [context args _]
(let [_ (assert-admin (:id context))
args (assoc args :id (:id context))
args (assoc args :clients (:clients context))
all-ids (->> (get-ids-matching-filters args)
all-ids-not-locked)]
@@ -137,10 +138,11 @@
(defn bulk-code-transactions [context args _]
(assert-admin (:id context))
(when-not (:client_id args)
(when-not (seq (:client_id args))
(throw (ex-info "Client is required"
{:validation-error "client is required"})))
(let [args (assoc args :id (:id context))
;; TODO FIX THIS TO WORK WITH MULTIPLE
(let [args (assoc args :clients (:clients context))
locations (pull-attr (dc/db conn)
:client/locations
(:client_id args))
@@ -184,7 +186,7 @@
(defn delete-transactions [context args _]
(let [_ (assert-admin (:id context))
args (assoc args :id (:id context))
args (assoc args :clients (:clients context))
all-ids (all-ids-not-locked (get-ids-matching-filters args))
db (dc/db conn)]

View File

@@ -5,7 +5,7 @@
(defn get-yodlee-provider-account-page [context args _]
(let [args (assoc args :id (:id context))
[yodlee-provider-accounts cnt] (d-yodlee2/get-graphql (<-graphql (assoc args :id (:id context))))]
[yodlee-provider-accounts cnt] (d-yodlee2/get-graphql (<-graphql (assoc args :clients (:clients context))))]
{:yodlee_provider_accounts (map ->graphql yodlee-provider-accounts)
:total cnt
:count (count yodlee-provider-accounts)

View File

@@ -1,10 +1,47 @@
(ns auto-ap.routes.graphql
(:require [auto-ap.routes.utils :refer [wrap-secure]]
[auto-ap.graphql :as ql]
[auto-ap.logging :refer [warn-event]]
[buddy.auth :refer [throw-unauthorized]]
[clojure.edn :as edn]
[clojure.tools.logging :as log]))
(:require
[auto-ap.datomic :refer [conn pull-many]]
[auto-ap.datomic.clients :as d-clients]
[auto-ap.graphql :as ql]
[auto-ap.graphql.utils :refer [limited-clients]]
[auto-ap.logging :refer [warn-event]]
[auto-ap.routes.utils :refer [wrap-secure]]
[buddy.auth :refer [throw-unauthorized]]
[clojure.edn :as edn]
[clojure.set :as set]
[clojure.tools.logging :as log]
[datomic.api :as dc]))
(defn headers->clients [identity headers]
(let [x-clients (clojure.edn/read-string (get headers "x-clients"))
ideal-ids (set (cond
(or (= :all x-clients)
(nil? x-clients))
(->> (dc/q '[:find ?c
:where [?c :client/code]]
(dc/db conn))
(map first))
(= :mine x-clients)
(map :db/id (:user/clients identity))
(seq x-clients)
x-clients))
_ (println "X-CLIENSTT" x-clients)
_ (println "IDEAL" ideal-ids)
_ (println "LIMITS" (limited-clients identity))
limited-clients (some->> (limited-clients identity)
(map :db/id )
set)
client-ids (if (set? limited-clients)
(set/intersection ideal-ids
limited-clients)
ideal-ids)]
(pull-many (dc/db conn)
d-clients/full-read
client-ids)))
(defn handle-graphql [{:keys [request-method query-params] :as r}]
(when (= "none" (:user/role (:identity r)))
(throw-unauthorized))
@@ -13,8 +50,11 @@
(let [variables (some-> (query-params "variables")
edn/read-string)
body (some-> r :body slurp)]
{:status 200
:body (pr-str (ql/query (:identity r) (if (= request-method :get) (query-params "query") body) variables ))
:body (pr-str (ql/query (:identity r) (if (= request-method :get) (query-params "query") body) (assoc variables
:clients
(headers->clients (:identity r) (:headers r))) ))
:headers {"Content-Type" "application/edn"}})
(catch Throwable e
(log/info "here we are " (.getCause e))

View File

@@ -1,7 +1,8 @@
(ns auto-ap.ssr.company-dropdown
(:require
[auto-ap.datomic :refer [conn pull-many]]
[auto-ap.graphql.utils :refer [assert-can-see-client cleanse-query]]
[auto-ap.graphql.utils
:refer [assert-can-see-client cleanse-query is-admin?]]
[auto-ap.solr :as solr]
[auto-ap.ssr-routes :as ssr-routes]
[auto-ap.ssr.svg :as svg]
@@ -125,18 +126,48 @@ function initCompanyDropdown() {
")]]])
(defn active-client [{:keys [identity params] :as request}]
(let [client-id (some-> (or (:search-client params) (get params "search-client")) not-empty Long/parseLong)]
(println (format "HERE CLIENT ID '%s'" client-id))
(let [client-search (or (:search-client params)
(get params "search-client"))
client-id (try (some-> client-search
(not-empty )
Long/parseLong)
(catch Exception _
nil))]
(when client-id
(assert-can-see-client identity client-id))
(let [new-session (assoc (:session request) :client
(let [new-session (assoc (:session request)
:client
(when client-id
(dc/pull (dc/db conn) [:db/id :client/name :client/code] client-id)))]
(dc/pull (dc/db conn) [:db/id :client/name :client/code] client-id))
:clients
(cond (int? client-id)
[(dc/pull (dc/db conn) [:db/id :client/name :client/code] client-id)]
(= ":mine" client-search)
(->> (dc/q '[:find (pull ?c [:db/id :client/name :client/code])
:in $ ?u
:where [?u :user/clients ?c]]
(dc/db conn)
(:db/id identity))
(map first))
(and (or (empty? client-search)
(= ":all" client-search))
(is-admin? identity))
(->> (dc/q '[:find (pull ?c [:db/id :client/name :client/code])
:in $ ?u
:where [?c :client/code]]
(dc/db conn)
(:db/id identity))
(map first))))]
(assoc
(html-response
(dropdown {:client (:client new-session)
:identity identity}))
:session
new-session
:headers
{"hx-trigger" "clientSelected"}))))
(html-response
(dropdown {:client (:client new-session)
:identity identity}))
:session
new-session
:headers
{"hx-trigger" "clientSelected"}))))