From f7d9fed0c5476a582e692e59682ade298334d083 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Tue, 14 May 2019 21:18:52 -0700 Subject: [PATCH] Supports testing yodlee import --- src/clj/auto_ap/datomic.clj | 4 +- src/clj/auto_ap/yodlee/import.clj | 111 ++++++++++-------- .../auto_ap/views/pages/admin/rules/form.cljs | 2 +- test/clj/auto_ap/graphql.clj | 2 +- 4 files changed, 64 insertions(+), 55 deletions(-) diff --git a/src/clj/auto_ap/datomic.clj b/src/clj/auto_ap/datomic.clj index 224d2390..e74f0764 100644 --- a/src/clj/auto_ap/datomic.clj +++ b/src/clj/auto_ap/datomic.clj @@ -12,9 +12,9 @@ [clj-time.core :as time] [clj-time.coerce :as coerce])) -(def uri "datomic:sql://invoices?jdbc:postgresql://database:5432/datomic?user=datomic&password=datomic") +#_(def uri "datomic:sql://invoices?jdbc:postgresql://database:5432/datomic?user=datomic&password=datomic") -#_(def uri "datomic:mem://datomic-transactor:4334/invoice") +(def uri "datomic:mem://datomic-transactor:4334/invoice") (defn create-database [] (d/create-database uri)) diff --git a/src/clj/auto_ap/yodlee/import.clj b/src/clj/auto_ap/yodlee/import.clj index c16a1a2d..d8b636c0 100644 --- a/src/clj/auto_ap/yodlee/import.clj +++ b/src/clj/auto_ap/yodlee/import.clj @@ -14,11 +14,13 @@ (defn transaction->payment [_ check-number client-id bank-account-id amount id] - - (cond (:transaction/payment (d-transactions/get-by-id [:transaction/id (sha-256 (str id))])) + (cond (not (and client-id bank-account-id)) nil - (and check-number client-id bank-account-id) + (:transaction/payment (d-transactions/get-by-id [:transaction/id (sha-256 (str id))])) + nil + + check-number (-> (d-checks/get-graphql {:client-id client-id :bank-account-id bank-account-id :check-number check-number @@ -28,7 +30,6 @@ first) (and client-id bank-account-id amount) - (let [[matching-checks] (d-checks/get-graphql {:client-id client-id :bank-account-id bank-account-id :amount (- amount) @@ -49,31 +50,32 @@ nil)) nil)) -(defn import-transactions [transactions transaction->client 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 :id - 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) - client-id (transaction->client transaction) - bank-account-id (transaction->bank-account-id transaction) - check (transaction->payment transaction check-number client-id bank-account-id amount id)]] - (try - (when client-id - @(->> [(remove-nils #:transaction +(defn transactions->txs [transactions transaction->client transaction->bank-account-id] + (into [] + + (for [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 :id + 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) + client-id (transaction->client transaction) + bank-account-id (transaction->bank-account-id transaction) + check (transaction->payment transaction check-number client-id bank-account-id amount id)] + :when client-id] + (->> (remove-nils #:transaction {:post-date (coerce/to-date (time/parse post-date "YYYY-MM-dd")) :id (sha-256 (str id)) :account-id account-id @@ -102,14 +104,18 @@ :accounts (when check [#:transaction-account {:account (:db/id (a/get-account-by-numeric-code-and-sets 2110 ["default"])) :location "A" - :amount (Math/abs (double amount))}]) - })] + :amount (Math/abs (double amount))}])}))))) - - (d/transact (d/connect uri)))) - (catch Exception e - (println e))))) +(defn batch-transact [transactions] + (reduce (fn [acc batch] + (into acc (->> batch + (d/transact (d/connect uri) ) + (deref) + :tempids + vals))) + [] + (partition-all 100 transactions))) (defn manual-import [manual-transactions] (let [transformed-transactions (->> manual-transactions @@ -130,21 +136,24 @@ (range) transaction-group))))] (println "importing manual transactions" transformed-transactions) - (import-transactions transformed-transactions :client-id :bank-account-id))) + (batch-transact + (transactions->txs transformed-transactions :client-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 [:db/id :bank-account/yodlee-account-id]}] - (when (and id yodlee-account-id) - {:bank-account-id id - :client-id (:db/id c) - :yodlee-account-id yodlee-account-id})) - (:client/bank-accounts c))) - (d-clients/get-all)) - transaction->client (comp (by :yodlee-account-id :client-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->client transaction->bank-account-id))) + + +(defn do-import + ([] + (do-import (client/get-transactions))) + ([transactions] + (let [all-bank-accounts (mapcat (fn [c] (map + (fn [{:keys [:db/id :bank-account/yodlee-account-id]}] + (when (and id yodlee-account-id) + {:bank-account-id id + :client-id (:db/id c) + :yodlee-account-id yodlee-account-id})) + (:client/bank-accounts c))) + (d-clients/get-all)) + transaction->client (comp (by :yodlee-account-id :client-id all-bank-accounts) :accountId) + transaction->bank-account-id (comp (by :yodlee-account-id :bank-account-id all-bank-accounts) :accountId)] + (batch-transact (transactions->txs transactions transaction->client transaction->bank-account-id))))) diff --git a/src/cljs/auto_ap/views/pages/admin/rules/form.cljs b/src/cljs/auto_ap/views/pages/admin/rules/form.cljs index 8e611807..fe5738e4 100644 --- a/src/cljs/auto_ap/views/pages/admin/rules/form.cljs +++ b/src/cljs/auto_ap/views/pages/admin/rules/form.cljs @@ -277,7 +277,7 @@ [expense-accounts-field {:type "expense-accounts" :descriptor "account asssignment" :percentage-only? true - :locations @(re-frame/subscribe [::subs/locations-for-client (:id (:client data))]) + :locations (into ["Shared"] @(re-frame/subscribe [::subs/locations-for-client (:id (:client data))])) :max 100 :field [:accounts]}]] diff --git a/test/clj/auto_ap/graphql.clj b/test/clj/auto_ap/graphql.clj index 3570234f..caabb9b0 100644 --- a/test/clj/auto_ap/graphql.clj +++ b/test/clj/auto_ap/graphql.clj @@ -72,7 +72,7 @@ (is (= "123" (:description result))) (is (= "Bryce's Meat Co" (-> result :vendor :name))) - (is (= :approved (:transaction-status result))) + (is (= :approved (:transaction-approval-status result))) (is (= "hello" (-> result :accounts (get 0) :account :name ))) (is (:id result)) (testing "it should delete removed rules"