cash flows
This commit is contained in:
@@ -16,22 +16,21 @@
|
||||
[auto-ap.ssr.components :as com]
|
||||
[auto-ap.ssr.form-cursor :as fc]
|
||||
[auto-ap.ssr.hx :as hx]
|
||||
[auto-ap.ssr.ledger.report-table :as rtable]
|
||||
[auto-ap.ssr.svg :as svg]
|
||||
[auto-ap.ssr.ui :refer [base-page]]
|
||||
[auto-ap.ssr.utils
|
||||
:refer [apply-middleware-to-all-handlers clj-date-schema
|
||||
html-response modal-response unspecified-transformer
|
||||
wrap-form-4xx-2 wrap-merge-prior-hx wrap-schema-enforce]]
|
||||
html-response modal-response wrap-form-4xx-2
|
||||
wrap-schema-enforce]]
|
||||
[auto-ap.time :as atime]
|
||||
[bidi.bidi :as bidi]
|
||||
[clj-pdf.core :as pdf]
|
||||
[clj-time.coerce :as coerce]
|
||||
[clj-time.core :as t]
|
||||
[clojure.java.io :as io]
|
||||
[clojure.string :as str]
|
||||
[config.core :refer [env] :as env]
|
||||
[datomic.api :as dc]
|
||||
[hiccup.util :as hu]
|
||||
[iol-ion.utils :refer [by]]
|
||||
[malli.core :as mc])
|
||||
(:import
|
||||
@@ -40,29 +39,6 @@
|
||||
|
||||
|
||||
|
||||
(def default-read
|
||||
'[:journal-entry/amount
|
||||
:journal-entry/alternate-description
|
||||
:journal-entry/source
|
||||
:journal-entry/external-id
|
||||
:db/id
|
||||
[:journal-entry/date :xform clj-time.coerce/from-date]
|
||||
{:journal-entry/vendor [:vendor/name :db/id]
|
||||
:journal-entry/original-entity [:invoice/invoice-number
|
||||
:invoice/source-url
|
||||
:transaction/description-original :db/id]
|
||||
:journal-entry/client [:client/name :client/code :db/id]
|
||||
:journal-entry/line-items [:journal-entry-line/debit
|
||||
:journal-entry-line/location
|
||||
:journal-entry-line/running-balance
|
||||
:journal-entry-line/credit
|
||||
{:journal-entry-line/account [:account/name :db/id :account/numeric-code
|
||||
:bank-account/name :bank-account/numeric-code
|
||||
{[:account/type :xform iol-ion.query/ident] [:db/ident :db/id]}
|
||||
{:account/client-overrides [:account-client-override/name
|
||||
{:account-client-override/client [:db/id]}]}
|
||||
{[:bank-account/type :xform iol-ion.query/ident]
|
||||
[:db/ident :db/id]}]}]}])
|
||||
|
||||
|
||||
(def query-schema (mc/schema
|
||||
@@ -78,126 +54,6 @@
|
||||
:decode/string (fn [s] (if (string? s) (str/split s #", ")
|
||||
s))}
|
||||
clj-date-schema]] ]]))
|
||||
|
||||
|
||||
|
||||
(defn cell [{:keys [width investigate-url other-style]} c]
|
||||
(let [cell-contents (cond
|
||||
|
||||
(= :dollar (:format c))
|
||||
(format "$%,.2f" (if (iol-ion.query/dollars-0? (:value c))
|
||||
0.0
|
||||
(:value c)))
|
||||
|
||||
|
||||
(= :percent (:format c))
|
||||
(format "%%%.1f" (if (iol-ion.query/dollars-0? (:value c))
|
||||
0.0
|
||||
(:value c)))
|
||||
|
||||
:else
|
||||
(str (:value c)))
|
||||
cell-contents (if (:filters c)
|
||||
(com/link {:hx-get (hu/url investigate-url
|
||||
(cond-> {}
|
||||
(:numeric-code (:filters c)) (assoc :numeric-code (into [] (:numeric-code (:filters c))))
|
||||
;; TODO
|
||||
#_#_(:date-range (:filters c)) (assoc :end-date (atime/unparse-local (:date-range (:filters c))
|
||||
atime/normal-date))
|
||||
(:client-id (:filters c)) (assoc :client-id (:client-id (:filters c))))
|
||||
)}
|
||||
cell-contents)
|
||||
cell-contents)]
|
||||
[:td.px-4.py-2
|
||||
(cond-> {:style (cond-> {:width (str width "em")}
|
||||
other-style (merge other-style))}
|
||||
|
||||
(:border c) (update :style
|
||||
(fn [s]
|
||||
(->> (:border c)
|
||||
(map
|
||||
(fn [b]
|
||||
[(keyword (str "border-" (name b))) "1px solid black"])
|
||||
)
|
||||
(into s))))
|
||||
(:colspan c) (assoc :col-span (:colspan c))
|
||||
(:align c) (assoc :align (:align c))
|
||||
(= :dollar (:format c)) (assoc :align :right)
|
||||
(= :percent (:format c)) (assoc :align :right)
|
||||
(:bold c) (assoc-in [:style :font-weight] "bold")
|
||||
(:color c) (assoc-in [:style :color] (str "rgb("
|
||||
(str/join ","
|
||||
(:color c))
|
||||
")"))
|
||||
true (assoc-in [:style :background-color] (str "rgb("
|
||||
(str/join ","
|
||||
(or (:bg-color c) [255 255 255]))
|
||||
")")))
|
||||
|
||||
cell-contents]))
|
||||
|
||||
(defn cell-count [table]
|
||||
(let [counts (map count (:rows table))]
|
||||
(if (seq counts)
|
||||
(apply max counts)
|
||||
0)))
|
||||
|
||||
(defn table [{:keys [table widths investigate-url warning]}]
|
||||
(let [cell-count (cell-count table)]
|
||||
(com/content-card {:class "inline-block overflow-scroll"}
|
||||
[:div {:class "overflow-scroll h-[70vh] m-4 inline-block"}
|
||||
(when warning [:div.rounded.bg-red-50.text-red-800.p-4.m-2
|
||||
warning])
|
||||
(-> [:table {:class "text-sm text-left text-gray-500 dark:text-gray-400"}
|
||||
[:thead {:class "text-xs text-gray-800 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400 font-bold"}
|
||||
(map
|
||||
(fn [header-row header]
|
||||
(into
|
||||
[:tr {:class " dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700"}]
|
||||
(map
|
||||
(fn [w header i]
|
||||
(cell {:width w
|
||||
:investigate-url investigate-url
|
||||
:other-style {:position "sticky"
|
||||
:top (* header-row (+ 22 18))}} header))
|
||||
widths
|
||||
header
|
||||
(range))))
|
||||
(range)
|
||||
(:header table))]]
|
||||
|
||||
(conj
|
||||
(-> [:tbody {:style {}}]
|
||||
(into
|
||||
(for [[i row] (map vector (range) (:rows table))]
|
||||
|
||||
[:tr {:class " dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700"}
|
||||
(for [[i c] (map vector (range) (take cell-count
|
||||
(reduce
|
||||
(fn [[acc cnt] cur]
|
||||
(if (>= (+ cnt (:colspan cur 1)) cell-count)
|
||||
(reduced (conj acc cur))
|
||||
[(conj acc cur) (+ cnt (:colspan cur 1))]))
|
||||
[[] 0]
|
||||
(concat row (repeat nil)))))]
|
||||
|
||||
(cell {:investigate-url investigate-url} c))]))
|
||||
(conj [:tr (for [i (range cell-count)]
|
||||
|
||||
(cell {:investigate-url investigate-url} {:value " "}))]))))])))
|
||||
|
||||
(defn concat-tables [tables]
|
||||
(let [[first & rest] tables]
|
||||
{:header (:header first)
|
||||
:rows (concat (:rows first)
|
||||
[[]]
|
||||
(mapcat
|
||||
(fn [table]
|
||||
(-> (:header table)
|
||||
(into (:rows table))
|
||||
(conj [])))
|
||||
rest))}))
|
||||
|
||||
;; TODO
|
||||
;; 1. Rerender form when running
|
||||
;; 2. Don't throw crazy errors when missing a field
|
||||
@@ -257,7 +113,7 @@
|
||||
client-count (count (set (map :client-id (:data data)))) ]
|
||||
(list
|
||||
[:div.text-2xl.font-bold.text-gray-600 (str "Balance Sheet - " (str/join ", " (map :client/name client))) ]
|
||||
(table {:widths (cond-> (into [30 ] (repeat 13 client-count))
|
||||
(rtable/table {:widths (cond-> (into [30 ] (repeat 13 client-count))
|
||||
(> (count date) 1) (into (repeat 13 (* 2 client-count (dec (count date))))))
|
||||
:investigate-url (bidi.bidi/path-for ssr-routes/only-routes ::route/investigate)
|
||||
:table report
|
||||
@@ -314,7 +170,7 @@
|
||||
[:template {:x-ref "tooltip"}
|
||||
[:div.p-4 {:class "bg-gray-100 dark:bg-gray-600 rounded-lg shadow-2xl w-max z-50 ring-1 p-4"}
|
||||
[:div.flex.flex-col.gap-2
|
||||
(com/multi-date-input {:placeholder "12/21/2020"
|
||||
(com/multi-calendar-input {:placeholder "12/21/2020"
|
||||
:x-model "dates" })
|
||||
(com/a-button {"@click" "dates=getFourWeekPeriods(dates[dates.length -1])"} "13 periods")
|
||||
(com/a-button {"@click" "dates=withLastYear(dates[dates.length -1])"} "Add prior year")
|
||||
@@ -386,7 +242,6 @@
|
||||
name (balance-sheet-args->name request)
|
||||
key (str "reports/balance-sheet/" uuid "/" name ".pdf")
|
||||
url (str "https://" (:data-bucket env) "/" key)]
|
||||
(println "CLIENT IS" client)
|
||||
(s3/put-object :bucket-name (:data-bucket env/env)
|
||||
:key key
|
||||
:input-stream (io/make-input-stream pdf-data {})
|
||||
|
||||
Reference in New Issue
Block a user