From 27f13ad38e8eaf16c1e752473eeb7a3d15a12cf7 Mon Sep 17 00:00:00 2001 From: BC Date: Wed, 13 Feb 2019 23:16:24 -0800 Subject: [PATCH] added ability to unvoid invoice --- src/clj/auto_ap/graphql.clj | 5 ++ src/clj/auto_ap/graphql/invoices.clj | 31 +++++++++ .../views/components/invoice_table.cljs | 15 +++-- .../auto_ap/views/pages/unpaid_invoices.cljs | 63 ++++++++++++------- 4 files changed, 86 insertions(+), 28 deletions(-) diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index 6239f25a..648720d8 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -379,6 +379,10 @@ :void_invoice {:type :invoice :args {:invoice_id {:type :id}} :resolve :mutation/void-invoice} + :unvoid_invoice {:type :invoice + :args {:invoice_id {:type :id}} + :resolve :mutation/unvoid-invoice} + :void_payment {:type :payment :args {:payment_id {:type :id}} :resolve :mutation/void-payment} @@ -483,6 +487,7 @@ :mutation/edit-client gq-clients/edit-client :mutation/upsert-vendor gq-vendors/upsert-vendor :mutation/void-invoice gq-invoices/void-invoice + :mutation/unvoid-invoice gq-invoices/unvoid-invoice :mutation/void-payment gq-checks/void-check :mutation/edit-expense-accounts gq-invoices/edit-expense-accounts :get-vendor get-vendor diff --git a/src/clj/auto_ap/graphql/invoices.clj b/src/clj/auto_ap/graphql/invoices.clj index 938831b3..a5ca1bd4 100644 --- a/src/clj/auto_ap/graphql/invoices.clj +++ b/src/clj/auto_ap/graphql/invoices.clj @@ -110,6 +110,36 @@ (->graphql)))) +(defn unvoid-invoice [context {id :invoice_id} value] + (let [invoice (d-invoices/get-by-id id) + _ (assert-can-see-client (:id context) (:db/id (:invoice/client invoice))) + conn (d/connect uri) + history (d/history (d/db conn)) + txs (d/query {:query {:find ['?tx '?e '?original-status '?original-outstanding '?total '?ea '?ea-amount] + :where ['[?e :invoice/status :invoice-status/voided ?tx true] + '[?e :invoice/status ?original-status ?tx false] + '[?e :invoice/outstanding-balance ?original-outstanding ?tx false] + '[?e :invoice/total ?total ?tx false] + '[?ea :invoice-expense-account/amount ?ea-amount ?tx false]] + :in ['$ '?e]} + :args [history id]}) + [last-transaction] (->> txs (sort-by first) (last))] + @(d/transact conn [(->> txs + (filter (fn [[tx]] (= tx last-transaction))) + (reduce (fn [new-transaction [_ entity original-status original-outstanding total expense-account expense-account-amount]] + (-> new-transaction + (assoc :db/id entity + :invoice/total total + :invoice/status original-status + :invoice/outstanding-balance original-outstanding) + + (update :invoice/expense-accounts conj {:db/id expense-account :invoice-expense-account/amount expense-account-amount})) + ) {}))]) + + (-> (d-invoices/get-by-id id) + (->graphql)))) + + (defn edit-expense-accounts [context args value] @@ -147,3 +177,4 @@ (->graphql (d-invoices/get-by-id (:invoice_id args))))) + diff --git a/src/cljs/auto_ap/views/components/invoice_table.cljs b/src/cljs/auto_ap/views/components/invoice_table.cljs index dc4034f7..754825fc 100644 --- a/src/cljs/auto_ap/views/components/invoice_table.cljs +++ b/src/cljs/auto_ap/views/components/invoice_table.cljs @@ -42,7 +42,7 @@ {:venia/queries [[:invoice_page (assoc params :client-id (:id @(re-frame/subscribe [::subs/client]))) - [[:invoices [:id :total :outstanding-balance :invoice-number :date + [[:invoices [:id :total :outstanding-balance :invoice-number :date :status [:vendor [:name :id]] [:expense_accounts [:amount :id :expense_account_id :location [:expense_account [:id :name :location [:parent [:id :name]]]]]] @@ -55,7 +55,7 @@ -(defn invoice-table [{:keys [id invoice-page status on-params-change vendors params check-boxes checked on-check-changed on-edit-invoice on-void-invoice expense-event]}] +(defn invoice-table [{:keys [id invoice-page status on-params-change vendors params check-boxes checked on-check-changed on-edit-invoice on-void-invoice on-unvoid-invoice expense-event]}] (let [visible-checks @(re-frame/subscribe [::visible-checks]) visible-expense-accounts @(re-frame/subscribe [::visible-expense-accounts]) selected-client @(re-frame/subscribe [::subs/client]) @@ -133,7 +133,7 @@ } ""]]] [:tbody - (println checked) + (if (:loading @status) [:tr [:td {:col-span 5} @@ -148,7 +148,7 @@ "checked" "") :on-change (fn [x e] (when on-check-changed - (println id i) + (on-check-changed id i)))} ]]) (when-not selected-client [:td (:name client)]) @@ -184,10 +184,13 @@ (when expense-event [:a.dropdown-item.is-primary {:on-click (dispatch-event (conj expense-event i))} "Change"])]]]) [:span {:style {:margin-left "1em"}}] - (when on-edit-invoice + + (when (and on-edit-invoice (not= ":voided" (:status i))) [:button.button {:on-click (fn [] (on-edit-invoice i))} [:span.icon [:i.fa.fa-pencil]]]) - (when (and on-void-invoice (= (:outstanding-balance i) (:total i))) + (when (and on-void-invoice (= (:outstanding-balance i) (:total i)) (not= ":voided" (:status i))) [:button.button.is-warning.is-outlined {:on-click (fn [] (on-void-invoice i))} [:span [:span.icon [:i.fa.fa-minus-circle]]]]) + (when (and on-unvoid-invoice (= ":voided" (:status i))) + [:button.button.is-outlined {:on-click (fn [] (on-unvoid-invoice i))} [:span [:span.icon [:i.fa.fa-undo]]]]) (when (seq payments) [:div.dropdown.is-right {:class (if (= id visible-checks) diff --git a/src/cljs/auto_ap/views/pages/unpaid_invoices.cljs b/src/cljs/auto_ap/views/pages/unpaid_invoices.cljs index cb73742d..75211376 100644 --- a/src/cljs/auto_ap/views/pages/unpaid_invoices.cljs +++ b/src/cljs/auto_ap/views/pages/unpaid_invoices.cljs @@ -26,7 +26,13 @@ [auto-ap.views.components.typeahead :refer [typeahead]] [auto-ap.subs :as subs] [auto-ap.events :as events])) - +(def invoice-read [:id :total :outstanding-balance :date :invoice-number :status + [:client [:id :name :locations]] + [:payments [:amount [:payment [:amount :s3_url :check_number ]]]] + [:vendor [:id :name]] + [:expense_accounts [:amount :id :expense_account_id + :location + [:expense_account [:id :name [:parent [:id :name]]]]]]]) (re-frame/reg-sub ::invoice-page (fn [db] @@ -172,7 +178,7 @@ :type type :bank_account_id bank-account-id :client_id client-id} - [[:invoices [:id :outstanding-balance [:payments [:amount [:payment [:amount :s3_url :check_number ]]]]]] + [[:invoices invoice-read] :pdf_url]]]}) (re-frame/reg-event-fx @@ -267,6 +273,8 @@ {:dispatch [::events/modal-status ::edit-invoice {:visible? true}] :db (assoc-in db [::edit-invoice] edit-invoice)}))) + + (re-frame/reg-event-fx ::create-invoice (fn [{:keys [db]} _] @@ -278,16 +286,12 @@ :venia/queries [{:query/data [:add-invoice {:invoice new-invoice} - [:id :total :outstanding-balance :date :invoice-number - [:client [:id :name :locations]] - [:vendor [:id :name]] - [:expense_accounts [:amount :id :expense_account_id - :location - [:expense_account [:id :name [:parent [:id :name]]]]]] - ]]}]} + invoice-read]}]} :on-success [::invoice-created] :on-error [::invoice-create-failed]}}))) + + (re-frame/reg-event-fx ::edit-invoice-save (fn [{:keys [db]} _] @@ -299,15 +303,22 @@ :venia/queries [{:query/data [:edit-invoice {:invoice {:id id :invoice-number invoice-number :date date :total total}} - [:id :total :outstanding-balance :date :invoice-number - [:client [:id :name :locations]] - [:vendor [:id :name]] - [:expense_accounts [:amount :id :expense_account_id - :location - [:expense_account [:id :name [:parent [:id :name]]]]]]]]}]} + invoice-read]}]} :on-success [::invoice-edited] :on-error [::invoice-edit-failed]}}))) +(re-frame/reg-event-fx + ::unvoid-invoice + (fn [{:keys [db]} [_ {id :id}]] + {:graphql + {:token (-> db :user) + :query-obj {:venia/operation {:operation/type :mutation + :operation/name "UnvoidInvoice"} + + :venia/queries [{:query/data [:unvoid-invoice + {:invoice-id id} + invoice-read]}]} + :on-success [::invoice-unvoided]}})) (re-frame/reg-event-fx ::void-invoice @@ -319,12 +330,7 @@ :venia/queries [{:query/data [:void-invoice {:invoice-id id} - [:id :total :outstanding-balance :date :invoice-number - [:client [:id :name :locations]] - [:vendor [:id :name]] - [:expense_accounts [:amount :id :expense_account_id - :location - [:expense_account [:id :name [:parent [:id :name]]]]]]]]}]} + invoice-read]}]} :on-success [::invoice-voided]}})) (re-frame/reg-event-fx @@ -343,7 +349,7 @@ :bank-account-id bank-account-id :invoice_id (:id invoice) } - [[:invoices [:id :outstanding-balance [:payments [:amount [:payment [:amount :s3_url :check_number ]]]]]]]]}]} + [[:invoices invoice-read]]]}]} :on-success [::handwrite-checks-succeeded]}}))) (re-frame/reg-event-fx @@ -394,6 +400,17 @@ (fn [{:keys [db]} [_ data]] {:dispatch [::events/modal-failed ::edit-invoice "That invoice already exists."]})) +(re-frame/reg-event-fx + ::invoice-unvoided + (fn [{:keys [db]} [_ {:keys [unvoid-invoice]}]] + {:db (-> db + (update-in [::invoice-page :invoices] + (fn [is] + (mapv (fn [i] + (if (= (:id i) (:id unvoid-invoice)) + (assoc unvoid-invoice :class "live-removed") + i)) is))))})) + (re-frame/reg-event-fx ::invoice-voided (fn [{:keys [db]} [_ {:keys [void-invoice]}]] @@ -787,6 +804,8 @@ :status (re-frame/subscribe [::subs/status]) :on-edit-invoice (fn [which] (re-frame/dispatch [::edit-invoice which])) + :on-unvoid-invoice (fn [which] + (re-frame/dispatch [::unvoid-invoice which])) :on-void-invoice (fn [which] (re-frame/dispatch [::void-invoice which]))