captures last integration for each bank account as well.

This commit is contained in:
2022-07-08 13:24:47 -07:00
parent 789914b3f7
commit 6c961e17ba
5 changed files with 45 additions and 36 deletions

View File

@@ -0,0 +1,28 @@
(ns auto-ap.import.common
(:require
[auto-ap.datomic :refer [conn]]
[clojure.tools.logging :as log]
[datomic.api :as d]))
(defn bank-account->integration-id [bank-account]
(or (->> bank-account
(d/pull (d/db conn) [:bank-account/integration-status])
:bank-account/integration-status
:db/id)
#db/id[:db.part/user]))
(defn wrap-integration [f bank-account]
(try
(let [result (f)]
@(d/transact conn [{:db/id bank-account :bank-account/integration-status {:db/id (bank-account->integration-id bank-account)
:integration-status/state :integration-state/success
:integration-status/last-attempt (java.util.Date.)
:integration-status/last-updated (java.util.Date.)}}])
result)
(catch Exception e
@(d/transact conn [{:db/id bank-account :bank-account/integration-status {:db/id (bank-account->integration-id bank-account)
:integration-status/state :integration-state/failed
:integration-status/last-attempt (java.util.Date.)
:integration-status/message (.getMessage e)}}])
(log/warn e)
nil)))

View File

@@ -1,6 +1,7 @@
(ns auto-ap.import.intuit (ns auto-ap.import.intuit
(:require (:require
[auto-ap.datomic :refer [conn]] [auto-ap.datomic :refer [conn]]
[auto-ap.import.common :refer [wrap-integration]]
[auto-ap.import.transactions :as t] [auto-ap.import.transactions :as t]
[auto-ap.intuit.core :as i] [auto-ap.intuit.core :as i]
[auto-ap.time :as atime] [auto-ap.time :as atime]
@@ -12,7 +13,6 @@
[com.unbounce.dogstatsd.core :as statsd] [com.unbounce.dogstatsd.core :as statsd]
[datomic.api :as d] [datomic.api :as d]
[mount.core :as mount] [mount.core :as mount]
[unilog.context :as lc]
[yang.scheduler :as scheduler])) [yang.scheduler :as scheduler]))
(defn get-intuit-bank-accounts [db] (defn get-intuit-bank-accounts [db]
@@ -57,10 +57,11 @@
start (time/plus end (time/days -30))] start (time/plus end (time/days -30))]
(try (try
(doseq [[external-id bank-account-id client-id] (get-intuit-bank-accounts db) (doseq [[external-id bank-account-id client-id] (get-intuit-bank-accounts db)
transaction (-> (i/get-transactions (auto-ap.time/unparse start auto-ap.time/iso-date) transaction (wrap-integration #(-> (i/get-transactions (auto-ap.time/unparse start auto-ap.time/iso-date)
(auto-ap.time/unparse end auto-ap.time/iso-date) (auto-ap.time/unparse end auto-ap.time/iso-date)
external-id) external-id)
(intuits->transactions bank-account-id client-id))] (intuits->transactions bank-account-id client-id))
bank-account-id)]
(t/import-transaction! import-batch transaction)) (t/import-transaction! import-batch transaction))
(t/finish! import-batch) (t/finish! import-batch)
(statsd/event {:title "Intuit import Finished" (statsd/event {:title "Intuit import Finished"

View File

@@ -1,8 +1,10 @@
(ns auto-ap.import.plaid (ns auto-ap.import.plaid
(:require (:require
[auto-ap.datomic :refer [conn]] [auto-ap.datomic :refer [conn]]
[auto-ap.import.common :refer [wrap-integration]]
[auto-ap.import.transactions :as t] [auto-ap.import.transactions :as t]
[auto-ap.plaid.core :as p] [auto-ap.plaid.core :as p]
[auto-ap.time :as atime]
[auto-ap.utils :refer [allow-once by heartbeat]] [auto-ap.utils :refer [allow-once by heartbeat]]
[clj-time.coerce :as coerce] [clj-time.coerce :as coerce]
[clj-time.core :as time] [clj-time.core :as time]
@@ -30,18 +32,19 @@
:amount (if (= "credit" (:type (:account t))) :amount (if (= "credit" (:type (:account t)))
(- (double (:amount t))) (- (double (:amount t)))
(double (:amount t))) (double (:amount t)))
:date (coerce/to-date (auto-ap.time/parse (:authorized_date t) auto-ap.time/iso-date)) :date (coerce/to-date (atime/parse (:authorized_date t) atime/iso-date))
:status "POSTED"}) :status "POSTED"})
(defn import-plaid [] (defn import-plaid []
(lc/with-context {:source "Import plaid transactions"} (lc/with-context {:source "Import plaid transactions"}
(let [import-batch (t/start-import-batch :import-source/plaid "Automated plaid user") (let [import-batch (t/start-import-batch :import-source/plaid "Automated plaid user")
end (auto-ap.time/local-now) end (atime/local-now)
start (time/plus end (time/days -30))] start (time/plus end (time/days -30))]
(try (try
(doseq [[bank-account-id client-id external-id access-token] (get-plaid-accounts (d/db conn)) (doseq [[bank-account-id client-id external-id access-token] (get-plaid-accounts (d/db conn))
:let [transaction-result (p/get-transactions access-token external-id start end) :let [transaction-result (wrap-integration #(p/get-transactions access-token external-id start end)
bank-account-id)
accounts-by-id (by :account_id (:accounts transaction-result))] accounts-by-id (by :account_id (:accounts transaction-result))]
transaction (:transactions transaction-result)] transaction (:transactions transaction-result)]
(when (not (:pending transaction)) (when (not (:pending transaction))

View File

@@ -1,6 +1,7 @@
(ns auto-ap.import.yodlee2 (ns auto-ap.import.yodlee2
(:require (:require
[auto-ap.datomic :refer [conn]] [auto-ap.datomic :refer [conn]]
[auto-ap.import.common :refer [wrap-integration]]
[auto-ap.import.transactions :as t] [auto-ap.import.transactions :as t]
[auto-ap.import.yodlee :as y] [auto-ap.import.yodlee :as y]
[auto-ap.utils :refer [allow-once heartbeat]] [auto-ap.utils :refer [allow-once heartbeat]]
@@ -9,31 +10,7 @@
[datomic.api :as d] [datomic.api :as d]
[mount.core :as mount] [mount.core :as mount]
[unilog.context :as lc] [unilog.context :as lc]
[yang.scheduler :as scheduler] [yang.scheduler :as scheduler]))
[clojure.tools.logging :as log]))
(defn bank-account->integration-id [bank-account]
(or (->> bank-account
(d/pull (d/db conn) [:bank-account/integration-status])
:bank-account/integration-status
:db/id)
#db/id[:db.part/user]))
(defn get-client-transactions-or-mark-integration-fail [client-code yodlee-account bank-account]
(try
(let [result (client2/get-specific-transactions client-code yodlee-account)]
@(d/transact conn [{:db/id bank-account :bank-account/integration-status {:db/id (bank-account->integration-id bank-account)
:integration-status/state :integration-state/success
:integration-status/last-attempt (java.util.Date.)
:integration-status/last-updated (java.util.Date.)}}])
result)
(catch Exception e
@(d/transact conn [{:db/id bank-account :bank-account/integration-status {:db/id (bank-account->integration-id bank-account)
:integration-status/state :integration-state/failed
:integration-status/last-attempt (java.util.Date.)
:integration-status/message (.getMessage e)}}])
(log/warn e)
[])))
(defn import-yodlee2 [] (defn import-yodlee2 []
(lc/with-context {:source "Import yodlee2 transactions"} (lc/with-context {:source "Import yodlee2 transactions"}
@@ -54,8 +31,8 @@
] ]
(d/db conn))] (d/db conn))]
(doseq [[yodlee-account bank-account client-code use-date-instead-of-post-date?] account-lookup (doseq [[yodlee-account bank-account client-code use-date-instead-of-post-date?] account-lookup
transaction (get-client-transactions-or-mark-integration-fail client-code yodlee-account bank-account)] transaction (wrap-integration #(client2/get-specific-transactions client-code yodlee-account)
(println transaction) bank-account)]
(t/import-transaction! import-batch (assoc (y/yodlee->transaction transaction use-date-instead-of-post-date?) (t/import-transaction! import-batch (assoc (y/yodlee->transaction transaction use-date-instead-of-post-date?)
:transaction/bank-account bank-account :transaction/bank-account bank-account
:transaction/client [:client/code client-code]))) :transaction/client [:client/code client-code])))

View File

@@ -491,7 +491,7 @@
(doseq [client (apply get-square-clients clients) (doseq [client (apply get-square-clients clients)
:when (seq (filter :square-location/client-location (:client/square-locations client)))] :when (seq (filter :square-location/client-location (:client/square-locations client)))]
(lc/with-context {:client (:client/code client)} (lc/with-context {:client (:client/code client)}
(mark-integration-status client {:integration-status/last-attempt (coerce/to-date (time/now))}) (mark-integration-status client {:integration-sttus/last-attempt (coerce/to-date (time/now))})
(try+ (try+
(upsert-locations client) (upsert-locations client)
(upsert client) (upsert client)