From 85a47ee54d6dc161040a5b97e0e0b2d7794e9d8f Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Wed, 16 Feb 2022 08:19:25 -0800 Subject: [PATCH] cash payments add transactions --- src/clj/auto_ap/graphql/checks.clj | 55 ++++++++++++++++++++---------- src/clj/auto_ap/import/intuit.clj | 2 +- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/clj/auto_ap/graphql/checks.clj b/src/clj/auto_ap/graphql/checks.clj index 66f6ea7b..2dcedcbb 100644 --- a/src/clj/auto_ap/graphql/checks.clj +++ b/src/clj/auto_ap/graphql/checks.clj @@ -2,6 +2,7 @@ (:require [amazonica.aws.s3 :as s3] [auto-ap.datomic :refer [audit-transact remove-nils]] + [auto-ap.datomic.accounts :as a] [auto-ap.datomic.bank-accounts :as d-bank-accounts] [auto-ap.datomic.checks :as d-checks] [auto-ap.datomic.clients :as d-clients] @@ -22,7 +23,8 @@ [clojure.set :as set] [clojure.string :as str] [com.walmartlabs.lacinia.util :refer [attach-resolvers]] - [config.core :refer [env]]) + [config.core :refer [env]] + [digest]) (:import (java.io ByteArrayOutputStream) (java.text DecimalFormat) @@ -203,8 +205,7 @@ :content-type "application/pdf"}) (str "http://" (:data-bucket env) ".s3-website-us-east-1.amazonaws.com/merged-checks/" uuid ".pdf"))) - - +#_{:clj-kondo/ignore [:unused-binding]} (defmulti invoices->entities (fn [invoices vendor-id client bank-account type index invoice-amounts] type)) (defn invoice-payments [invoices invoice-amounts] @@ -216,7 +217,7 @@ [:pay (:db/id invoice) invoice-amount]]) (reduce into []))) -(defn base-payment [invoices vendor client bank-account type index invoice-amounts] +(defn base-payment [invoices vendor client bank-account _ _ invoice-amounts] {:db/id (str (:db/id vendor)) :payment/bank-account (:db/id bank-account) :payment/amount (reduce + 0 (map (comp invoice-amounts :db/id) invoices)) @@ -315,16 +316,34 @@ 0.001) (throw (ex-info "The selected invoices do not have an outstanding balance." {:validation-error "The selected invoices do not have an outstanding balance."}))) - (let [payment (assoc (base-payment invoices vendor client bank-account type index invoice-amounts) + (let [base-payment (base-payment invoices vendor client bank-account type index invoice-amounts) + transaction-id (str (UUID/randomUUID)) + memo (str "Cash Invoice #'s: " + (str/join ", " + (map (fn [i] + (str (:invoice/invoice-number i) "(" (invoice-amounts (:db/id i)) ")")) + invoices))) + payment (assoc base-payment :payment/type :payment-type/cash - :payment/memo (str "Cash Invoice #'s: " - (str/join ", " - (map (fn [i] - (str (:invoice/invoice-number i) "(" (invoice-amounts (:db/id i)) ")")) - invoices))) - :payment/status :payment-status/cleared)] + :payment/memo memo + :payment/status :payment-status/cleared) + transaction {:db/id (str "transaction-" (:db/id vendor)) + :transaction/amount (:payment/amount base-payment) + :transaction/payment (str (:db/id vendor)) + :transaction/client (:db/id client) + :transaction/bank-account (:db/id bank-account) + :transaction/id #_{:clj-kondo/ignore [:unresolved-var]} (digest/sha-256 transaction-id) + :transaction/raw-id transaction-id + :transaction/vendor (:db/id vendor) + :transaction/description-original memo + :transaction/date (:payment/date base-payment) + :transaction/approval-status :transaction-approval-status/approved + :transaction/accounts [{:transaction-account/account (:db/id (a/get-account-by-numeric-code-and-sets 21000 ["default"])) + :transaction-account/location "A" + :transaction-account/amount (Math/abs (:payment/amount base-payment))}]}] (-> [] (conj payment) + (conj transaction) (into (invoice-payments invoices invoice-amounts))))) (defn validate-belonging [client-id invoices bank-account] @@ -373,7 +392,7 @@ (merge-pdfs (filter identity (map :payment/s3-key checks))) nil)})) -(defn get-payment-page [context args value] +(defn get-payment-page [context args _] (let [args (assoc args :id (:id context)) [payments checks-count] (d-checks/get-graphql (-> args (<-graphql) @@ -393,16 +412,16 @@ :start (:start args 0) :end (+ (:start args 0) (count payments))}])) -(defn get-potential-payments [context args value] +(defn get-potential-payments [context args _] (let [transaction (d-transactions/get-by-id (:transaction_id args)) _ (assert-can-see-client (:id context) (:transaction/client transaction)) - [payments payments-count] (d-checks/get-graphql {:client-id (:db/id (:transaction/client transaction)) + [payments _] (d-checks/get-graphql {:client-id (:db/id (:transaction/client transaction)) :bank-account-id (:db/id (:transaction/bank-account transaction)) :amount (- (:transaction/amount transaction)) :status :payment-status/pending})] (map ->graphql payments))) -(defn add-handwritten-check [context args value] +(defn add-handwritten-check [context args _] (let [invoices (d-invoices/get-multi (map :invoice_id (:invoice_payments args))) bank-account-id (:bank_account_id args) bank-account (d-bank-accounts/get-by-id bank-account-id) @@ -431,7 +450,7 @@ :invoices (d-invoices/get-multi (map :invoice_id (:invoice_payments args)))}))) -(defn void-check [context {id :payment_id} value] +(defn void-check [context {id :payment_id} _] (let [check (d-checks/get-by-id id)] (assert (or (= :payment-status/pending (:payment/status check)) (#{:payment-type/cash :payment-type/debit} (:payment/type check)))) @@ -457,13 +476,13 @@ (-> (d-checks/get-by-id id) (->graphql)))) -(defn get-all-payments [context args value] +(defn get-all-payments [context args _] (assert-admin (:id context)) (map ->graphql (first (d-checks/get-graphql (assoc (<-graphql args) :count Integer/MAX_VALUE))))) -(defn print-checks [context args value] +(defn print-checks [context args _] (assert-can-see-client (:id context) (:client_id args)) (->graphql diff --git a/src/clj/auto_ap/import/intuit.clj b/src/clj/auto_ap/import/intuit.clj index 7af9851d..61499ff7 100644 --- a/src/clj/auto_ap/import/intuit.clj +++ b/src/clj/auto_ap/import/intuit.clj @@ -92,5 +92,5 @@ :stop (scheduler/stop import-worker)) (mount/defstate account-worker - :start (scheduler/every (* 1000 60 60 24) upsert-accounts) + :start (scheduler/every (* 1000 60 30) upsert-accounts) :stop (scheduler/stop account-worker))