Adds outline for NTG invoice importing
This commit is contained in:
117
src/clj/auto_ap/jobs/ntg.clj
Normal file
117
src/clj/auto_ap/jobs/ntg.clj
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
(ns auto-ap.jobs.ntg
|
||||||
|
(:require
|
||||||
|
[amazonica.aws.s3 :as s3]
|
||||||
|
[auto-ap.datomic :refer [conn]]
|
||||||
|
[auto-ap.datomic.clients :as d-clients]
|
||||||
|
[auto-ap.datomic.invoices :refer [code-invoice]]
|
||||||
|
[auto-ap.jobs.core :refer [execute]]
|
||||||
|
[auto-ap.ledger :refer [transact-with-ledger]]
|
||||||
|
[auto-ap.parse :as parse]
|
||||||
|
[auto-ap.time :as t]
|
||||||
|
[clj-time.coerce :as coerce]
|
||||||
|
[clojure.data.csv :as csv]
|
||||||
|
[clojure.java.io :as io]
|
||||||
|
[clojure.string :as str]
|
||||||
|
[auto-ap.logging :as log :refer [capture-context->lc with-context-as]]
|
||||||
|
[com.unbounce.dogstatsd.core :as statsd]
|
||||||
|
[config.core :refer [env]]
|
||||||
|
[datomic.api :as d]
|
||||||
|
[com.brunobonacci.mulog :as mu]
|
||||||
|
|
||||||
|
[auto-ap.time :as atime])
|
||||||
|
(:import
|
||||||
|
(java.util UUID)))
|
||||||
|
|
||||||
|
|
||||||
|
(def bucket-name "data.prod.app.integreatconsult.com" #_(:data-bucket env))
|
||||||
|
|
||||||
|
(defn read-csv [k]
|
||||||
|
(log/info ::reading-csv :key k)
|
||||||
|
(-> (s3/get-object {:bucket-name bucket-name
|
||||||
|
:key k})
|
||||||
|
:input-stream
|
||||||
|
io/reader
|
||||||
|
csv/read-csv))
|
||||||
|
|
||||||
|
|
||||||
|
(defn extract-invoice-details [csv-rows clients]
|
||||||
|
(clojure.pprint/pprint (take 4 csv-rows))
|
||||||
|
(->> csv-rows
|
||||||
|
(drop 1)
|
||||||
|
(filter (fn [[_ _ _ _ _ _ _ _ _ _ _ break-flag]]
|
||||||
|
|
||||||
|
(= "Y" break-flag)))
|
||||||
|
(map (fn [[vendor location-hint invoice-number ship-date invoice-total ]]
|
||||||
|
|
||||||
|
(let [[matching-client similarity] (and location-hint
|
||||||
|
(parse/best-match clients location-hint 0.0))]
|
||||||
|
(clojure.pprint/pprint {:invoice/vendor vendor
|
||||||
|
:invoice/location (parse/best-location-match matching-client location-hint location-hint )
|
||||||
|
:invoice/date (coerce/to-date (atime/parse ship-date atime/normal-date))
|
||||||
|
:invoice/invoice-number invoice-number
|
||||||
|
:invoice/total (Double/parseDouble invoice-total)
|
||||||
|
:invoice/outstanding-balance (Double/parseDouble invoice-total)
|
||||||
|
:invoice/client matching-client
|
||||||
|
:invoice/import-status :import-status/completed
|
||||||
|
:invoice/status :invoice-status/unpaid
|
||||||
|
:invoice/client-identifier location-hint
|
||||||
|
}))))
|
||||||
|
(filter :invoice/client)))
|
||||||
|
|
||||||
|
(defn mark-key [k]
|
||||||
|
(s3/copy-object {:source-bucket-name bucket-name
|
||||||
|
:destination-bucket-name bucket-name
|
||||||
|
:destination-key (str/replace-first k "pending" "imported")
|
||||||
|
:source-key k})
|
||||||
|
#_(s3/delete-object {:bucket-name bucket-name
|
||||||
|
:key k}))
|
||||||
|
|
||||||
|
(defn is-csv-file? [x]
|
||||||
|
(= "csv" (last (str/split x #"[\\.]"))))
|
||||||
|
|
||||||
|
(defn import-ntg-invoices []
|
||||||
|
(let [clients (d-clients/get-all)
|
||||||
|
keys (->> (s3/list-objects-v2 {:bucket-name bucket-name
|
||||||
|
:prefix "ntg-invoices/pending"})
|
||||||
|
:object-summaries
|
||||||
|
(map :key))]
|
||||||
|
|
||||||
|
|
||||||
|
(log/info ::found-invoice-keys
|
||||||
|
:keys keys )
|
||||||
|
|
||||||
|
(let [transaction (->> keys
|
||||||
|
(filter is-csv-file?)
|
||||||
|
(mapcat (fn [k]
|
||||||
|
(try
|
||||||
|
(log/info ::trying-csv :key k)
|
||||||
|
(let [invoice-key (str "invoice-files/" (UUID/randomUUID) ".csv") ;
|
||||||
|
invoice-url (str "http://" bucket-name ".s3-website-us-east-1.amazonaws.com/" invoice-key)]
|
||||||
|
(s3/copy-object {:source-bucket-name bucket-name
|
||||||
|
:destination-bucket-name bucket-name
|
||||||
|
:source-key k
|
||||||
|
:destination-key invoice-key})
|
||||||
|
(->> (extract-invoice-details (read-csv k) clients)
|
||||||
|
(map (fn [i]
|
||||||
|
[:propose-invoice (assoc i :invoice/source-url invoice-url)]))
|
||||||
|
))
|
||||||
|
(catch Exception e
|
||||||
|
(log/error ::cant-load-file
|
||||||
|
:key k
|
||||||
|
:exception e)
|
||||||
|
(log/info
|
||||||
|
(s3/copy-object {:source-bucket-name bucket-name
|
||||||
|
:destination-bucket-name bucket-name
|
||||||
|
:source-key k
|
||||||
|
:destination-key (str "ntg-invoices/error/"
|
||||||
|
(.getName (io/file k)))}))
|
||||||
|
[])))))
|
||||||
|
#_result #_(transact-with-ledger transaction {:user/name "sysco importer" :user/role "admin"})]
|
||||||
|
(clojure.pprint/pprint transaction)
|
||||||
|
#_(log/infof "Imported %d invoices" (/ (count (:tempids result)) 2)))
|
||||||
|
(doseq [k keys]
|
||||||
|
(mark-key k))))
|
||||||
|
|
||||||
|
|
||||||
|
(defn -main [& _]
|
||||||
|
(execute "ntg-invoices" import-ntg-invoices))
|
||||||
Reference in New Issue
Block a user