Improvements on validations

This commit is contained in:
Bryce Covert
2020-10-07 07:51:27 -07:00
parent 71fc8f69eb
commit 84eedbf56f
3 changed files with 172 additions and 116 deletions

View File

@@ -9,10 +9,11 @@
[auto-ap.time :refer [parse iso-date]]
[auto-ap.utils :refer [dollars=]]
[datomic.api :as d]
[auto-ap.datomic :refer [uri remove-nils audit-transact]]
[auto-ap.datomic :refer [uri remove-nils audit-transact conn]]
[clj-time.coerce :as coerce]
[clj-time.core :as time]
[clojure.set :as set]))
[clojure.set :as set]
[clojure.tools.logging :as log]))
(defn get-invoice-page [context args value]
@@ -51,6 +52,8 @@
(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
@@ -90,16 +93,37 @@
set)]
(set/difference existing-ids specified-ids)))
(defn assert-valid-expense-accounts [expense_accounts]
(doseq [expense-account expense_accounts
:let [account (d/entity (d/db conn) (:account_id expense-account))]]
(log/info "ACCOUNT" (:account/location account) )
(when (empty? (:location expense-account))
(throw (ex-info "Expense account is missing location" {:validation-error "Expense account is missing location"})))
(when (and (not (empty? (:account/location account)))
(not= (:location expense-account)
(:account/location account)))
(let [err (str "Account uses location '" (:location expense-account) "' but expects '" (:account/location account) "'")]
(throw (ex-info err
{:validation-error err}))))
(when (and (empty? (:account/location account))
(= "A" (:location expense-account)))
(let [err (str "Account uses location '" (:location expense-account) "', which is reserved for liabilities, equities, and assets.")]
(throw (ex-info err
{:validation-error err}))))
(when (nil? (:account_id expense-account))
(throw (ex-info "Expense account is missing account" {:validation-error "Expense account is missing account"})))))
(defn add-invoice [context {{:keys [total expense_accounts 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)
(doseq [expense-account expense_accounts]
(when (empty? (:location expense-account))
(throw (ex-info "Expense account is missing location" {:validation-error "Expense account is missing location"})))
(when (nil? (:account_id expense-account))
(throw (ex-info "Expense account is missing account" {:validation-error "Expense account is missing account"}))))
(assert-valid-expense-accounts expense_accounts)
(let [transaction-result (audit-transact [(add-invoice-transaction in)] (:id context))]
(-> (d-invoices/get-by-id (get-in transaction-result [:tempids "invoice"]))
(->graphql))))
@@ -112,6 +136,7 @@
(assert-no-conflicting in)
(assert-can-see-client (:id context) client_id)
(assert-bank-account-belongs client_id bank-account-id)
(assert-valid-expense-accounts (:expense_accounts in))
(let [transaction-result (audit-transact [(add-invoice-transaction in)] (:id context))]
(-> (gq-checks/print-checks [{:invoice-id (get-in transaction-result [:tempids "invoice"])
:amount total}]
@@ -137,6 +162,8 @@
paid-amount (- (:invoice/total invoice) (:invoice/outstanding-balance invoice))
_ (assert-can-see-client (:id context) (:db/id (:invoice/client invoice)))
deleted (deleted-expense-accounts invoice expense_accounts)
_ (assert-valid-expense-accounts expense_accounts)
updated-invoice (cond-> {:db/id id
:invoice/invoice-number invoice_number