From 30a6ac99c90469df419443c0f88ba83714df4d94 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Wed, 17 Apr 2019 09:34:08 -0700 Subject: [PATCH] Complete expense-account field --- src/clj/auto_ap/graphql/invoices.clj | 92 ++++++++----------- .../auto_ap/views/pages/invoices/form.cljs | 1 - 2 files changed, 40 insertions(+), 53 deletions(-) diff --git a/src/clj/auto_ap/graphql/invoices.clj b/src/clj/auto_ap/graphql/invoices.clj index 625891a5..f68a934d 100644 --- a/src/clj/auto_ap/graphql/invoices.clj +++ b/src/clj/auto_ap/graphql/invoices.clj @@ -51,6 +51,12 @@ :invoice/client client_id})) (throw (ex-info (str "Invoice '" invoice_number "' already exists.") {:invoice-number invoice_number :validation-error (str "Invoice '" invoice_number "' already exists.")})))) +(defn expense-account->entity [{:keys [id account_id amount location]}] + (remove-nils #:invoice-expense-account {:amount (Double/parseDouble amount) + :db/id id + :account account_id + :location location})) + (defn add-invoice-transaction [{:keys [total invoice_number location client_id vendor_id vendor_name date expense_accounts] :as in}] (let [vendor (d-vendors/get-by-id vendor_id) account (:vendor/default-account vendor) @@ -65,13 +71,22 @@ :invoice/outstanding-balance total :invoice/status :invoice-status/unpaid :invoice/date (coerce/to-date date) - :invoice/expense-accounts (map (fn [ea] - (remove-nils {:db/id (:id ea) - :invoice-expense-account/account (:account_id ea) - :invoice-expense-account/location (:location ea) - :invoice-expense-account/amount (Double/parseDouble (:amount ea))})) + :invoice/expense-accounts (map expense-account->entity expense_accounts)})) + +(defn deleted-expense-accounts [invoice expense-accounts] + (let [current-expense-accounts (:invoice/expense-accounts invoice) + specified-ids (->> expense-accounts + (map :id) + set) + existing-ids (->> current-expense-accounts + (map :db/id) + set)] + (set/difference existing-ids specified-ids))) + + + (defn add-invoice [context {{:keys [total invoice_number location client_id vendor_id vendor_name date] :as in} :invoice} value] (assert-no-conflicting in) (assert-can-see-client (:id context) client_id) @@ -97,10 +112,7 @@ (defn edit-invoice [context {{:keys [id invoice_number total vendor_id date client_id expense_accounts] :as in} :invoice} value] - - (let [invoice (d-invoices/get-by-id id) - _ (when (seq (doto (d-invoices/find-conflicting {:db/id id :invoice/invoice-number invoice_number :invoice/vendor (:db/id (:invoice/vendor invoice)) @@ -114,18 +126,18 @@ (throw (ex-info error {:validation-error error})))) paid-amount (- (:invoice/total invoice) (:invoice/outstanding-balance invoice)) _ (assert-can-see-client (:id context) (:db/id (:invoice/client invoice))) - updated-invoice (d-invoices/update {:db/id id - :invoice/invoice-number invoice_number - :invoice/date (coerce/to-date (parse date iso-date)) - :invoice/total total - :invoice/outstanding-balance (- total paid-amount) - :invoice/expense-accounts (map (fn [ea] - (remove-nils {:db/id (:id ea) - :invoice-expense-account/location (:location ea) - :invoice-expense-account/account (:account_id ea) - :invoice-expense-account/amount (Double/parseDouble (:amount ea))})) - expense_accounts)})] - (-> updated-invoice + deleted (deleted-expense-accounts invoice expense_accounts) + + updated-invoice {:db/id id + :invoice/invoice-number invoice_number + :invoice/date (coerce/to-date (parse date iso-date)) + :invoice/total total + :invoice/outstanding-balance (- total paid-amount) + :invoice/expense-accounts (map expense-account->entity + expense_accounts)}] + @(d/transact (d/connect uri) (concat [updated-invoice] + (map (fn [d] [:db/retract id :invoice/expense-accounts d]) deleted))) + (-> (d-invoices/get-by-id id) (->graphql)))) (defn void-invoice [context {id :invoice_id} value] @@ -173,42 +185,18 @@ (-> (d-invoices/get-by-id id) (->graphql)))) - - - (defn edit-expense-accounts [context args value] - ;; TODO - Can expense account id be used as a unique field? It may compose with component, meaning - ;; that you don't have to figure out which ones to delete and which ones to add. Just set to 0. (assert-can-see-client (:id context) (:db/id (:invoice/client (d-invoices/get-by-id (:invoice_id args))))) - (let [current-expense-accounts (:invoice/expense-accounts (d-invoices/get-by-id (:invoice_id args))) - invoice-id (:invoice_id args) + (let [invoice-id (:invoice_id args) + invoice (d-invoices/get-by-id invoice-id) + deleted (deleted-expense-accounts invoice (:expense_accounts args)) + updated {:db/id invoice-id + :invoice/expense-accounts (map + expense-account->entity + (:expense_accounts args))}] - specified-ids (->> (:expense_accounts args) - (map :id) - set) - - existing-ids (->> current-expense-accounts - (map :db/id) - set) - - deleted (set/difference existing-ids specified-ids) - updated (map - (fn [{:keys [id account_id amount location]}] - {:db/id invoice-id - :invoice/expense-accounts [#:invoice-expense-account { - :amount (Double/parseDouble amount) - :db/id id - :account account_id - :location location} - ]} - ) - (:expense_accounts args))] - - - @(d/transact (d/connect uri) (concat updated + @(d/transact (d/connect uri) (concat [updated] (map (fn [d] [:db/retract invoice-id :invoice/expense-accounts d])deleted))) - - (->graphql (d-invoices/get-by-id (:invoice_id args))))) diff --git a/src/cljs/auto_ap/views/pages/invoices/form.cljs b/src/cljs/auto_ap/views/pages/invoices/form.cljs index 7c2e672b..c62e5682 100644 --- a/src/cljs/auto_ap/views/pages/invoices/form.cljs +++ b/src/cljs/auto_ap/views/pages/invoices/form.cljs @@ -24,7 +24,6 @@ ::can-submit-edit-invoice :<- [::forms/form ::form] (fn [{:keys [data status]} _] - (println (s/explain-data ::invoice/invoice data)) (let [min-total (if (= (:total (:original data)) (:outstanding-balance (:original data))) nil (- (:total (:original data)) (:outstanding-balance (:original data))))]