First step in coding sales.
This commit is contained in:
@@ -115,6 +115,31 @@
|
|||||||
[]))]
|
[]))]
|
||||||
[existing-accounts]))
|
[existing-accounts]))
|
||||||
|
|
||||||
|
|
||||||
|
(defn apply-idents-to-well-known [conn]
|
||||||
|
(let [[ccp-square] (d/q '[:find [?v]
|
||||||
|
:where [?v :vendor/name "CCP Square"]]
|
||||||
|
(d/db conn))
|
||||||
|
[receipts-split] (d/q '[:find [?a]
|
||||||
|
:where [?a :account/numeric-code 12990]]
|
||||||
|
(d/db conn))
|
||||||
|
[ccp] (d/q '[:find [?a]
|
||||||
|
:where [?a :account/numeric-code 12100]]
|
||||||
|
(d/db conn))
|
||||||
|
[accounts-payable] (d/q '[:find [?a]
|
||||||
|
:where [?a :account/numeric-code 21000]]
|
||||||
|
(d/db conn))]
|
||||||
|
[[{:db/id ccp :db/ident :account/ccp}]
|
||||||
|
[{:db/id ccp-square
|
||||||
|
:db/ident :vendor/ccp-square
|
||||||
|
:vendor/name "CCP Square"
|
||||||
|
:vendor/default-account :account/ccp}
|
||||||
|
{:db/id receipts-split
|
||||||
|
:db/ident :account/receipts-split}
|
||||||
|
|
||||||
|
{:db/id accounts-payable
|
||||||
|
:db/ident :account/accounts-payable}]]))
|
||||||
|
|
||||||
(defn migrate [conn]
|
(defn migrate [conn]
|
||||||
(let [
|
(let [
|
||||||
norms-map (merge {:auto-ap/base-schema {:txes auto-ap.datomic/base-schema}
|
norms-map (merge {:auto-ap/base-schema {:txes auto-ap.datomic/base-schema}
|
||||||
@@ -443,7 +468,10 @@
|
|||||||
:db/doc "error message for a failed job"
|
:db/doc "error message for a failed job"
|
||||||
:db/valueType :db.type/string
|
:db/valueType :db.type/string
|
||||||
:db/cardinality :db.cardinality/one}]]
|
:db/cardinality :db.cardinality/one}]]
|
||||||
:requires [:auto-ap/add-transaction-import2]}}
|
:requires [:auto-ap/add-transaction-import2]}
|
||||||
|
:auto-ap/apply-idents-to-well-known {:txes-fn `apply-idents-to-well-known
|
||||||
|
:requires [:auto-ap/add-general-ledger6
|
||||||
|
:auto-ap/add-account-to-vendor]}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -223,8 +223,15 @@
|
|||||||
(defn maybe-clear-expected-deposit [{:transaction/keys [amount client date] :as transaction}]
|
(defn maybe-clear-expected-deposit [{:transaction/keys [amount client date] :as transaction}]
|
||||||
(when (>= amount 0.0)
|
(when (>= amount 0.0)
|
||||||
(when-let [expected-deposit (find-expected-deposit client amount (coerce/to-date-time date))]
|
(when-let [expected-deposit (find-expected-deposit client amount (coerce/to-date-time date))]
|
||||||
(assoc transaction :transaction/expected-deposit {:db/id expected-deposit
|
(assoc transaction
|
||||||
:expected-deposit/status :expected-deposit-status/cleared}))))
|
:transaction/expected-deposit {:db/id expected-deposit
|
||||||
|
:expected-deposit/status :expected-deposit-status/cleared}
|
||||||
|
:transaction/accounts [{:transaction-account/account :account/ccp
|
||||||
|
:transaction-account/amount amount
|
||||||
|
:transaction-account/location "A"}]
|
||||||
|
:transaction/approval-status :transaction-approval-status/approved
|
||||||
|
:transaction/vendor :vendor/ccp-square
|
||||||
|
))))
|
||||||
|
|
||||||
(defn maybe-code [{:transaction/keys [client amount] :as transaction} apply-rules valid-locations]
|
(defn maybe-code [{:transaction/keys [client amount] :as transaction} apply-rules valid-locations]
|
||||||
(if-let [unpaid-invoices (seq (match-transaction-to-unpaid-invoices amount client))]
|
(if-let [unpaid-invoices (seq (match-transaction-to-unpaid-invoices amount client))]
|
||||||
@@ -249,9 +256,6 @@
|
|||||||
code-fn)]))
|
code-fn)]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defn get-existing [bank-account]
|
(defn get-existing [bank-account]
|
||||||
(log/info "looking up bank account data for" bank-account)
|
(log/info "looking up bank account data for" bank-account)
|
||||||
(into {}
|
(into {}
|
||||||
|
|||||||
@@ -17,10 +17,12 @@
|
|||||||
(map :a)
|
(map :a)
|
||||||
(map namespace)
|
(map namespace)
|
||||||
set)]
|
set)]
|
||||||
|
(println namespaces changes)
|
||||||
(cond (namespaces "invoice" ) [[:invoice e]]
|
(cond (namespaces "invoice" ) [[:invoice e]]
|
||||||
(namespaces "invoice-expense-account" ) [[:invoice (:db/id (:invoice/_expense-accounts entity))]]
|
(namespaces "invoice-expense-account" ) [[:invoice (:db/id (:invoice/_expense-accounts entity))]]
|
||||||
(namespaces "transaction-account" ) [[:transaction (:db/id (:transaction/_accounts entity))]]
|
(namespaces "transaction-account" ) [[:transaction (:db/id (:transaction/_accounts entity))]]
|
||||||
(namespaces "transaction" ) [[:transaction e]]
|
(namespaces "transaction" ) [[:transaction e]]
|
||||||
|
(namespaces "expected-deposit" ) [[:expected-deposit e]]
|
||||||
:else nil)))
|
:else nil)))
|
||||||
|
|
||||||
|
|
||||||
@@ -33,6 +35,7 @@
|
|||||||
(cond (namespaces "invoice" ) :invoice
|
(cond (namespaces "invoice" ) :invoice
|
||||||
(namespaces "invoice-expense-account" ) :invoice-expense-account
|
(namespaces "invoice-expense-account" ) :invoice-expense-account
|
||||||
(namespaces "transaction-account" ) :transaction-account
|
(namespaces "transaction-account" ) :transaction-account
|
||||||
|
(namespaces "expected-deposit" ) :expected-deposit
|
||||||
:else nil)))
|
:else nil)))
|
||||||
|
|
||||||
(defmulti entity-change->ledger (fn [_ [type]]
|
(defmulti entity-change->ledger (fn [_ [type]]
|
||||||
@@ -57,7 +60,7 @@
|
|||||||
:journal-entry/vendor (:db/id (:invoice/vendor entity))
|
:journal-entry/vendor (:db/id (:invoice/vendor entity))
|
||||||
:journal-entry/amount (Math/abs (:invoice/total entity))
|
:journal-entry/amount (Math/abs (:invoice/total entity))
|
||||||
|
|
||||||
:journal-entry/line-items (into [(cond-> {:journal-entry-line/account (:db/id (a/get-account-by-numeric-code-and-sets 21000 ["default"]))
|
:journal-entry/line-items (into [(cond-> {:journal-entry-line/account :account/accounts-payable
|
||||||
:journal-entry-line/location "A"
|
:journal-entry-line/location "A"
|
||||||
}
|
}
|
||||||
credit-invoice? (assoc :journal-entry-line/debit (Math/abs (:invoice/total entity)))
|
credit-invoice? (assoc :journal-entry-line/debit (Math/abs (:invoice/total entity)))
|
||||||
@@ -120,6 +123,26 @@
|
|||||||
|
|
||||||
:journal-entry/cleared true}))))
|
:journal-entry/cleared true}))))
|
||||||
|
|
||||||
|
(defmethod entity-change->ledger :expected-deposit
|
||||||
|
[db [type id]]
|
||||||
|
(let [{:expected-deposit/keys [total client date]} (d/pull db '[:expected-deposit/total :expected-deposit/client :expected-deposit/date] id)]
|
||||||
|
#:journal-entry
|
||||||
|
{:source "expected-deposit"
|
||||||
|
:original-entity id
|
||||||
|
|
||||||
|
:client client
|
||||||
|
:date date
|
||||||
|
:amount total
|
||||||
|
:vendor :vendor/ccp-square
|
||||||
|
:line-items [#:journal-entry-line
|
||||||
|
{:credit total
|
||||||
|
:location "A"
|
||||||
|
:account :account/receipts-split}
|
||||||
|
#:journal-entry-line
|
||||||
|
{:debit total
|
||||||
|
:location "A"
|
||||||
|
:account :account/ccp}]}))
|
||||||
|
|
||||||
(defmethod entity-change->ledger :invoice-expense-account
|
(defmethod entity-change->ledger :invoice-expense-account
|
||||||
[db [entity changes]]
|
[db [entity changes]]
|
||||||
nil
|
nil
|
||||||
|
|||||||
@@ -171,6 +171,17 @@
|
|||||||
:expected-deposit/status :expected-deposit-status/cleared}
|
:expected-deposit/status :expected-deposit-status/cleared}
|
||||||
(:transaction/expected-deposit transaction-result)))))
|
(:transaction/expected-deposit transaction-result)))))
|
||||||
|
|
||||||
|
(t/testing "Should credit CCP"
|
||||||
|
(let [[transaction-result] (sut/transaction->txs (assoc base-transaction
|
||||||
|
:transaction/date #inst "2021-07-03T00:00:00-08:00"
|
||||||
|
:transaction/amount 100.0)
|
||||||
|
(d/entity (d/db conn) bank-account-id)
|
||||||
|
noop-rule)]
|
||||||
|
(t/is (= [{:transaction-account/account :account/ccp
|
||||||
|
:transaction-account/amount 100.0
|
||||||
|
:transaction-account/location "A"}]
|
||||||
|
(:transaction/accounts transaction-result)))))
|
||||||
|
|
||||||
(t/testing "Should not match old expected deposits"
|
(t/testing "Should not match old expected deposits"
|
||||||
(let [[transaction-result] (sut/transaction->txs (assoc base-transaction
|
(let [[transaction-result] (sut/transaction->txs (assoc base-transaction
|
||||||
:transaction/date #inst "2021-07-13"
|
:transaction/date #inst "2021-07-13"
|
||||||
|
|||||||
56
test/clj/auto_ap/ledger_test.clj
Normal file
56
test/clj/auto_ap/ledger_test.clj
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
(ns auto-ap.ledger-test
|
||||||
|
(:require [auto-ap.datomic :refer [conn uri]]
|
||||||
|
[auto-ap.datomic.migrate :as m]
|
||||||
|
[auto-ap.ledger :as sut]
|
||||||
|
[clojure.test :as t]
|
||||||
|
[datomic.api :as d]))
|
||||||
|
|
||||||
|
(defn wrap-setup
|
||||||
|
[f]
|
||||||
|
(with-redefs [auto-ap.datomic/uri "datomic:mem://datomic-transactor:4334/invoice"]
|
||||||
|
(d/create-database uri)
|
||||||
|
(with-redefs [auto-ap.datomic/conn (d/connect uri)]
|
||||||
|
(m/migrate auto-ap.datomic/conn)
|
||||||
|
(f)
|
||||||
|
(d/release auto-ap.datomic/conn)
|
||||||
|
(d/delete-database uri))))
|
||||||
|
|
||||||
|
(t/use-fixtures :each wrap-setup)
|
||||||
|
|
||||||
|
|
||||||
|
(t/deftest entity-change->ledger
|
||||||
|
(t/testing "Should code an expected deposit"
|
||||||
|
(let [{:strs [ed ccp receipts-split client]}
|
||||||
|
(:tempids @(d/transact conn [#:expected-deposit {:status :expected-deposit-status/pending
|
||||||
|
:client {:db/id "client"
|
||||||
|
:client/code "BRYCE"
|
||||||
|
:client/locations ["M"]}
|
||||||
|
:total 4.0
|
||||||
|
:fee 1.0
|
||||||
|
:date #inst "2021-01-01T00:00:00-08:00"
|
||||||
|
:location "M"
|
||||||
|
:db/id "ed"}]))
|
||||||
|
result (sut/entity-change->ledger (d/db conn) [:expected-deposit ed])]
|
||||||
|
(t/is (= #:journal-entry
|
||||||
|
{:source "expected-deposit"
|
||||||
|
:client {:db/id client}
|
||||||
|
:date #inst "2021-01-01T00:00:00-08:00"
|
||||||
|
:original-entity ed
|
||||||
|
:vendor :vendor/ccp-square
|
||||||
|
:amount 4.0
|
||||||
|
}
|
||||||
|
(dissoc result :journal-entry/line-items)))
|
||||||
|
|
||||||
|
(t/testing "should debit ccp"
|
||||||
|
(t/is (= [#:journal-entry-line
|
||||||
|
{:debit 4.0
|
||||||
|
:location "A"
|
||||||
|
:account :account/ccp}]
|
||||||
|
(filter :journal-entry-line/debit (:journal-entry/line-items result))))
|
||||||
|
)
|
||||||
|
(t/testing "should credit receipts split ccp"
|
||||||
|
(t/is (= [#:journal-entry-line
|
||||||
|
{:credit 4.0
|
||||||
|
:location "A"
|
||||||
|
:account :account/receipts-split}]
|
||||||
|
(filter :journal-entry-line/credit (:journal-entry/line-items result))))))))
|
||||||
Reference in New Issue
Block a user