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