very easy to lookup customized accounts.

This commit is contained in:
2022-04-10 21:46:58 -07:00
parent 53de49d758
commit b4d5b7fde6
5 changed files with 87 additions and 57 deletions

View File

@@ -1,19 +1,21 @@
(ns auto-ap.datomic.accounts (ns auto-ap.datomic.accounts
(:require [datomic.api :as d] (:require [datomic.api :as d]
[auto-ap.graphql.utils :refer [->graphql]] [auto-ap.graphql.utils :refer [->graphql]]
[auto-ap.datomic :refer [uri merge-query]])) [auto-ap.datomic :refer [uri merge-query conn]]))
(defn <-datomic [a] (defn <-datomic [a]
(update a :account/applicability :db/ident)) (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 (defn get-accounts
([] ([]
(get-accounts {})) (get-accounts {}))
([args] ([args]
(let [query (cond-> {:query {:find ['(pull ?e [* {:account/type [:db/ident :db/id] (let [query (cond-> {:query {:find [(list 'pull '?e default-read)]
:account/applicability [:db/ident :db/id]
:account/client-overrides [:db/id
:account-client-override/name
{:account-client-override/client [:db/id :client/name]}]}])]
:in ['$] :in ['$]
:where [['?e :account/name]]} :where [['?e :account/name]]}
:args [(d/db (d/connect uri))]} :args [(d/db (d/connect uri))]}
@@ -26,11 +28,7 @@
(map <-datomic))))) (map <-datomic)))))
(defn get-by-id [id] (defn get-by-id [id]
(let [query {:query {:find ['(pull ?e [* {:account/type [:db/ident :db/id] (let [query {:query {:find [(list 'pull '?e default-read)]
:account/applicability [:db/ident :db/id]
:account/client-overrides [:db/id
:account-client-override/name
{:account-client-override/client [:db/id :client/name]}]}])]
:in ['$ '?e]} :in ['$ '?e]}
:args [(d/db (d/connect uri) ) id]}] :args [(d/db (d/connect uri) ) id]}]
(->> (->>
@@ -39,6 +37,34 @@
(map <-datomic) (map <-datomic)
first))) 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] (defn get-account-by-numeric-code-and-sets [numeric-code sets]
(let [query (cond-> {:query {:find ['(pull ?e [* {:account/type [:db/ident :db/id]}])] (let [query (cond-> {:query {:find ['(pull ?e [* {:account/type [:db/ident :db/id]}])]
:in ['$ '?numeric-code] :in ['$ '?numeric-code]

View File

@@ -404,7 +404,11 @@
:resolve :get-user} :resolve :get-user}
:vendor_by_id {:type :vendor :vendor_by_id {:type :vendor
:args {:id {:type :id}} :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 :input-objects
{ {
@@ -789,6 +793,7 @@
: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 :vendor-by-id gq-vendors/get-by-id
:account-for-vendor gq-accounts/default-for-vendor
: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

View File

@@ -1,15 +1,27 @@
(ns auto-ap.graphql.accounts (ns auto-ap.graphql.accounts
(:require [datomic.api :as d] (:require
[auto-ap.datomic.accounts :as d-accounts] [auto-ap.datomic :refer [audit-transact remove-nils uri]]
[auto-ap.graphql.utils :refer [->graphql <-graphql enum->keyword] ] [auto-ap.datomic.accounts :as d-accounts]
[auto-ap.datomic :refer [uri merge-query remove-nils audit-transact]] [auto-ap.graphql.utils
[clojure.tools.logging :as log])) :refer [->graphql <-graphql assert-can-see-client enum->keyword]]
[datomic.api :as d]))
(defn get-accounts [context args value] (defn get-accounts [context args value]
(->graphql (d-accounts/get-accounts (<-graphql args)))) (->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] (defn upsert-account [context args value]
(let [{{:keys [id client-overrides numeric-code location applicability account-set name type]} :account} (<-graphql args)] (let [{{:keys [id client-overrides numeric-code location applicability account-set name type]} :account} (<-graphql args)]
(when-not id (when-not id

View File

@@ -1,22 +1,19 @@
(ns auto-ap.views.pages.admin.rules.form (ns auto-ap.views.pages.admin.rules.form
(:require [auto-ap.entities.transaction-rule :as entity] (:require [auto-ap.entities.transaction-rule :as entity]
[auto-ap.events :as events]
[auto-ap.forms :as forms] [auto-ap.forms :as forms]
[auto-ap.subs :as subs] [auto-ap.subs :as subs]
[auto-ap.views.components.button-radio :refer [button-radio]] [auto-ap.views.components.button-radio :refer [button-radio]]
[auto-ap.utils :refer [dollars=]] [auto-ap.views.components.expense-accounts-field :as expense-accounts-field :refer [expense-accounts-field]]
[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.layouts :as layouts] [auto-ap.views.components.layouts :as layouts]
[auto-ap.views.components.typeahead :refer [typeahead-v3]] [auto-ap.views.components.typeahead :refer [typeahead-v3]]
[auto-ap.views.pages.admin.rules.common :refer [default-read]] [auto-ap.views.pages.admin.rules.common :refer [default-read]]
[auto-ap.views.pages.admin.rules.results-modal :as results-modal] [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]] [auto-ap.views.utils :refer [dispatch-event with-user]]
[cljs-time.core :as c]
[clojure.spec.alpha :as s] [clojure.spec.alpha :as s]
[clojure.string :as str] [clojure.string :as str]
[re-frame.core :as re-frame] [re-frame.core :as re-frame]
[auto-ap.status :as status])) [auto-ap.status :as status]
[vimsical.re-frame.cofx.inject :as inject]))
;; SUBS ;; SUBS
@@ -45,7 +42,7 @@
(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]} _]
(s/valid? ::entity/transaction-rule data))) (s/valid? ::entity/transaction-rule data)))
(re-frame/reg-sub (re-frame/reg-sub
@@ -188,23 +185,23 @@
(re-frame/reg-event-fx (re-frame/reg-event-fx
::saving ::saving
[with-user (forms/triggers-loading ::form) (forms/in-form ::form)] [with-user (forms/triggers-loading ::form) (forms/in-form ::form) (re-frame/inject-cofx ::inject/sub [::query])]
(fn [{:keys [user] {:keys [data]} :db} [_ params]] (fn [{:keys [user] ::keys [query]} _]
{:graphql {:graphql
{:token user {:token user
:query-obj @(re-frame/subscribe [::query]) :query-obj query
:on-success (fn [result] :on-success (fn [result]
[::updated (:upsert-transaction-rule result)]) [::updated (:upsert-transaction-rule result)])
:on-error [::forms/save-error ::form]}})) :on-error [::forms/save-error ::form]}}))
(re-frame/reg-event-fx (re-frame/reg-event-fx
::test-clicked ::test-clicked
[with-user (forms/triggers-loading ::form) (forms/in-form ::form)] [with-user (forms/triggers-loading ::form) (forms/in-form ::form) (re-frame/inject-cofx ::inject/sub [::test-query])]
(fn [{:keys [user] {:keys [data]} :db} [_ params]] (fn [{:keys [user] ::keys [test-query]} _]
{:graphql {:graphql
{:token user {:token user
:owns-state {:single ::test} :owns-state {:single ::test}
:query-obj @(re-frame/subscribe [::test-query]) :query-obj test-query
:on-success [::succeeded-test] :on-success [::succeeded-test]
:on-error [::forms/save-error ::form]}})) :on-error [::forms/save-error ::form]}}))
@@ -218,7 +215,7 @@
(re-frame/reg-event-fx (re-frame/reg-event-fx
::succeeded-test ::succeeded-test
[(forms/triggers-stop-loading ::form)] [(forms/triggers-stop-loading ::form)]
(fn [{:keys [db]} [_ result]] (fn [_ [_ result]]
{:dispatch [::results-modal/opening (:test-transaction-rule result) nil false]})) {: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 ])} [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 {:keys [form-inline field raw-field error-notification submit-button ]} rule-form
default-note @(re-frame/subscribe [::default-note]) default-note @(re-frame/subscribe [::default-note])
test-state @(re-frame/subscribe [::status/single ::test]) test-state @(re-frame/subscribe [::status/single ::test])]
exists? (:id data)]
^{:key id} ^{:key id}
(form-inline (assoc params :title "New Transaction Rule") (form-inline (assoc params :title "New Transaction Rule")
[:<> [:<>
@@ -315,8 +311,6 @@
:precision 0 :precision 0
:step "1"}])]]]] :step "1"}])]]]]
[:h2.title.is-4 "Outcomes"] [:h2.title.is-4 "Outcomes"]
(field "Assign Vendor" (field "Assign Vendor"

View File

@@ -266,7 +266,7 @@
(fn [db _] (fn [db _]
db)) db))
(re-frame/reg-sub #_(re-frame/reg-sub
::client-accounts ::client-accounts
:<- [::forms/field ::form [:client]] :<- [::forms/field ::form [:client]]
:<- [::subs/all-accounts] :<- [::subs/all-accounts]
@@ -275,15 +275,19 @@
(re-frame/reg-event-fx (re-frame/reg-event-fx
::changed-vendor ::changed-vendor
[with-user (forms/in-form ::form) (re-frame/inject-cofx ::inject/sub [::client-accounts])] [with-user (forms/in-form ::form)]
(fn [{::keys [client-accounts] :keys [user] {{:keys [client date due expense-accounts total]} :data} :db} [_ vendor]] (fn [{:keys [user] {{:keys [client date due expense-accounts total]} :data} :db} [_ vendor]]
(when (:id vendor) (when (:id vendor)
{:graphql {:token user {:graphql {:token user
:query-obj {:venia/queries [[:vendor-by-id :query-obj {:venia/queries [[:vendor-by-id
{:id (:id vendor)} {:id (:id vendor)}
[[:automatically-paid-when-due [:id]] [[:automatically-paid-when-due [:id]]
[:schedule-payment-dom [[:client [:id]] :dom]] [: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] :on-success (fn [r]
(let [schedule-payment-dom (->> r (let [schedule-payment-dom (->> r
:vendor-by-id :vendor-by-id
@@ -294,23 +298,12 @@
first first
:dom) :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-> [] changes (cond-> []
(expense-accounts-field/can-replace-with-default? expense-accounts) (expense-accounts-field/can-replace-with-default? expense-accounts)
(into [[:expense-accounts] (expense-accounts-field/default-account expense-accounts (into [[:expense-accounts] (expense-accounts-field/default-account expense-accounts
default-account (:account-for-vendor r)
total total
(:locations client) (:locations client))])
)])
(boolean ((->> r :vendor-by-id :automatically-paid-when-due (map :id) set) (:id client))) (boolean ((->> r :vendor-by-id :automatically-paid-when-due (map :id) set) (:id client)))
(into [[:scheduled-payment] due (into [[:scheduled-payment] due