Allows upload of CSV of sysco with line item parsing

This commit is contained in:
2026-05-26 21:53:04 -07:00
parent 200056098f
commit a4d7ac5982
5 changed files with 187 additions and 77 deletions

View File

@@ -26,6 +26,9 @@
(str/includes? (str header) "DISCOUNT_MESSAGE")
:wismettac
(str/includes? (str header) "Item Description")
:sysco-invoices-list
(str/includes? (str header) "Status")
:ledyard
@@ -34,7 +37,6 @@
(str/includes? (str header) "PARENT CUSTOMER NAME")
:worldwide
:else
nil)]
(alog/info ::csv-type-determined :type csv-type)
@@ -108,7 +110,7 @@
{:vendor-code "Mama Lu's Foods"
:customer-identifier customer
:invoice-number (str po-number "-" invoice-number)
:date (parse-date-fallover invoice-date ["M/d/yyyy HH:ss" "M/d/yyyy HH:mm:ss aa" "M/d/yyyy"])
:date (parse-date-fallover invoice-date ["M/d/yyyy HH:ss" "M/d/yyyy HH:mm:ss aa" "M/d/yyyy"])
:total (str/replace value #"," "")
:text (str/join " " row)
:full-text (str/join " " row)})))
@@ -124,7 +126,7 @@
{:vendor-code "Mama Lu's Foods"
:customer-identifier customer
:invoice-number (str po-number "-" invoice-number)
:date (parse-date-fallover invoice-date ["M/d/yyyy HH:ss" "M/d/yyyy HH:mm:ss aa" "M/d/yyyy"])
:date (parse-date-fallover invoice-date ["M/d/yyyy HH:ss" "M/d/yyyy HH:mm:ss aa" "M/d/yyyy"])
:total (str/replace value #"," "")
:text (str/join " " row)
:full-text (str/join " " row)})))
@@ -171,13 +173,13 @@
(transduce
(comp
(map (fn [[invoice-number date due amount standard :as row]]
{:vendor-code "Performance Food Group - LEDYARD"
{:vendor-code "Performance Food Group - LEDYARD"
:invoice-number invoice-number
:date (some-> date not-empty (parse-date-fallover ["MM/dd/yy"]))
:date (some-> date not-empty (parse-date-fallover ["MM/dd/yy"]))
:due (some-> due not-empty (parse-date-fallover ["MM/dd/yy"]))
:total (str/replace amount #"[\$,]" "")
:text (str/join " " row)
:full-text (str/join " " row)})))
:total (str/replace amount #"[\$,]" "")
:text (str/join " " row)
:full-text (str/join " " row)})))
conj
[]
(drop 1 rows)))
@@ -187,17 +189,41 @@
(transduce
(comp
(map (fn [[_ customer-name _ inv date amount :as row]]
{:vendor-code "Worldwide Produce"
{:vendor-code "Worldwide Produce"
:customer-identifier customer-name
:invoice-number (str/replace inv #"[=\"]" "")
:date (some-> date not-empty (parse-date-fallover ["MM/dd/yy"]))
:total (str/replace amount #"[\$,]" "")
:text (str/join " " row)
:full-text (str/join " " row)})))
:invoice-number (str/replace inv #"[=\"]" "")
:date (some-> date not-empty (parse-date-fallover ["MM/dd/yy"]))
:total (str/replace amount #"[\$,]" "")
:text (str/join " " row)
:full-text (str/join " " row)})))
conj
[]
(drop 1 rows)))
(defmethod parse-csv :sysco-invoices-list
[rows]
(let [header (first rows)]
(->> (drop 1 rows)
(map (fn [row] (into {} (map vector header row))))
(filter (fn [row]
(let [qty (get row "Current Quantity")]
(not (or (str/blank? qty) (= qty "0"))))))
(group-by (fn [row] (get row "Invoice")))
(map (fn [[_ invoice-rows]]
(let [first-row (first invoice-rows)]
{:invoice-number (get first-row "Invoice")
:date (parse-date-fallover (get first-row "Invoice Date") ["yyyy-MM-dd"])
:total (str/replace (get first-row "Amount Due") #"[,\$]" "")
:customer-identifier (get first-row "Ship To Name")
:vendor-code "Sysco"
:text (str/join " " (mapcat vals invoice-rows))
:full-text (str/join " " (mapcat vals invoice-rows))
:line-items (mapv (fn [row]
{:description (get row "Item Description")
:amount (Double/parseDouble (str/replace (get row "Total Amount") #"[,\$]" ""))})
invoice-rows)})))
vec)))
#_{:clj-kondo/ignore [:unused-binding]}
(defmethod parse-csv nil
[rows]