From add1dc6fcb1f88c1330fccbfbfb9686c8c64ab6c Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Sat, 21 Mar 2020 13:17:50 -0700 Subject: [PATCH] can unapprove, but there are bugs. UI doesnt refresh, filters are lost. --- src/clj/auto_ap/datomic/transactions.clj | 181 ++++++++++-------- src/clj/auto_ap/graphql.clj | 16 ++ src/clj/auto_ap/graphql/transactions.clj | 10 + .../auto_ap/views/pages/transactions.cljs | 25 ++- 4 files changed, 146 insertions(+), 86 deletions(-) diff --git a/src/clj/auto_ap/datomic/transactions.clj b/src/clj/auto_ap/datomic/transactions.clj index c050143a..888d01ea 100644 --- a/src/clj/auto_ap/datomic/transactions.clj +++ b/src/clj/auto_ap/datomic/transactions.clj @@ -17,104 +17,106 @@ (keyword "transaction" sort-by))) -(defn raw-graphql-ids [db args] - (let [query (cond-> {:query {:find [] - :in ['$ ] - :where []} - :args [db]} +(defn raw-graphql-ids + ([args] (raw-graphql-ids (d/db (d/connect uri)) args)) + ([db args] + (let [query (cond-> {:query {:find [] + :in ['$ ] + :where []} + :args [db]} - (:sort-by args) (add-sorter-field {"client" ['[?e :transaction/client ?c] - '[?c :client/name ?sorter]] - "account" ['[?e :transaction/date] - '(or-join [?e ?sorter] - (and [?e :transaction/account ?c] - [?c :account/name ?sorter]) - (and - (not [?e :transaction/account]) - [(ground "") ?sorter]))] - "description-original" ['[?e :transaction/description-original ?sorter]] - "date" ['[?e :transaction/date ?sorter]] - "vendor" ['[?e :transaction/vendor ?v] - '[?v :vendor/name ?sorter]] - "amount" ['[?e :transaction/amount ?sorter]] - "status" ['[?e :transaction/status ?sorter]]} - args) + (:sort-by args) (add-sorter-field {"client" ['[?e :transaction/client ?c] + '[?c :client/name ?sorter]] + "account" ['[?e :transaction/date] + '(or-join [?e ?sorter] + (and [?e :transaction/account ?c] + [?c :account/name ?sorter]) + (and + (not [?e :transaction/account]) + [(ground "") ?sorter]))] + "description-original" ['[?e :transaction/description-original ?sorter]] + "date" ['[?e :transaction/date ?sorter]] + "vendor" ['[?e :transaction/vendor ?v] + '[?v :vendor/name ?sorter]] + "amount" ['[?e :transaction/amount ?sorter]] + "status" ['[?e :transaction/status ?sorter]]} + args) - (limited-clients (:id args)) - (merge-query {:query {:in ['[?xx ...]] - :where ['[?e :transaction/client ?xx]]} - :args [(set (map :db/id (limited-clients (: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))))]}) - (:bank-account-id args) - (merge-query {:query {:in ['?bank-account-id] - :where ['[?e :transaction/bank-account ?bank-account-id]]} - :args [(:bank-account-id args)]}) + (:bank-account-id args) + (merge-query {:query {:in ['?bank-account-id] + :where ['[?e :transaction/bank-account ?bank-account-id]]} + :args [(:bank-account-id args)]}) - (:client-id args) - (merge-query {:query {:in ['?client-id] - :where ['[?e :transaction/client ?client-id]]} - :args [(:client-id args)]}) + (:client-id args) + (merge-query {:query {:in ['?client-id] + :where ['[?e :transaction/client ?client-id]]} + :args [(:client-id args)]}) - (:vendor-id args) - (merge-query {:query {:in ['?vendor-id] - :where ['[?e :transaction/vendor ?vendor-id]]} - :args [(:vendor-id args)]}) + (:vendor-id args) + (merge-query {:query {:in ['?vendor-id] + :where ['[?e :transaction/vendor ?vendor-id]]} + :args [(:vendor-id args)]}) - - (:amount-gte args) - (merge-query {:query {:in ['?amount-gte] - :where ['[?e :transaction/amount ?a] - '[(>= ?a ?amount-gte)]]} - :args [(:amount-gte args)]}) + + (:amount-gte args) + (merge-query {:query {:in ['?amount-gte] + :where ['[?e :transaction/amount ?a] + '[(>= ?a ?amount-gte)]]} + :args [(:amount-gte args)]}) - (:amount-lte args) - (merge-query {:query {:in ['?amount-lte] - :where ['[?e :transaction/amount ?a] - '[(<= ?a ?amount-lte)]]} - :args [(:amount-lte args)]}) + (:amount-lte args) + (merge-query {:query {:in ['?amount-lte] + :where ['[?e :transaction/amount ?a] + '[(<= ?a ?amount-lte)]]} + :args [(:amount-lte args)]}) - (:start (:date-range args)) - (merge-query {:query {:in ['?start-date] - :where ['[?e :transaction/date ?date] - '[(>= ?date ?start-date)]]} - :args [(coerce/to-date (:start (:date-range args)))]}) + (:start (:date-range args)) + (merge-query {:query {:in ['?start-date] + :where ['[?e :transaction/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 :transaction/date ?date] - '[(<= ?date ?end-date)]]} - :args [(coerce/to-date (:end (:date-range args)))]}) + (:end (:date-range args)) + (merge-query {:query {:in ['?end-date] + :where ['[?e :transaction/date ?date] + '[(<= ?date ?end-date)]]} + :args [(coerce/to-date (:end (:date-range args)))]}) - (:approval-status args) - (merge-query {:query {:in ['?approval-status] - :where ['[?e :transaction/approval-status ?approval-status]]} - :args [(:approval-status args)]}) + (:approval-status args) + (merge-query {:query {:in ['?approval-status] + :where ['[?e :transaction/approval-status ?approval-status]]} + :args [(:approval-status args)]}) - (:client-code args) - (merge-query {:query {:in ['?client-code] - :where ['[?e :transaction/client ?client-id] - '[?client-id :client/code ?client-code]]} - :args [(:client-code args)]}) - - (:original-id args) - (merge-query {:query {:in ['?original-id] - :where ['[?e :transaction/client ?c] - '[?c :client/original-id ?original-id]]} - :args [(:original-id args)]}) + (:client-code args) + (merge-query {:query {:in ['?client-code] + :where ['[?e :transaction/client ?client-id] + '[?client-id :client/code ?client-code]]} + :args [(:client-code args)]}) + + (:original-id args) + (merge-query {:query {:in ['?original-id] + :where ['[?e :transaction/client ?c] + '[?c :client/original-id ?original-id]]} + :args [(:original-id args)]}) - (:description args) - (merge-query {:query {:in ['?description] - :where ['[?e :transaction/description-original ?do] - '[(.contains ?do ?description)]]} - :args [(:description args)]}) + (:description args) + (merge-query {:query {:in ['?description] + :where ['[?e :transaction/description-original ?do] + '[(.contains ?do ?description)]]} + :args [(:description args)]}) - true - (merge-query {:query {:find ['?base-date '?e] :where ['[?e :transaction/id] - '[?e :transaction/date ?base-date]]}}))] - (cond->> query - true (d/query) - true (apply-sort-2 args [:desc :asc]) - true (apply-pagination args)))) + true + (merge-query {:query {:find ['?base-date '?e] :where ['[?e :transaction/id] + '[?e :transaction/date ?base-date]]}}))] + (cond->> query + true (d/query) + true (apply-sort-2 args [:desc :asc]) + true (apply-pagination args))))) (defn graphql-results [ids db args] (let [results (->> (d/pull-many db '[* {:transaction/client [:client/name :db/id :client/code] @@ -160,3 +162,12 @@ (update :transaction/date c/from-date) (update :transaction/post-date c/from-date) (dissoc :transaction/id))) + +(defn unapprove [ids] + (doseq [x (partition-all 1000 ids)] + @(d/transact (d/connect uri) + (doto (mapv (fn [i] + {:db/id i + :transaction/approval-status :transaction-approval-status/unapproved}) + x) + println)))) diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index f9c877a9..3e2f648d 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -611,6 +611,21 @@ :args {:invoices {:type '(list :id)}} :resolve :mutation/approve-invoices} + :unapprove_transactions {:type '(list :transaction_page) + :args {:client_id {:type :id} + :vendor_id {:type :id} + :bank_account_id {:type :id} + :date_range {:type :date_range} + :amount_lte {:type :money} + :amount_gte {:type :money} + :description {:type 'String} + :start {:type 'Int} + :sort_by {:type 'String} + :asc {:type 'Boolean} + :approval_status {:type :transaction_approval_status}} + + :resolve :mutation/unapprove-transactions} + :merge_vendors {:type :id :args {:from {:type :id} :to {:type :id}} @@ -844,6 +859,7 @@ :mutation/add-and-print-invoice gq-invoices/add-and-print-invoice :mutation/edit-invoice gq-invoices/edit-invoice :mutation/edit-transaction gq-transactions/edit-transaction + :mutation/unapprove-transactions gq-transactions/unapprove-transactions :mutation/upsert-transaction-rule gq-transaction-rules/upsert-transaction-rule :test-transaction-rule gq-transaction-rules/test-transaction-rule :run-transaction-rule gq-transaction-rules/run-transaction-rule diff --git a/src/clj/auto_ap/graphql/transactions.clj b/src/clj/auto_ap/graphql/transactions.clj index a35e06d2..3bb525bb 100644 --- a/src/clj/auto_ap/graphql/transactions.clj +++ b/src/clj/auto_ap/graphql/transactions.clj @@ -39,6 +39,16 @@ :start (:start args 0) :end (+ (:start args 0) (count transactions))}])) +(defn unapprove-transactions [context args value] + (let [args (assoc args :id (:id context)) + ids (:ids (d-transactions/raw-graphql-ids (update (<-graphql args) :approval-status + #(some->> % + name + snake->kebab + (keyword "transaction-approval-status")))))] + (d-transactions/unapprove ids) + (get-transaction-page context args value))) + (defn transaction-account->entity [{:keys [id account_id amount location]}] (remove-nils #:transaction-account {:amount (Double/parseDouble amount) :db/id id diff --git a/src/cljs/auto_ap/views/pages/transactions.cljs b/src/cljs/auto_ap/views/pages/transactions.cljs index 17027a70..a1b417e6 100644 --- a/src/cljs/auto_ap/views/pages/transactions.cljs +++ b/src/cljs/auto_ap/views/pages/transactions.cljs @@ -65,6 +65,27 @@ :end]]]} :on-success [::received]}})) +(re-frame/reg-event-fx + ::unapprove-all + (fn [cofx [_ params]] + + {:db (-> (:db cofx) + (assoc-in [:status :loading] true) + (assoc-in [::params] params)) + :graphql {:token (-> cofx :db :user) + :query-obj + {:venia/operation {:operation/type :mutation + :operation/name "UnapproveTransactions"} + :venia/queries [{:query/data + [:unapprove-transactions + (assoc (::params (:db cofx)) :client-id (:id @(re-frame/subscribe [::subs/client]))) + [[:transactions transaction-read] + :total + :start + :end]]}]} + + :on-success [::received]}})) + (re-frame/reg-event-db ::received (fn [db [_ data]] @@ -161,7 +182,9 @@ [:div.is-pulled-right [:div.buttons [:button.button.is-outlined.is-primary {:on-click (dispatch-event [::manual/opening])} - "Manual Yodlee Import"]]]]) + "Manual Yodlee Import"] + [:button.button.is-outlined.is-danger {:on-click (dispatch-event [::unapprove-all])} + "Unapprove all"]]]]) [table/table {:id :transactions :params (re-frame/subscribe [::params]) :transaction-page (re-frame/subscribe [::transaction-page])