diff --git a/src/clj/auto_ap/import/common.clj b/src/clj/auto_ap/import/common.clj new file mode 100644 index 00000000..1307bc8c --- /dev/null +++ b/src/clj/auto_ap/import/common.clj @@ -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))) diff --git a/src/clj/auto_ap/import/intuit.clj b/src/clj/auto_ap/import/intuit.clj index 5714b1f8..6fd83912 100644 --- a/src/clj/auto_ap/import/intuit.clj +++ b/src/clj/auto_ap/import/intuit.clj @@ -1,6 +1,7 @@ (ns auto-ap.import.intuit (:require [auto-ap.datomic :refer [conn]] + [auto-ap.import.common :refer [wrap-integration]] [auto-ap.import.transactions :as t] [auto-ap.intuit.core :as i] [auto-ap.time :as atime] @@ -12,7 +13,6 @@ [com.unbounce.dogstatsd.core :as statsd] [datomic.api :as d] [mount.core :as mount] - [unilog.context :as lc] [yang.scheduler :as scheduler])) (defn get-intuit-bank-accounts [db] @@ -57,10 +57,11 @@ start (time/plus end (time/days -30))] (try (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) - (auto-ap.time/unparse end auto-ap.time/iso-date) - external-id) - (intuits->transactions bank-account-id client-id))] + 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) + external-id) + (intuits->transactions bank-account-id client-id)) + bank-account-id)] (t/import-transaction! import-batch transaction)) (t/finish! import-batch) (statsd/event {:title "Intuit import Finished" diff --git a/src/clj/auto_ap/import/plaid.clj b/src/clj/auto_ap/import/plaid.clj index 991021c7..0d9aaeab 100644 --- a/src/clj/auto_ap/import/plaid.clj +++ b/src/clj/auto_ap/import/plaid.clj @@ -1,8 +1,10 @@ (ns auto-ap.import.plaid (:require [auto-ap.datomic :refer [conn]] + [auto-ap.import.common :refer [wrap-integration]] [auto-ap.import.transactions :as t] [auto-ap.plaid.core :as p] + [auto-ap.time :as atime] [auto-ap.utils :refer [allow-once by heartbeat]] [clj-time.coerce :as coerce] [clj-time.core :as time] @@ -30,18 +32,19 @@ :amount (if (= "credit" (:type (:account 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"}) (defn import-plaid [] (lc/with-context {:source "Import plaid transactions"} (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))] (try (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))] transaction (:transactions transaction-result)] (when (not (:pending transaction)) diff --git a/src/clj/auto_ap/import/yodlee2.clj b/src/clj/auto_ap/import/yodlee2.clj index bc10191d..92e3622e 100644 --- a/src/clj/auto_ap/import/yodlee2.clj +++ b/src/clj/auto_ap/import/yodlee2.clj @@ -1,6 +1,7 @@ (ns auto-ap.import.yodlee2 (:require [auto-ap.datomic :refer [conn]] + [auto-ap.import.common :refer [wrap-integration]] [auto-ap.import.transactions :as t] [auto-ap.import.yodlee :as y] [auto-ap.utils :refer [allow-once heartbeat]] @@ -9,31 +10,7 @@ [datomic.api :as d] [mount.core :as mount] [unilog.context :as lc] - [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) - []))) + [yang.scheduler :as scheduler])) (defn import-yodlee2 [] (lc/with-context {:source "Import yodlee2 transactions"} @@ -54,8 +31,8 @@ ] (d/db conn))] (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)] - (println transaction) + transaction (wrap-integration #(client2/get-specific-transactions client-code yodlee-account) + bank-account)] (t/import-transaction! import-batch (assoc (y/yodlee->transaction transaction use-date-instead-of-post-date?) :transaction/bank-account bank-account :transaction/client [:client/code client-code]))) diff --git a/src/clj/auto_ap/square/core.clj b/src/clj/auto_ap/square/core.clj index 73dd31fc..3b675971 100644 --- a/src/clj/auto_ap/square/core.clj +++ b/src/clj/auto_ap/square/core.clj @@ -491,7 +491,7 @@ (doseq [client (apply get-square-clients clients) :when (seq (filter :square-location/client-location (:client/square-locations 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+ (upsert-locations client) (upsert client)