(ns auto-ap.subs (:require [re-frame.core :as re-frame] [auto-ap.utils :refer [by]] [clojure.string :as str] [goog.crypt.base64 :as base64])) (re-frame/reg-sub ::client (fn [db] (get (:clients db) (:client db)))) (re-frame/reg-sub ::clients (fn [db] (when (:user db) (sort-by :name (vals (:clients db)))))) (re-frame/reg-sub ::all-accounts (fn [db] (:accounts db))) (re-frame/reg-sub ::all-accounts-by-id (fn [db] (by :id (:accounts db)))) (defn clientize-account [account client] (let [override (->> (:client-overrides account) (filter (fn [co] (= (:id (:client co)) (:id client)))) first)] (condp = (:applicability account) nil (assoc account :name (or (:name override) (:name account))) :global (assoc account :name (or (:name override) (:name account))) :optional (when override (assoc account :name (or (:name override) (:name account)))) :customized (when override (assoc account :name (or (:name override) (:name account))))))) (re-frame/reg-sub ::accounts :<- [::all-accounts] :<- [::client] (fn [[accounts client] [_ client-override]] (transduce (comp (map #(clientize-account % (or client-override client))) (filter identity)) conj [] accounts))) (re-frame/reg-sub ::account (fn [[_ client]] [(re-frame/subscribe [::accounts-by-id client])]) (fn [[as] [_ _ i]] (as i))) (defn accounts-by-id [accounts client] (by :id (map #(clientize-account % client) accounts))) (re-frame/reg-sub ::accounts-by-id :<- [::accounts] :<- [::client] (fn [[accounts client] [_ client-override]] (accounts-by-id accounts (or client-override client)))) (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 ::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 ::menu (fn [db] (:menu db))) (re-frame/reg-sub ::modal-state (fn [db [_ id status-from]] (if status-from (assoc (get (:modal-state db) id) :error-message (get-in db [:auto-ap.forms/forms status-from :error]) :saving? (= (get-in db [:auto-ap.forms/forms status-from :status]) :loading)) (get (:modal-state db) id)))) (re-frame/reg-sub ::token (fn [db] (:user db))) (re-frame/reg-sub ::vendors :<- [::is-admin?] :<- [::all-vendors] (fn [[is-admin all-vendors]] (filter #(or (not (:hidden %)) is-admin) all-vendors))) (re-frame/reg-sub ::all-vendors (fn [db] (vals (:vendors db)))) (re-frame/reg-sub ::vendors-by-id (fn [db] (:vendors db))) (re-frame/reg-sub ::vendor-default-account (fn [db [_ v client]] (let [accounts (accounts-by-id (:accounts db) client) vendor (if (:default-account v) v (-> (:vendors db) (get v))) client-override (->> (:account-overrides vendor) (filter #(= (:id (:client %)) (:id client)) ) first :account :id) default-id (:id (:default-account v)) i (or client-override default-id)] (accounts i)))) (re-frame/reg-sub ::sorted-vendors :<- [::vendors] (fn [vendors] (sort-by :name vendors))) (re-frame/reg-sub ::sorted-all-vendors :<- [::all-vendors] (fn [all-vendors] (sort-by :name all-vendors))) (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 ::user (fn [db] (when (:user db) (js->clj (.parse js/JSON (base64/decodeString (second (str/split (:user db) #"\.")))) :keywordize-keys true)))) (re-frame/reg-sub ::active-page (fn [db] (:active-page db))) (re-frame/reg-sub ::pending-invoices (fn [db] (:pending (:invoices db)))) (re-frame/reg-sub ::status (fn [db] (:status db))) (re-frame/reg-sub ::new-invoice-form (fn [db] (:new-invoice db))) (re-frame/reg-sub ::query-params (fn [db] (:query-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))))) (re-frame/reg-sub ::yodlee-merchants (fn [db] (:yodlee-merchants db)))