Complete expense-account field

This commit is contained in:
Bryce Covert
2019-04-17 09:34:08 -07:00
parent b3e407d211
commit 30a6ac99c9
2 changed files with 40 additions and 53 deletions

View File

@@ -51,6 +51,12 @@
:invoice/client client_id})) :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.")})))) (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}] (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) (let [vendor (d-vendors/get-by-id vendor_id)
account (:vendor/default-account vendor) account (:vendor/default-account vendor)
@@ -65,13 +71,22 @@
:invoice/outstanding-balance total :invoice/outstanding-balance total
:invoice/status :invoice-status/unpaid :invoice/status :invoice-status/unpaid
:invoice/date (coerce/to-date date) :invoice/date (coerce/to-date date)
:invoice/expense-accounts (map (fn [ea] :invoice/expense-accounts (map expense-account->entity
(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))}))
expense_accounts)})) 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] (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-no-conflicting in)
(assert-can-see-client (:id context) client_id) (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] (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) (let [invoice (d-invoices/get-by-id id)
_ (when (seq (doto (d-invoices/find-conflicting {:db/id id _ (when (seq (doto (d-invoices/find-conflicting {:db/id id
:invoice/invoice-number invoice_number :invoice/invoice-number invoice_number
:invoice/vendor (:db/id (:invoice/vendor invoice)) :invoice/vendor (:db/id (:invoice/vendor invoice))
@@ -114,18 +126,18 @@
(throw (ex-info error {:validation-error error})))) (throw (ex-info error {:validation-error error}))))
paid-amount (- (:invoice/total invoice) (:invoice/outstanding-balance invoice)) paid-amount (- (:invoice/total invoice) (:invoice/outstanding-balance invoice))
_ (assert-can-see-client (:id context) (:db/id (:invoice/client invoice))) _ (assert-can-see-client (:id context) (:db/id (:invoice/client invoice)))
updated-invoice (d-invoices/update {:db/id id deleted (deleted-expense-accounts invoice expense_accounts)
:invoice/invoice-number invoice_number
:invoice/date (coerce/to-date (parse date iso-date)) updated-invoice {:db/id id
:invoice/total total :invoice/invoice-number invoice_number
:invoice/outstanding-balance (- total paid-amount) :invoice/date (coerce/to-date (parse date iso-date))
:invoice/expense-accounts (map (fn [ea] :invoice/total total
(remove-nils {:db/id (:id ea) :invoice/outstanding-balance (- total paid-amount)
:invoice-expense-account/location (:location ea) :invoice/expense-accounts (map expense-account->entity
:invoice-expense-account/account (:account_id ea) expense_accounts)}]
:invoice-expense-account/amount (Double/parseDouble (:amount ea))})) @(d/transact (d/connect uri) (concat [updated-invoice]
expense_accounts)})] (map (fn [d] [:db/retract id :invoice/expense-accounts d]) deleted)))
(-> updated-invoice (-> (d-invoices/get-by-id id)
(->graphql)))) (->graphql))))
(defn void-invoice [context {id :invoice_id} value] (defn void-invoice [context {id :invoice_id} value]
@@ -173,42 +185,18 @@
(-> (d-invoices/get-by-id id) (-> (d-invoices/get-by-id id)
(->graphql)))) (->graphql))))
(defn edit-expense-accounts [context args value] (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))))) (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))) (let [invoice-id (:invoice_id args)
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) @(d/transact (d/connect uri) (concat [updated]
(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
(map (fn [d] [:db/retract invoice-id :invoice/expense-accounts d])deleted))) (map (fn [d] [:db/retract invoice-id :invoice/expense-accounts d])deleted)))
(->graphql (->graphql
(d-invoices/get-by-id (:invoice_id args))))) (d-invoices/get-by-id (:invoice_id args)))))

View File

@@ -24,7 +24,6 @@
::can-submit-edit-invoice ::can-submit-edit-invoice
:<- [::forms/form ::form] :<- [::forms/form ::form]
(fn [{:keys [data status]} _] (fn [{:keys [data status]} _]
(println (s/explain-data ::invoice/invoice data))
(let [min-total (if (= (:total (:original data)) (:outstanding-balance (:original data))) (let [min-total (if (= (:total (:original data)) (:outstanding-balance (:original data)))
nil nil
(- (:total (:original data)) (:outstanding-balance (:original data))))] (- (:total (:original data)) (:outstanding-balance (:original data))))]