Files
integreat/src/cljs/auto_ap/subs.cljs

207 lines
4.6 KiB
Clojure

#_{:clj-kondo/ignore [:unused-namespace]}
(ns auto-ap.subs
(:require [re-frame.core :as re-frame]
[auto-ap.utils :refer [by]]
[auto-ap.views.utils :refer [parse-jwt]]
[clojure.string :as str]
[goog.crypt.base64 :as base64]
[minisearch :as ms]
[clojure.set :as set]))
(set! *warn-on-infer* true)
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var :unresolved-symbol]}
(def MiniSearch (if ms (aget ms "default")
nil))
(re-frame/reg-sub
::client
:<- [::selected-clients]
(fn [selected-clients]
(println "SELECTED CLIENTS ARE" selected-clients)
(when (= 1 (count selected-clients))
(first selected-clients))))
(re-frame/reg-sub
::clients
(fn [db]
(when (:user db)
(sort-by :name (vals (:clients db))))))
(re-frame/reg-sub
::selected-clients-raw
(fn [db]
(:selected-clients db)))
(defn coerce-string-version [x]
(if (string? x)
(js/parseInt x)
x))
(re-frame/reg-sub
::selected-clients
:<- [::selected-clients-raw]
:<- [::user]
:<- [::clients]
(fn [[selected-clients user clients]]
(println "SELECTED" selected-clients
"USER" user
"CLIENTS" clients)
(cond (= :mine selected-clients)
(sort-by :name
(:user/clients user))
(or (and (sequential? selected-clients)
(empty? selected-clients))
(= :all selected-clients)
(nil? selected-clients))
clients
(sequential? selected-clients)
(filter (comp (set (map coerce-string-version selected-clients)) coerce-string-version :id)
clients)
:else
nil)))
(re-frame/reg-sub
::client-refs
:<- [::clients]
(fn [c]
(map #(select-keys % [:id :name]) c)))
(re-frame/reg-sub
::bank-accounts
:<- [::clients]
:<- [::client]
(fn [[clients client]]
(if client
(:bank-accounts client)
(reduce (fn [result {:keys [bank-accounts]}]
(into result bank-accounts))
[]
clients))))
(re-frame/reg-sub
::bank-accounts-by-id
:<- [::bank-accounts]
(fn [as]
(by :id as)))
;; Bank accounts only, not including cash
(re-frame/reg-sub
::real-bank-accounts
:<- [::client]
(fn [client]
(->> client :bank-accounts (filter #(= (:type %) :check)) (sort-by :sort-order))))
(re-frame/reg-sub
::real-bank-accounts-for-client
(fn [db [_ {:keys [id]}]]
(sort-by :sort-order (-> db :clients (get id) :bank-accounts ))))
(re-frame/reg-sub
::locations-for-client
(fn [db [_ client]]
(:locations (get (:clients db) (or client (:client db))))))
(re-frame/reg-sub
::forecasted-transactions-for-client
(fn [db [_ client]]
(:forecasted-transactions (get (:clients db) (or client (:client db))))))
(re-frame/reg-sub
::locations-for-client-or-bank-account
(fn [db [_ client-id bank-account-id]]
(let [client (get (:clients db) (or client-id (:client db)))
client-locations (:locations client)
bank-account-locations (-> (by :id (:bank-accounts client))
(get bank-account-id)
:locations)]
(or (seq bank-account-locations) client-locations))))
(re-frame/reg-sub
::clients-by-id
(fn [db]
(when (:user db)
(:clients db))))
(re-frame/reg-sub
::menu-active?
(fn [db [_ id]]
(-> db :menu (get id) :active?)))
(re-frame/reg-sub
::is-initial-loading?
(fn [db]
(:is-initial-loading? db)))
(re-frame/reg-sub
::intuit-bank-accounts
(fn [db]
(::intuit-bank-accounts db)))
(re-frame/reg-sub
::token
(fn [db]
(:user db)))
(re-frame/reg-sub
::admin
(fn [db]
(:admin db)))
(re-frame/reg-sub
::is-admin?
:<- [::user]
(fn [user]
(= "admin" (:user/role user))))
(re-frame/reg-sub
::is-power-user?
:<- [::user]
(fn [user]
(or (= "power-user" (:user/role user))
(= "power_user" (:user/role user)))))
(re-frame/reg-sub
::user
(fn [db]
(parse-jwt (:user db))))
(re-frame/reg-sub
::active-route
(fn [db]
(:active-route db)))
(re-frame/reg-sub
::active-page
:<- [::active-route]
(fn [route]
(or ({:admin-specific-client :admin-clients
:admin-specific-bank-account :admin-clients}
route)
route)))
(re-frame/reg-sub
::query-params
(fn [db]
(:query-params db)))
(re-frame/reg-sub
::route-params
(fn [db]
(:route-params db)))
(re-frame/reg-sub
::page-failure
(fn [db]
(when-let [error (-> db :page-failure first)]
(if (= 500 (:status error))
"System error occured. If you are stuck, please notify ben@integreatconsult.com."
(:message error)))))