134 lines
5.4 KiB
Clojure
134 lines
5.4 KiB
Clojure
;; This buffer is for Clojure experiments and evaluation.
|
|
|
|
;; Press C-j to evaluate the last expression.
|
|
|
|
;; You can also press C-u C-j to evaluate the expression and pretty-print its result.
|
|
(require '[auto-ap.utils :refer [dollars=]])
|
|
|
|
(defn get-bad-ones []
|
|
|
|
|
|
(->> (->> (d/q '[:find ?c
|
|
:in $
|
|
:where [?c :client/code]]
|
|
(d/db auto-ap.datomic/conn))
|
|
(map first))
|
|
(mapcat #(->> (d/query {:query {:find ['?je '?a '(sum ?debit) '(sum ?credit)]
|
|
:with ['?jel]
|
|
:in '[$ ?c]
|
|
:where ['[?je :journal-entry/client ?c]
|
|
'[?je :journal-entry/amount ?a]
|
|
'[?je :journal-entry/line-items ?jel]
|
|
'[(get-else $ ?jel :journal-entry-line/debit 0.0) ?debit]
|
|
'[(get-else $ ?jel :journal-entry-line/credit 0.0) ?credit]]
|
|
}
|
|
:args [(d/db auto-ap.datomic/conn) %]})
|
|
(filter (fn [[_ a d c]]
|
|
(or (not (dollars= a d))
|
|
(not (dollars= a c)))))))
|
|
|
|
#_(count)
|
|
#_(take 3)))
|
|
|
|
(def bad-ones (get-bad-ones))
|
|
|
|
(count bad-ones)
|
|
|
|
(defn bad-invoices [bad-ones]
|
|
(->> bad-ones
|
|
|
|
(map first)
|
|
(map (fn [je]
|
|
(:journal-entry/original-entity (d/entity (d/db auto-ap.datomic/conn)
|
|
je))))
|
|
(filter (fn [invoice?]
|
|
(:invoice/total invoice?)))
|
|
#_(map (fn [invoice]
|
|
{:total (:invoice/total invoice)
|
|
:client-code (:client/code (:invoice/client invoice))
|
|
:invoice-number (:invoice/invoice-number invoice)
|
|
:vendor (:vendor/name (:invoice/vendor invoice))
|
|
:accounts (map
|
|
(fn [ea]
|
|
(str (:account/numeric-code (:invoice-expense-account/account ea)) ": " (:invoice-expense-account/amount ea)))
|
|
(:invoice/expense-accounts invoice))}))
|
|
))
|
|
|
|
(get-schema "invoice-expense-account")
|
|
|
|
(defn bad-invoices-with-zero-expense-accounts [bad-ones]
|
|
(->> bad-ones
|
|
|
|
(map first)
|
|
(map (fn [je]
|
|
(:journal-entry/original-entity (d/entity (d/db auto-ap.datomic/conn)
|
|
je))))
|
|
(filter (fn [invoice?]
|
|
(and (:invoice/total invoice?)
|
|
(= 0 (count (:invoice/expense-accounts invoice?))))))
|
|
(map (fn [invoice]
|
|
{:db/id (:db/id invoice)
|
|
:invoice/expense-accounts [{:invoice-expense-account/amount (:invoice/total invoice)
|
|
:invoice-expense-account/location (first (:client/locations (:invoice/client invoice)))
|
|
:invoice-expense-account/account (-> invoice
|
|
:invoice/vendor
|
|
(auto-ap.datomic.vendors/account-for-client-id (:db/id (:invoice/client invoice)))
|
|
:db/id)}
|
|
]}
|
|
))
|
|
|
|
#_(map (fn [invoice]
|
|
{:total (:invoice/total invoice)
|
|
:client-code (:client/code (:invoice/client invoice))
|
|
:invoice-number (:invoice/invoice-number invoice)
|
|
:vendor (:vendor/name (:invoice/vendor invoice))
|
|
:accounts (map
|
|
(fn [ea]
|
|
(str (:account/numeric-code (:invoice-expense-account/account ea)) ": " (:invoice-expense-account/amount ea)))
|
|
(:invoice/expense-accounts invoice))}))
|
|
))
|
|
|
|
@(d/transact auto-ap.datomic/conn (bad-invoices-with-zero-expense-accounts bad-ones))
|
|
|
|
(defn bad-transactions [bad-ones]
|
|
(->> bad-ones
|
|
|
|
(map first)
|
|
(map (fn [je]
|
|
(:journal-entry/original-entity (d/entity (d/db auto-ap.datomic/conn)
|
|
je))))
|
|
(filter (fn [invoice?]
|
|
(:transaction/amount invoice?)))
|
|
|
|
))
|
|
|
|
(doseq [i (bad-invoices bad-ones)]
|
|
(println "touching invoice " i)
|
|
(auto-ap.ledger/touch-invoice (:db/id i)))
|
|
|
|
(doseq [i (bad-transactions bad-ones)]
|
|
(println "touching tx " i)
|
|
(auto-ap.ledger/touch-transaction (:db/id i)))
|
|
|
|
(clojure.pprint/pprint (bad-invoices (get-bad-ones)))
|
|
(count (bad-transactions (get-bad-ones)))
|
|
|
|
|
|
(defn get-bad-transactions2 []
|
|
(->> (d/query {:query {:find ['?tx '?a '(sum ?a2)]
|
|
:with ['?acc]
|
|
:in '[$]
|
|
:where ['[?tx :transaction/amount ?a]
|
|
'[?tx :transaction/accounts ?acc]
|
|
'[(get-else $ ?acc :transaction-account/amount 0.0) ?a2]]
|
|
}
|
|
:args [(d/db auto-ap.datomic/conn)]})
|
|
(filter (fn [[_ a d ]]
|
|
(not (dollars= (Math/abs a) (Math/abs d)))))
|
|
#_(count)
|
|
#_(take 3)))
|
|
|
|
(clojure.pprint/pprint (count (get-bad-transactions2)))
|
|
|
|
()
|