From b4d5b7fde6c85422b083cbb8f32285ca6aec59f3 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Sun, 10 Apr 2022 21:46:58 -0700 Subject: [PATCH] very easy to lookup customized accounts. --- src/clj/auto_ap/datomic/accounts.clj | 48 ++++++++++++++----- src/clj/auto_ap/graphql.clj | 7 ++- src/clj/auto_ap/graphql/accounts.clj | 26 +++++++--- .../auto_ap/views/pages/admin/rules/form.cljs | 36 ++++++-------- .../auto_ap/views/pages/invoices/form.cljs | 27 ++++------- 5 files changed, 87 insertions(+), 57 deletions(-) diff --git a/src/clj/auto_ap/datomic/accounts.clj b/src/clj/auto_ap/datomic/accounts.clj index db3aa711..5f7b8d44 100644 --- a/src/clj/auto_ap/datomic/accounts.clj +++ b/src/clj/auto_ap/datomic/accounts.clj @@ -1,19 +1,21 @@ (ns auto-ap.datomic.accounts (:require [datomic.api :as d] [auto-ap.graphql.utils :refer [->graphql]] - [auto-ap.datomic :refer [uri merge-query]])) + [auto-ap.datomic :refer [uri merge-query conn]])) (defn <-datomic [a] (update a :account/applicability :db/ident)) +(def default-read ['* {:account/type [:db/ident :db/id] + :account/applicability [:db/ident :db/id] + :account/client-overrides [:db/id + :account-client-override/name + {:account-client-override/client [:db/id :client/name]}]}]) + (defn get-accounts ([] (get-accounts {})) ([args] - (let [query (cond-> {:query {:find ['(pull ?e [* {:account/type [:db/ident :db/id] - :account/applicability [:db/ident :db/id] - :account/client-overrides [:db/id - :account-client-override/name - {:account-client-override/client [:db/id :client/name]}]}])] + (let [query (cond-> {:query {:find [(list 'pull '?e default-read)] :in ['$] :where [['?e :account/name]]} :args [(d/db (d/connect uri))]} @@ -26,11 +28,7 @@ (map <-datomic))))) (defn get-by-id [id] - (let [query {:query {:find ['(pull ?e [* {:account/type [:db/ident :db/id] - :account/applicability [:db/ident :db/id] - :account/client-overrides [:db/id - :account-client-override/name - {:account-client-override/client [:db/id :client/name]}]}])] + (let [query {:query {:find [(list 'pull '?e default-read)] :in ['$ '?e]} :args [(d/db (d/connect uri) ) id]}] (->> @@ -39,6 +37,34 @@ (map <-datomic) first))) +(defn get-for-vendor [vendor-id client-id] + (if client-id + (->> + (d/q [:find (list 'pull '?e default-read) + :in '$ '?v '?c + :where '(or-join [?v ?c ?e] + (and [?v :vendor/account-overrides ?ao] + [?ao :vendor-account-override/client ?c] + [?ao :vendor-account-override/account ?e]) + (and [?v :vendor/account-overrides ?ao] + (not [?ao vendor-account-override/client ?c]) + [?v :vendor/default-account ?e]) + (and (not [?v :vendor/account-overrides]) + [?v :vendor/default-account ?e]))] + + (d/db conn ) + vendor-id + client-id) + (map first) + (map <-datomic) + first) + (d/q [:find (list 'pull '?e default-read) + :in '$ '?v + :where '[?v :vendor/default-account ?e]] + + (d/db conn ) + vendor-id))) + (defn get-account-by-numeric-code-and-sets [numeric-code sets] (let [query (cond-> {:query {:find ['(pull ?e [* {:account/type [:db/ident :db/id]}])] :in ['$ '?numeric-code] diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index d1d35290..20192cdb 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -404,7 +404,11 @@ :resolve :get-user} :vendor_by_id {:type :vendor :args {:id {:type :id}} - :resolve :vendor-by-id}} + :resolve :vendor-by-id} + :account_for_vendor {:type :account + :args {:client_id {:type :id} + :vendor_id {:type :id}} + :resolve :account-for-vendor}} :input-objects { @@ -789,6 +793,7 @@ :get-yodlee-merchants ym/get-yodlee-merchants :get-intuit-bank-accounts gq-intuit-bank-accounts/get-intuit-bank-accounts :vendor-by-id gq-vendors/get-by-id + :account-for-vendor gq-accounts/default-for-vendor :get-user get-user :mutation/delete-transaction-rule gq-transaction-rules/delete-transaction-rule :mutation/edit-user gq-users/edit-user diff --git a/src/clj/auto_ap/graphql/accounts.clj b/src/clj/auto_ap/graphql/accounts.clj index 9b4d80b4..9ed1ca1d 100644 --- a/src/clj/auto_ap/graphql/accounts.clj +++ b/src/clj/auto_ap/graphql/accounts.clj @@ -1,15 +1,27 @@ (ns auto-ap.graphql.accounts - (:require [datomic.api :as d] - [auto-ap.datomic.accounts :as d-accounts] - [auto-ap.graphql.utils :refer [->graphql <-graphql enum->keyword] ] - [auto-ap.datomic :refer [uri merge-query remove-nils audit-transact]] - [clojure.tools.logging :as log])) - - + (:require + [auto-ap.datomic :refer [audit-transact remove-nils uri]] + [auto-ap.datomic.accounts :as d-accounts] + [auto-ap.graphql.utils + :refer [->graphql <-graphql assert-can-see-client enum->keyword]] + [datomic.api :as d])) (defn get-accounts [context args value] (->graphql (d-accounts/get-accounts (<-graphql args)))) +(defn default-for-vendor [context args value] + (assert-can-see-client (:id context) (:client_id args)) + (let [result (d-accounts/get-for-vendor (:vendor_id args) (:client_id args))] + (->graphql + (if-let [override-name (->> result + :account/client-overrides + (filter #(= (:client_id args) + (:db/id (:account-client-override/client %)))) + first + :account-client-override/name)] + (assoc result :account/name override-name) + result)))) + (defn upsert-account [context args value] (let [{{:keys [id client-overrides numeric-code location applicability account-set name type]} :account} (<-graphql args)] (when-not id diff --git a/src/cljs/auto_ap/views/pages/admin/rules/form.cljs b/src/cljs/auto_ap/views/pages/admin/rules/form.cljs index 74145e6e..02fec28e 100644 --- a/src/cljs/auto_ap/views/pages/admin/rules/form.cljs +++ b/src/cljs/auto_ap/views/pages/admin/rules/form.cljs @@ -1,22 +1,19 @@ (ns auto-ap.views.pages.admin.rules.form (:require [auto-ap.entities.transaction-rule :as entity] - [auto-ap.events :as events] [auto-ap.forms :as forms] [auto-ap.subs :as subs] [auto-ap.views.components.button-radio :refer [button-radio]] - [auto-ap.utils :refer [dollars=]] - [auto-ap.views.components.dropdown :refer [drop-down]] - [auto-ap.views.components.expense-accounts-field :as expense-accounts-field :refer [expense-accounts-field recalculate-amounts]] + [auto-ap.views.components.expense-accounts-field :as expense-accounts-field :refer [expense-accounts-field]] [auto-ap.views.components.layouts :as layouts] [auto-ap.views.components.typeahead :refer [typeahead-v3]] [auto-ap.views.pages.admin.rules.common :refer [default-read]] [auto-ap.views.pages.admin.rules.results-modal :as results-modal] - [auto-ap.views.utils :refer [date->str date-picker dispatch-event standard with-user]] - [cljs-time.core :as c] + [auto-ap.views.utils :refer [dispatch-event with-user]] [clojure.spec.alpha :as s] [clojure.string :as str] [re-frame.core :as re-frame] - [auto-ap.status :as status])) + [auto-ap.status :as status] + [vimsical.re-frame.cofx.inject :as inject])) ;; SUBS @@ -45,7 +42,7 @@ (re-frame/reg-sub ::can-submit :<- [::forms/form ::form] - (fn [{:keys [data status]} _] + (fn [{:keys [data]} _] (s/valid? ::entity/transaction-rule data))) (re-frame/reg-sub @@ -188,23 +185,23 @@ (re-frame/reg-event-fx ::saving - [with-user (forms/triggers-loading ::form) (forms/in-form ::form)] - (fn [{:keys [user] {:keys [data]} :db} [_ params]] + [with-user (forms/triggers-loading ::form) (forms/in-form ::form) (re-frame/inject-cofx ::inject/sub [::query])] + (fn [{:keys [user] ::keys [query]} _] {:graphql {:token user - :query-obj @(re-frame/subscribe [::query]) + :query-obj query :on-success (fn [result] [::updated (:upsert-transaction-rule result)]) :on-error [::forms/save-error ::form]}})) (re-frame/reg-event-fx ::test-clicked - [with-user (forms/triggers-loading ::form) (forms/in-form ::form)] - (fn [{:keys [user] {:keys [data]} :db} [_ params]] + [with-user (forms/triggers-loading ::form) (forms/in-form ::form) (re-frame/inject-cofx ::inject/sub [::test-query])] + (fn [{:keys [user] ::keys [test-query]} _] {:graphql {:token user :owns-state {:single ::test} - :query-obj @(re-frame/subscribe [::test-query]) + :query-obj test-query :on-success [::succeeded-test] :on-error [::forms/save-error ::form]}})) @@ -218,7 +215,7 @@ (re-frame/reg-event-fx ::succeeded-test [(forms/triggers-stop-loading ::form)] - (fn [{:keys [db]} [_ result]] + (fn [_ [_ result]] {:dispatch [::results-modal/opening (:test-transaction-rule result) nil false]})) @@ -233,13 +230,12 @@ -(defn form [{:keys [can-change-amount?] :as params}] +(defn form [params] [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 ]} rule-form default-note @(re-frame/subscribe [::default-note]) - test-state @(re-frame/subscribe [::status/single ::test]) - exists? (:id data)] + test-state @(re-frame/subscribe [::status/single ::test])] ^{:key id} (form-inline (assoc params :title "New Transaction Rule") [:<> @@ -315,8 +311,6 @@ :precision 0 :step "1"}])]]]] - - [:h2.title.is-4 "Outcomes"] (field "Assign Vendor" diff --git a/src/cljs/auto_ap/views/pages/invoices/form.cljs b/src/cljs/auto_ap/views/pages/invoices/form.cljs index 7eff34a7..612d4557 100644 --- a/src/cljs/auto_ap/views/pages/invoices/form.cljs +++ b/src/cljs/auto_ap/views/pages/invoices/form.cljs @@ -266,7 +266,7 @@ (fn [db _] db)) -(re-frame/reg-sub +#_(re-frame/reg-sub ::client-accounts :<- [::forms/field ::form [:client]] :<- [::subs/all-accounts] @@ -275,15 +275,19 @@ (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]] + [with-user (forms/in-form ::form)] + (fn [{: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]]]]]} + [:default-account [:id]]]] + [:account-for-vendor + {:vendor-id (:id vendor) + :client-id (:id client)} + [:name :id :numeric-code :location]]]} :on-success (fn [r] (let [schedule-payment-dom (->> r :vendor-by-id @@ -294,23 +298,12 @@ 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 + (:account-for-vendor r) total - (:locations client) - )]) + (:locations client))]) (boolean ((->> r :vendor-by-id :automatically-paid-when-due (map :id) set) (:id client))) (into [[:scheduled-payment] due