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