Makes balance sheet work like pnl, updates pnl as necessary
This commit is contained in:
@@ -18,7 +18,10 @@
|
||||
|
||||
|
||||
(def ranges
|
||||
{:sales [40000 49999]
|
||||
{:assets [11000 19999]
|
||||
:liabilities [20100 28999]
|
||||
:equities [30000 39999]
|
||||
:sales [40000 49999]
|
||||
:cogs [50000 59999]
|
||||
:payroll [60000 69999]
|
||||
:controllable [70000 79999]
|
||||
@@ -26,7 +29,21 @@
|
||||
:ownership-controllable [90000 99999]})
|
||||
|
||||
(def groupings
|
||||
{:sales [["40000-43999 Food Sales " 40000 43999]
|
||||
{:assets [["1100 Cash and Bank Accounts" 11000 11999]
|
||||
["1200 Accounts Receivable" 12000 12999]
|
||||
["1300 Inventory" 13000 13999]
|
||||
["1400 Prepaid Expenses" 14000 14999]
|
||||
["1500 Property and Equipment" 15000 15999]
|
||||
["1600 Intangible Assets" 16000 16999]
|
||||
["1700 Other Assets" 17000 19999]]
|
||||
:liabilities [["2000 Accounts Payable" 20100 23999]
|
||||
["2400 Accrued Expenses" 24000 24999]
|
||||
["2500 Other Liabilities" 25000 25999]
|
||||
["2600 Split Accounts" 26000 26999]
|
||||
["2700 Current Portion of Long-Term Debt" 27000 27999]
|
||||
["2800 Notes Payable" 28000 28999]]
|
||||
:equities [["3000 Owner's Equity" 30000 39999]]
|
||||
:sales [["40000-43999 Food Sales " 40000 43999]
|
||||
["44000-46999 Alcohol Sales" 44000 46999]
|
||||
["47000 Merchandise Sales" 47000 47999]
|
||||
["48000 Other Operating Income" 48000 48999]
|
||||
@@ -120,11 +137,27 @@
|
||||
(update :filters (fn [f]
|
||||
(assoc f :location location)))))
|
||||
|
||||
(defn filter-numeric-code [pnl-data from to]
|
||||
(-> pnl-data
|
||||
(update :data (fn [data]
|
||||
(filter
|
||||
#(<= from (or (:numeric-code %) 0) to)
|
||||
data)))
|
||||
(update :filters (fn [f]
|
||||
(assoc f
|
||||
:from-numeric-code from
|
||||
:to-numeric-code to)))))
|
||||
|
||||
(defn filter-categories [pnl-data categories]
|
||||
(update pnl-data :data (fn [data]
|
||||
(mapcat identity
|
||||
((apply juxt categories)
|
||||
(group-by best-category data))))))
|
||||
(if (= 1 (count categories))
|
||||
(let [[from to] (ranges (first categories))]
|
||||
(-> pnl-data
|
||||
(filter-numeric-code from to)))
|
||||
(-> pnl-data
|
||||
(update :data (fn [data]
|
||||
(mapcat identity
|
||||
((apply juxt categories)
|
||||
(group-by best-category data))))))))
|
||||
|
||||
(defn filter-period [pnl-data period]
|
||||
(-> pnl-data
|
||||
@@ -133,16 +166,7 @@
|
||||
(update :filters (fn [f]
|
||||
(assoc f :date-range period)))))
|
||||
|
||||
(defn filter-numeric-code [pnl-data from to]
|
||||
(-> pnl-data
|
||||
(update :data (fn [data]
|
||||
(filter
|
||||
#(<= from (:numeric-code %) to)
|
||||
data)))
|
||||
(update :filters (fn [f]
|
||||
(assoc f
|
||||
:from-numeric-code from
|
||||
:to-numeric-code to)))))
|
||||
|
||||
|
||||
(defn negate [pnl-data types]
|
||||
(update pnl-data :data
|
||||
@@ -172,8 +196,8 @@
|
||||
(merge
|
||||
{:format :dollar
|
||||
:value (aggregate-accounts data)
|
||||
:filters (when (:from-numeric-code (:filters pnl-data)) ;; don't allow filtering when you don't at least filter numeric codes
|
||||
(:filters pnl-data))}
|
||||
:filters (when (:from-numeric-code (:filters data)) ;; don't allow filtering when you don't at least filter numeric codes
|
||||
(:filters data))}
|
||||
cell-args)))
|
||||
(-> pnl-data :args :periods))))
|
||||
|
||||
@@ -206,23 +230,24 @@
|
||||
:value (- (:value b)
|
||||
(:value a))})))))))
|
||||
|
||||
(defn combine-tables [pnl-data table percent-of-sales deltas]
|
||||
(map (fn [[title & row] percent-of-sales deltas ]
|
||||
(let [deltas (cons {:value 0.0
|
||||
:format :dollar
|
||||
:border (:border (first row))} deltas)]
|
||||
(into [title]
|
||||
(mapcat
|
||||
(fn [v p d]
|
||||
(if (:include-deltas (:args pnl-data))
|
||||
[v p d]
|
||||
[v p]))
|
||||
row
|
||||
percent-of-sales
|
||||
deltas))))
|
||||
table
|
||||
percent-of-sales
|
||||
deltas))
|
||||
(defn combine-tables
|
||||
([pnl-data table percent-of-sales deltas]
|
||||
(map (fn [[title & row] percent-of-sales deltas ]
|
||||
(let [deltas (cons {:value 0.0
|
||||
:format :dollar
|
||||
:border (:border (first row))} deltas)]
|
||||
(into [title]
|
||||
(mapcat
|
||||
(fn [v p d]
|
||||
(if (:include-deltas (:args pnl-data))
|
||||
[v p d]
|
||||
[v p]))
|
||||
row
|
||||
percent-of-sales
|
||||
deltas))))
|
||||
table
|
||||
percent-of-sales
|
||||
deltas)))
|
||||
|
||||
(defn headers [pnl-data header-title]
|
||||
(let [big-header (into [{:value header-title
|
||||
@@ -380,6 +405,41 @@
|
||||
(str (-> pnl-data :clients-by-id (get client-id)) " (" location ") Detail")))})
|
||||
|
||||
|
||||
(defn balance-sheet-headers [pnl-data]
|
||||
[(cond-> [{:value "Period Ending"}
|
||||
{:value (:date (:args pnl-data))}]
|
||||
(:include-comparison (:args pnl-data)) (into [{:value (:comparison-date (:args pnl-data))} {:value "+/-"}]))])
|
||||
|
||||
(defn append-deltas [table]
|
||||
(->> table
|
||||
(map (fn [[title a b]]
|
||||
[title a b (and (:value a) (:value b)
|
||||
{:border (:border b)
|
||||
:format :dollar
|
||||
:value (- (:value a)
|
||||
(:value b))})]))))
|
||||
|
||||
(defn summarize-balance-sheet [pnl-data]
|
||||
(println (:periods (:args pnl-data)))
|
||||
(let [table (-> []
|
||||
(into (detail-rows pnl-data
|
||||
:assets
|
||||
"Assets"))
|
||||
(into (detail-rows pnl-data
|
||||
:liabilities
|
||||
"Liabilities"))
|
||||
(into (detail-rows pnl-data
|
||||
:equities
|
||||
"Owner's Equity"))
|
||||
(conj (subtotal-row (-> pnl-data
|
||||
(filter-categories [:sales :cogs :payroll :controllable :fixed-overhead :ownership-controllable])
|
||||
(negate #{:cogs :payroll :controllable :fixed-overhead :ownership-controllable}))
|
||||
"Retained Earnings")))
|
||||
table (if (:include-comparison (:args pnl-data))
|
||||
(append-deltas table)
|
||||
table)]
|
||||
{:header (balance-sheet-headers pnl-data)
|
||||
:rows table}))
|
||||
|
||||
|
||||
(defrecord PNLData [args data client-names])
|
||||
|
||||
Reference in New Issue
Block a user