From dc44233640195bf8abee06ef020cc849d18c0ad5 Mon Sep 17 00:00:00 2001 From: Bryce Date: Wed, 25 Sep 2024 08:36:45 -0700 Subject: [PATCH] Adds uploaded by for invoices, fixes REEL Produce, adds Mani Produce --- resources/schema.edn | 4 +++ src/clj/auto_ap/parse.clj | 3 +- src/clj/auto_ap/parse/templates.clj | 50 +++++++++++++++----------- src/clj/auto_ap/ssr/invoice/common.clj | 1 + src/clj/auto_ap/ssr/invoice/import.clj | 12 ++++--- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/resources/schema.edn b/resources/schema.edn index 6aeadeee..579a2545 100644 --- a/resources/schema.edn +++ b/resources/schema.edn @@ -677,6 +677,10 @@ :db/cardinality #:db{:ident :db.cardinality/one}, :db/doc "A vendor-specified number for the invoice", :db/ident :invoice/invoice-number} +{:db/valueType :db.type/ref, + :db/cardinality :db.cardinality/one, + :db/doc "Who uploaded the invoice?", + :db/ident :invoice/uploader} {:db/valueType #:db{:ident :db.type/string}, :db/cardinality #:db{:ident :db.cardinality/one}, :db/doc "An identifier found to suggest the customer", diff --git a/src/clj/auto_ap/parse.clj b/src/clj/auto_ap/parse.clj index 5283ba39..f2435f5e 100644 --- a/src/clj/auto_ap/parse.clj +++ b/src/clj/auto_ap/parse.clj @@ -199,5 +199,4 @@ (println v) (map (fn [x] (dissoc x :full-text :text)) - (parse v))) - + (parse v))) \ No newline at end of file diff --git a/src/clj/auto_ap/parse/templates.clj b/src/clj/auto_ap/parse/templates.clj index 39cf9562..d8f4ee10 100644 --- a/src/clj/auto_ap/parse/templates.clj +++ b/src/clj/auto_ap/parse/templates.clj @@ -1,5 +1,6 @@ (ns auto-ap.parse.templates (:require [auto-ap.parse.util :as u] + [auto-ap.logging :as alog] [clojure.string :as str])) @@ -700,8 +701,16 @@ :total [:trim-commas-and-negate nil]} :multi #"\n" :multi-match? #"^\s*Invoice\s{2,}"} + {:vendor "Mani Imports" + :keywords [#"Mani Imports"] + :extract {:date #"Order Date\s+([0-9]+/[0-9]+/[0-9]+)" + :customer-identifier #"Ship To:\s*(.*?)\n" + :invoice-number #"Invoice Number:\s+(.*?)\n" + :total #"Invoice Total:\s+([\d\-,]+\.\d{2,2}+)"} + :parser {:date [:clj-time "MM/dd/yyyy"] + :total [:trim-commas-and-negate nil]} } {:vendor "Reel Produce" - :keywords [#"REEL Produce, Inc" #"Statement"] + :keywords [#"REEL Produce, Inc" #"Statem"] :extract {:date #"\s*([0-9]+/[0-9]+/[0-9]+)" :customer-identifier #"To:\s*\n\s+(.*?)\s{2,}" :invoice-number #"INV #(\d+)" @@ -749,22 +758,23 @@ {:vendor "Daylight Foods" :keywords [#"CUSTNO"] :extract (fn [sheet vendor] - (transduce (comp - (drop 1) - (filter - (fn [r] - (and - (seq r) - (->> r first not-empty)))) - (map - (fn [[customer-number _ _ _ invoice-number date amount :as row]] - {:customer-identifier customer-number - :text (str/join " " row) - :full-text (str/join " " row) - :date (u/parse-value :clj-time "MM/dd/yyyy" (str/trim date)) - :invoice-number invoice-number - :total (str amount) - :vendor-code vendor}))) - conj - [] - sheet))}]) + (alog/peek ::daylight-invoices + (transduce (comp + (drop 1) + (filter + (fn [r] + (and + (seq r) + (->> r first not-empty)))) + (map + (fn [[customer-number _ _ _ invoice-number date amount :as row]] + {:customer-identifier customer-number + :text (str/join " " row) + :full-text (str/join " " row) + :date (u/parse-value :clj-time "MM/dd/yyyy" (str/trim date)) + :invoice-number invoice-number + :total (str amount) + :vendor-code vendor}))) + conj + [] + sheet)))}]) diff --git a/src/clj/auto_ap/ssr/invoice/common.clj b/src/clj/auto_ap/ssr/invoice/common.clj index 7bbbaa3e..3081deb0 100644 --- a/src/clj/auto_ap/ssr/invoice/common.clj +++ b/src/clj/auto_ap/ssr/invoice/common.clj @@ -3,6 +3,7 @@ (def default-read '[:db/id :invoice/invoice-number :invoice/total + { :invoice/uploader [:user/name]} :invoice/outstanding-balance :invoice/source-url :invoice/location diff --git a/src/clj/auto_ap/ssr/invoice/import.clj b/src/clj/auto_ap/ssr/invoice/import.clj index 604d8896..b55ca284 100644 --- a/src/clj/auto_ap/ssr/invoice/import.clj +++ b/src/clj/auto_ap/ssr/invoice/import.clj @@ -489,8 +489,11 @@ (and (= (count (:clients args)) 1) (= 1 (count (:client/locations (:client args)))))) :render (fn [x] [:div.flex.items-center.gap-2 (-> x :invoice/client :client/name) - (com/pill {:color :primary} (-> x :invoice/location)) - ])} + (com/pill {:color :primary} (-> x :invoice/location))])} + {:key "uploader" + :name "Uploaded by" + :sort-key "uploader" + :render #(-> % :invoice/uploader :user/name)} {:key "vendor" :name "Vendor" :sort-key "vendor" @@ -618,7 +621,7 @@ (throw (ex-info (str "No vendor with the name " vendor-code " was found.") {:vendor-code vendor-code}))))) -(defn import->invoice [{:keys [invoice-number source-url customer-identifier account-number total date vendor-code text full-text client-override vendor-search vendor-override location-override import-status]}] +(defn import->invoice [{:keys [invoice-number source-url customer-identifier account-number total date vendor-code text full-text client-override vendor-search vendor-override location-override import-status]} user] (when-not total (throw (Exception. "Couldn't parse total from file."))) (when-not date @@ -646,6 +649,7 @@ text full-text))] #:invoice {:db/id (random-tempid) + :invoice/uploader (-> user :db/id) :invoice/client matching-client :invoice/client-identifier (or account-number customer-identifier) :invoice/vendor (:db/id matching-vendor) @@ -683,7 +687,7 @@ (alog/info ::importing-uploaded :count (count imports) :bc (or user "NOO")) (let [potential-invoices (->> imports - (map import->invoice) + (map #(import->invoice % user)) (map #(validate-invoice % user)) admin-only-if-multiple-clients (mapv d-invoices/code-invoice)