import { getAdminActiveUserKpiCounts, getAdminTenantKpiCounts } from "@toolctrl/db/kpi.server"; import { Stat } from "~/application/dtos/stats/Stat"; import currencies from "~/application/pricing/currencies"; import { getStatChangeType } from "../app/DashboardUtils"; import NumberUtils from "../shared/NumberUtils"; import { getMrr } from "./.server/subscriptionService"; import { promiseHash } from "../promises/promiseHash"; import { adminPath } from "~/utils/app/CanonicalUrlUtils"; type AdminDashboardStatsOptions = { t: (key: string) => string; gte?: Date; }; export async function getAdminDashboardStats({ t, gte }: AdminDashboardStatsOptions): Promise { const { tenantStat, mrrStat, activeUsersStat } = await promiseHash({ tenantStat: getTenantStat({ t, gte }), mrrStat: getMMRStat(t), activeUsersStat: getActiveUsersStat({ t, gte }), }); return [tenantStat, mrrStat, activeUsersStat]; } async function getTenantStat({ t, gte }: AdminDashboardStatsOptions) { const { added, total } = await getAdminTenantKpiCounts({ gte }); const tenantStat: Stat = { name: t("admin.kpi.accounts.name"), hint: t("admin.kpi.accounts.hint"), stat: total.toString(), previousStat: (total - added).toString(), change: "+" + added.toString(), changeType: getStatChangeType(added, total), path: adminPath("accounts", { mode: "host-aware" }), }; return tenantStat; } async function getMMRStat(t: AdminDashboardStatsOptions["t"]) { const defaultCurrency = currencies.find((f) => f.default); const currency = defaultCurrency ?? { value: "usd", symbol: "$" }; const mrr = await getMrr(currency.value); const tenantStat: Stat = { name: t("admin.kpi.mrr.name"), hint: t("admin.kpi.mrr.hint"), stat: currency.symbol + NumberUtils.decimalFormat(mrr.total), previousStat: t("admin.kpi.mrr.previousStat").replace("{{0}}", NumberUtils.intFormat(mrr.count)), }; return tenantStat; } async function getActiveUsersStat({ t, gte }: AdminDashboardStatsOptions) { const { added, total } = await getAdminActiveUserKpiCounts({ gte }); const activeUsersStat: Stat = { name: t("admin.kpi.activeUsers.name"), hint: t("admin.kpi.activeUsers.hint"), stat: total.toString(), previousStat: (total - added).toString(), change: "+" + added.toString(), changeType: getStatChangeType(added, total), }; return activeUsersStat; }