More closely matches ben's spreadsheet for cashflows.

This commit is contained in:
2023-01-22 10:51:01 -08:00
parent 68e5240a7c
commit 14b10963b8

View File

@@ -4,13 +4,13 @@
[(:require
[auto-ap.time :as atime]
[auto-ap.time-utils :refer [user-friendly-date]]
[auto-ap.utils :refer [dollars-0?]]
[auto-ap.utils :refer [dollars-0? dollars=]]
[clojure.string :as str]
[auto-ap.time-utils :refer [user-friendly-date]]
)]
:cljs
[(:require
[auto-ap.utils :refer [dollars-0?]]
[auto-ap.utils :refer [dollars-0? dollars=]]
[auto-ap.views.utils :as au]
[clojure.string :as str]
[auto-ap.time-utils :refer [user-friendly-date]])]))
@@ -73,14 +73,36 @@
["97000 Taxes" 97000 97999]
["98000 Other Expenses" 98000 98999]]
:operating-activities [["12000-14000 Accounts Receivable" 12000 13999]
["21000-28000 Accounts Payable" 21000 27999]
["96000-97000 Amortization" 96000 96999]]
:operating-activities [["Accounts Payable" 21000 27999 :add]
["Accounts Receivable" 12200 12899 :subtract]
["CCP" 12000 12199 :subtract]
["Receipts Split" 12900 12999 :subtract]
["Depreciation Expense" 96000 96999 :add]
["Inventory" 13000 13999 :subtract]
]
:investment-activities [["14000-18000 Investments" 14000 17999]]
:financing-activities [["28000-35000 Financing Activities" 28000 34999]
["35000-40000 Other" 35000 39999]]
:bottom-line [["11000-12000 Bottom Line" 11000 11999]]})
:investment-activities [["14000-18000 Investments" 14000 17999 :subtract]]
:financing-activities [["Owner's Distributions" 34000 35999 :subtract]
["Owner's Contributions" 33000 33999 :add]
["Loans" 28000 28599 :add]]})
(def cashflow-aggregation
(->> (select-keys groupings [:operating-activities :investment-activities :financing-activities])
vals
(mapcat identity)
(map (fn [[_ start end rule]]
[start end rule]))
(into [])))
(defn cashflow-account->amount [account-code amount]
(let [operation (->> cashflow-aggregation
(filter (fn [[start end]]
(<= start account-code end)))
first
last)]
(if (= operation :add)
amount
(- amount))))
(defn min-numeric-code [category]
(->> (groupings category)
@@ -136,6 +158,11 @@
(defn aggregate-accounts [pnl-data]
(reduce (fnil + 0.0) 0.0 (map :amount (:data pnl-data))))
(defn aggregate-cashflow-accounts [pnl-data]
(reduce (fnil + 0.0) 0.0 (map (fn [d]
(cashflow-account->amount (:numeric-code d) (:amount d)))
(:data pnl-data))))
(defn aggregate-credits [pnl-data]
(reduce (fnil + 0.0) 0.0 (map :credits (:data pnl-data))))
@@ -250,22 +277,18 @@
(fn [p]
[
(merge
{:format :dollar
:value (aggregate-credits p)
:filters (when (:numeric-code (:filters p)) ;; don't allow filtering when you don't at least filter numeric codes
(:filters p))}
{:format :text
:value nil}
(:cell-args p)
cell-args)
(merge
{:format :text
:value nil}
(:cell-args p)
cell-args)
(merge
{:format :dollar
:value (aggregate-debits p)
:filters (when (:numeric-code (:filters p)) ;; don't allow filtering when you don't at least filter numeric codes
(:filters p))}
(:cell-args p)
cell-args)
(merge
{:format :dollar
:value (aggregate-accounts p)
:value (aggregate-cashflow-accounts p)
:filters (when (:numeric-code (:filters p)) ;; don't allow filtering when you don't at least filter numeric codes
(:filters p))}
(:cell-args p)
@@ -513,7 +536,7 @@
(let [pnl-datas (map #(filter-categories % [grouping])
pnl-datas)
individual-accounts
(for [[grouping-name from to] (groupings grouping)
(for [[grouping-name from to add-or-subtract] (groupings grouping)
:let [pnl-datas (map #(filter-numeric-code % from to)
pnl-datas)
account-codes (used-accounts pnl-datas)]
@@ -528,22 +551,41 @@
(into [{:value name}]
(mapcat
(fn [p]
(let [pnl-data (-> p (filter-numeric-code numeric-code numeric-code))]
[(merge
{:format :dollar
:filters (:filters pnl-data)
:value (aggregate-credits pnl-data)}
(:cell-args p))
(merge
{:format :dollar
:filters (:filters pnl-data)
:value (aggregate-debits pnl-data)}
(:cell-args p))
(merge
{:format :dollar
:filters (:filters pnl-data)
:value (aggregate-accounts pnl-data)}
(:cell-args p))]))
(let [pnl-data (-> p (filter-numeric-code numeric-code numeric-code))
aggregated (aggregate-accounts pnl-data)
credits (aggregate-credits pnl-data)
debits (aggregate-debits pnl-data)]
(if (dollars= (- debits credits) aggregated)
[(merge
{:format :dollar
:filters (:filters pnl-data)
:value debits}
(:cell-args p))
(merge
{:format :dollar
:filters (:filters pnl-data)
:value credits}
(:cell-args p))
(merge
{:format :dollar
:filters (:filters pnl-data)
:value (cashflow-account->amount numeric-code aggregated)}
(:cell-args p))]
[(merge
{:format :dollar
:filters (:filters pnl-data)
:value credits}
(:cell-args p))
(merge
{:format :dollar
:filters (:filters pnl-data)
:value debits}
(:cell-args p))
(merge
{:format :dollar
:filters (:filters pnl-data)
:value (cashflow-account->amount numeric-code aggregated)}
(:cell-args p))])))
pnl-datas))))
(conj (cashflow-subtotal-by-column-row pnl-datas "" {:border [:top]})))]
@@ -574,9 +616,11 @@
:financing-activities
(str prefix " Financing Activities")))
(into (cash-flow-detail-rows pnl-datas
:bottom-line
(str prefix " Bottom Line"))))]
(conj (cashflow-subtotal-by-column-row (map #(-> %
(filter-categories [:operating-activities :investment-activities :financing-activities])
#_(negate #{:cogs :payroll :controllable :fixed-overhead :ownership-controllable}))
pnl-datas)
"Change in Cash and Cash Equivalents")))]
{:header [[{:value "Account"}
{:value "Increases"}
{:value "Decreases"}