diff --git a/src/clj/auto_ap/parse.clj b/src/clj/auto_ap/parse.clj index 28743d95..e666340d 100644 --- a/src/clj/auto_ap/parse.clj +++ b/src/clj/auto_ap/parse.clj @@ -108,8 +108,11 @@ (or (->> client :client/location-matches (mapcat (fn [{:keys [:location-match/location :location-match/matches]}] + (map (fn [match] [location match]) matches))) - (filter (fn [[location match]] (re-find (re-pattern (str "(?i)" match)) text)) ) + (filter (fn [[location match]] + (println "loc " location match text) + (re-find (re-pattern (str "(?i)" match)) text)) ) first first) (->> client diff --git a/src/clj/auto_ap/parse/excel.clj b/src/clj/auto_ap/parse/excel.clj index 5afcdd6b..6161e87d 100644 --- a/src/clj/auto_ap/parse/excel.clj +++ b/src/clj/auto_ap/parse/excel.clj @@ -10,38 +10,40 @@ (every? #(re-find % text) keywords)) (defn extract [wb {:keys [extract vendor]}] - (reduce-kv - (fn [invoice k [regex offset-row offset-column extract-regex]] - (assoc invoice k - (->> wb - (d/sheet-seq) - first - (d/cell-seq) - (filter (fn [cell] - (re-find regex (str (d/read-cell cell))))) - (map (fn [cell] - (let [address (.getAddress cell) - cell-value (str (d/read-cell (d/select-cell (.toString (CellAddress. (+ offset-row (.getRow address)) (+ offset-column (.getColumn address)) )) - (first (d/sheet-seq wb)))))] - (if extract-regex - (second (re-find extract-regex cell-value)) - - cell-value)))) - first))) - {:vendor-code vendor} - extract)) + (if (fn? extract) + (extract wb vendor) + [(reduce-kv + (fn [invoice k [regex offset-row offset-column extract-regex]] + (assoc invoice k + (->> wb + (d/sheet-seq) + first + (d/cell-seq) + (filter (fn [cell] + (re-find regex (str (d/read-cell cell))))) + (map (fn [cell] + (let [address (.getAddress cell) + cell-value (str (d/read-cell (d/select-cell (.toString (CellAddress. (+ offset-row (.getRow address)) (+ offset-column (.getColumn address)) )) + (first (d/sheet-seq wb)))))] + (if extract-regex + (second (re-find extract-regex cell-value)) + + cell-value)))) + first))) + {:vendor-code vendor} + extract)])) (defn parse-file [file filename] - [(let [wb (d/load-workbook file) - text (->> wb - (d/sheet-seq) - first - (d/cell-seq) - (map d/read-cell) - (str/join " "))] - (->> t/excel-templates - (filter (partial template-applies? text)) - first - (extract wb) - ))]) + (let [wb (d/load-workbook file) + text (->> wb + (d/sheet-seq) + first + (d/cell-seq) + (map d/read-cell) + (str/join " "))] + (->> t/excel-templates + (filter (partial template-applies? text)) + first + (extract wb) + ))) diff --git a/src/clj/auto_ap/parse/templates.clj b/src/clj/auto_ap/parse/templates.clj index bf0d273a..f9e8fd7c 100644 --- a/src/clj/auto_ap/parse/templates.clj +++ b/src/clj/auto_ap/parse/templates.clj @@ -1,4 +1,7 @@ -(ns auto-ap.parse.templates) +(ns auto-ap.parse.templates + (:require [dk.ative.docjure.spreadsheet :as d] + [clojure.string :as str]) + (:import (org.apache.poi.ss.util CellAddress))) (def pdf-templates @@ -80,6 +83,9 @@ :total #"\s{2,}INVOICE\s{2,}.*?(?=TOTAL)TOTAL\s+([0-9.]+)"} :parser {:date [:clj-time "MM/dd/yyyy"]}}]) +(defn offset [c x y] + (.toString (CellAddress. (+ y (.getRow (.getAddress c))) (+ x (.getColumn (.getAddress c))) ))) + (def excel-templates [{:vendor "Isp Productions" :keywords [#"ISP PRODUCTIONS"] @@ -92,4 +98,27 @@ :extract {:customer-identifier [#"Customer #" 1 0] :total [#"Total Invoice" 0 5] :date [#"Date" 0 0 #"Date: (.*)"] - :invoice-number [#"Invoice #" 0 0 #"Invoice #: (.*)"]}}]) + :invoice-number [#"Invoice #" 0 0 #"Invoice #: (.*)"]}} + {:vendor "DVW Commercial" + :keywords [#"Thank you!!!"] + :extract (fn [wb vendor] + (let [[sheet] (d/sheet-seq wb)] + (transduce (comp (filter (fn [c] + (re-find #"Invoice" (str (d/read-cell c))))) + (map (fn [c] + (let [customer-identifier (d/read-cell (->> (d/select-cell (offset c -3 0) sheet) + (iterate (fn [c] + (d/select-cell (offset c 0 -1) sheet))) + (filter (fn [c] + (not (str/blank? (d/read-cell c))))) + first))] + {:customer-identifier customer-identifier + :text customer-identifier + :full-text customer-identifier + :date (d/read-cell (d/select-cell (offset c 2 0) sheet)) + :invoice-number (d/read-cell (d/select-cell (offset c 4 0) sheet)) + :total (str (d/read-cell (d/select-cell (offset c 8 0) sheet))) + :vendor-code vendor})))) + conj + [] + (d/cell-seq sheet))))}]) diff --git a/src/clj/auto_ap/routes/invoices.clj b/src/clj/auto_ap/routes/invoices.clj index aea3a9ab..7ec2e141 100644 --- a/src/clj/auto_ap/routes/invoices.clj +++ b/src/clj/auto_ap/routes/invoices.clj @@ -161,6 +161,7 @@ (defn import-uploaded-invoice [imports] (let [clients (d-clients/get-all) + _ (clojure.pprint/pprint imports) transactions (reduce (fn [result {:keys [invoice-number customer-identifier total date vendor-code text full-text] :as info}] (println "searching for" vendor-code) diff --git a/src/cljs/auto_ap/views/pages/import_invoices.cljs b/src/cljs/auto_ap/views/pages/import_invoices.cljs index 662bcb12..0c889f3c 100644 --- a/src/cljs/auto_ap/views/pages/import_invoices.cljs +++ b/src/cljs/auto_ap/views/pages/import_invoices.cljs @@ -7,6 +7,7 @@ [auto-ap.views.components.layouts :refer [side-bar-layout]] [auto-ap.views.components.invoices.side-bar :refer [invoices-side-bar]] [auto-ap.views.utils :refer [dispatch-event]] + [auto-ap.utils :refer [by]] [auto-ap.entities.vendors :as vendor] [auto-ap.views.components.invoice-table :refer [invoice-table] :as invoice-table] [cljsjs.dropzone :as dropzone] @@ -67,6 +68,8 @@ (fn [db [_ data]] (-> db (assoc ::invoice-page (first (:invoice-page data))) + (update-in [::invoice-page] (fn [ip] + (assoc ip :checked (by :id (:invoices ip))))) (assoc-in [:status :loading] false)))) (re-frame/reg-event-fx