Complete expense-account field
This commit is contained in:
@@ -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)))))
|
||||
|
||||
|
||||
@@ -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))))]
|
||||
|
||||
Reference in New Issue
Block a user