very easy to lookup customized accounts.
This commit is contained in:
@@ -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]
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user