diff --git a/src/cljc/auto_ap/ledger/reports.cljc b/src/cljc/auto_ap/ledger/reports.cljc index 38ff0fb1..2d47a1ae 100644 --- a/src/cljc/auto_ap/ledger/reports.cljc +++ b/src/cljc/auto_ap/ledger/reports.cljc @@ -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"}