133 lines
6.0 KiB
Clojure
133 lines
6.0 KiB
Clojure
(ns auto-ap.yodlee.import
|
|
(:require [auto-ap.yodlee.core :as client]
|
|
[auto-ap.db.transactions :as transactions]
|
|
[auto-ap.db.vendors :as vendors]
|
|
[auto-ap.utils :refer [by]]
|
|
[auto-ap.db.companies :as companies]
|
|
[digest :refer [sha-256]]
|
|
[auto-ap.db.checks :as checks]
|
|
[auto-ap.time :as time]))
|
|
|
|
|
|
|
|
(defn transaction->check-id [_ check-number company-id bank-account-id amount]
|
|
(cond (and check-number company-id bank-account-id)
|
|
(-> (checks/get-graphql {:company-id company-id
|
|
:bank-account-id bank-account-id
|
|
:check-number check-number
|
|
:amount (- amount)
|
|
:status "pending"})
|
|
first
|
|
:id)
|
|
|
|
(and company-id bank-account-id amount)
|
|
|
|
(let [matching-checks (checks/get-graphql {:company-id company-id
|
|
:bank-account-id bank-account-id
|
|
:amount (- amount)
|
|
:status "pending"})]
|
|
(if (= 1 (count matching-checks))
|
|
(:id (first matching-checks))
|
|
nil))
|
|
|
|
:else
|
|
nil))
|
|
|
|
(defn extract-check-number [{{description-original :original} :description}]
|
|
|
|
(if-let [[_ _ check-number] (re-find #"(?i)check(card|[^0-9]+([0-9]*))" description-original)]
|
|
(try
|
|
(Integer/parseInt check-number)
|
|
(catch NumberFormatException e
|
|
nil))
|
|
nil))
|
|
|
|
(defn import-transactions [transactions transaction->company transaction->bank-account-id]
|
|
(doseq [transaction transactions
|
|
:let [{post-date :postDate
|
|
account-id :accountId
|
|
date :date
|
|
id :id
|
|
{amount :amount} :amount
|
|
{description-original :original
|
|
description-simple :simple} :description
|
|
{merchant-id :i
|
|
merchant-name :name} :merchant
|
|
base-type :baseType
|
|
type :type
|
|
status :status}
|
|
transaction
|
|
amount (if (= "DEBIT" base-type)
|
|
(- amount)
|
|
amount)
|
|
check-number (extract-check-number transaction)
|
|
company-id (transaction->company transaction)
|
|
bank-account-id (transaction->bank-account-id transaction)
|
|
check-id (transaction->check-id transaction check-number company-id bank-account-id amount)]]
|
|
|
|
|
|
|
|
(try
|
|
(when company-id
|
|
(transactions/upsert!
|
|
{:post-date (time/parse post-date "YYYY-MM-dd")
|
|
:id (sha-256 (str id))
|
|
:account-id account-id
|
|
:date (time/parse date "YYYY-MM-dd")
|
|
:amount amount
|
|
:description-original description-original
|
|
:description-simple description-simple
|
|
:type type
|
|
:status status
|
|
:company-id company-id
|
|
:check-number check-number
|
|
:bank-account-id (transaction->bank-account-id transaction)
|
|
:check-id check-id
|
|
})
|
|
(when check-id
|
|
(checks/update! {:id check-id :status "cleared"})))
|
|
|
|
(catch Exception e
|
|
(println e)))))
|
|
|
|
(defn manual-import [manual-transactions]
|
|
(let [transformed-transactions (->> manual-transactions
|
|
(filter #(= "posted" (:status %)))
|
|
(group-by #(select-keys % [:date :description-original :amount]))
|
|
|
|
(vals)
|
|
|
|
(mapcat (fn [transaction-group]
|
|
(map
|
|
(fn [index {:keys [date description-original high-level-category amount account-id company-id] :as transaction}]
|
|
{:id (str date "-" account-id "-" description-original "-" amount "-" index "-" company-id)
|
|
:company-id company-id
|
|
:bank-account-id account-id
|
|
:date (time/unparse date "YYYY-MM-dd")
|
|
:amount {:amount amount}
|
|
:description {:original description-original
|
|
:simple high-level-category}
|
|
:status "POSTED"})
|
|
(range)
|
|
|
|
transaction-group))))]
|
|
(println "importing manual transactions" transformed-transactions)
|
|
(import-transactions transformed-transactions :company-id :bank-account-id)))
|
|
|
|
(defn do-import []
|
|
(let [transactions (client/get-transactions)
|
|
_ (println "All accounts:" (client/get-accounts))
|
|
_ (println "ALL Transactions:" transactions)
|
|
all-bank-accounts (mapcat (fn [c] (map
|
|
(fn [{:keys [id yodlee-account-id]}]
|
|
(when (and id yodlee-account-id)
|
|
{:bank-account-id id
|
|
:company-id (:id c)
|
|
:yodlee-account-id yodlee-account-id}))
|
|
(:bank-accounts c)))
|
|
(companies/get-all))
|
|
transaction->company (comp (by :yodlee-account-id :company-id all-bank-accounts) :accountId)
|
|
transaction->bank-account-id (comp (by :yodlee-account-id :bank-account-id all-bank-accounts) :accountId)]
|
|
(import-transactions transactions transaction->company transaction->bank-account-id)))
|
|
|