Improvements on validations
This commit is contained in:
@@ -1,24 +1,28 @@
|
||||
(ns auto-ap.graphql.transactions
|
||||
(:require [auto-ap.graphql.utils :refer [->graphql <-graphql assert-can-see-client assert-admin ident->enum-f snake->kebab enum->keyword]]
|
||||
[auto-ap.datomic.transactions :as d-transactions]
|
||||
[auto-ap.datomic.vendors :as d-vendors]
|
||||
(:require [auto-ap.datomic
|
||||
:refer
|
||||
[audit-transact audit-transact-batch conn remove-nils]]
|
||||
[auto-ap.datomic.accounts :as a]
|
||||
[auto-ap.datomic.checks :as d-checks]
|
||||
[auto-ap.datomic.transaction-rules :as tr]
|
||||
[auto-ap.datomic.transactions :as d-transactions]
|
||||
[auto-ap.graphql.transaction-rules :as g-tr]
|
||||
[datomic.api :as d]
|
||||
[auto-ap.datomic :refer [uri remove-nils audit-transact audit-transact-batch]]
|
||||
[com.walmartlabs.lacinia :refer [execute]]
|
||||
[com.walmartlabs.lacinia.executor :as executor]
|
||||
[com.walmartlabs.lacinia.resolve :as resolve]
|
||||
[auto-ap.utils :refer [by dollars=]]
|
||||
[auto-ap.time :refer [parse normal-date]]
|
||||
[auto-ap.datomic.clients :as d-clients]
|
||||
[auto-ap.graphql.utils
|
||||
:refer
|
||||
[->graphql
|
||||
<-graphql
|
||||
assert-admin
|
||||
assert-can-see-client
|
||||
enum->keyword
|
||||
ident->enum-f
|
||||
snake->kebab]]
|
||||
[auto-ap.rule-matching :as rm]
|
||||
[auto-ap.utils :refer [dollars=]]
|
||||
[clj-time.coerce :as coerce]
|
||||
[clojure.set :as set]
|
||||
[clojure.string :as str]
|
||||
[auto-ap.datomic.accounts :as a]
|
||||
[auto-ap.datomic.transaction-rules :as tr]
|
||||
[auto-ap.rule-matching :as rm]
|
||||
[clj-time.coerce :as coerce]
|
||||
[clojure.tools.logging :as log]))
|
||||
[clojure.tools.logging :as log]
|
||||
[datomic.api :as d]))
|
||||
|
||||
(def approval-status->graphql (ident->enum-f :transaction/approval-status))
|
||||
|
||||
@@ -93,9 +97,33 @@
|
||||
set)]
|
||||
(set/difference existing-ids specified-ids)))
|
||||
|
||||
(defn assert-valid-expense-accounts [accounts]
|
||||
(doseq [trans-account accounts
|
||||
:let [account (d/entity (d/db conn) (:account_id trans-account))]]
|
||||
(when (empty? (:location trans-account))
|
||||
(throw (ex-info "Account is missing location" {:validation-error "Account is missing location"})))
|
||||
|
||||
(when (and (not (empty? (:account/location account)))
|
||||
(not= (:location trans-account)
|
||||
(:account/location account)))
|
||||
(let [err (str "Account uses location '" (:location trans-account) "' but expects '" (:account/location account) "'")]
|
||||
(throw (ex-info err
|
||||
{:validation-error err}))))
|
||||
|
||||
(when (and (empty? (:account/location account))
|
||||
(= "A" (:location trans-account)))
|
||||
(let [err (str "Account uses location '" (:location trans-account) "', which is reserved for liabilities, equities, and assets.")]
|
||||
(throw (ex-info err
|
||||
{:validation-error err}))))
|
||||
|
||||
|
||||
(when (nil? (:account_id trans-account))
|
||||
(throw (ex-info "Account is missing account" {:validation-error "Account is missing account"})))))
|
||||
|
||||
(defn edit-transaction [context {{:keys [id accounts vendor_id approval_status forecast_match] :as transaction} :transaction} value]
|
||||
(let [existing-transaction (d-transactions/get-by-id id)
|
||||
_ (assert-can-see-client (:id context) (:transaction/client existing-transaction) )
|
||||
_ (assert-valid-expense-accounts accounts)
|
||||
deleted (deleted-accounts existing-transaction accounts)
|
||||
account-total (reduce + 0 (map (fn [x] (Double/parseDouble (:amount x))) accounts))
|
||||
missing-locations (seq (set/difference
|
||||
|
||||
Reference in New Issue
Block a user