@fayz-ai/admin 0.52.0 → 0.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ScheduleEditor-YGZQX3X2.js +6 -0
- package/dist/{ScheduleEditor-6YFOBHAE.js.map → ScheduleEditor-YGZQX3X2.js.map} +1 -1
- package/dist/SubscriptionPage-WW272QQZ.js +8 -0
- package/dist/{SubscriptionPage-DI6UV5LF.js.map → SubscriptionPage-WW272QQZ.js.map} +1 -1
- package/dist/billing/index.js +3 -3
- package/dist/{chunk-4RKG7YH5.js → chunk-JOBRLBIQ.js} +3 -3
- package/dist/{chunk-4RKG7YH5.js.map → chunk-JOBRLBIQ.js.map} +1 -1
- package/dist/{chunk-DASJ4UF3.js → chunk-KPYRTOCK.js} +3 -3
- package/dist/{chunk-DASJ4UF3.js.map → chunk-KPYRTOCK.js.map} +1 -1
- package/dist/{chunk-TAN7UGC2.js → chunk-OMRPCQR6.js} +5 -5
- package/dist/{chunk-TAN7UGC2.js.map → chunk-OMRPCQR6.js.map} +1 -1
- package/dist/{chunk-3S7UULIC.js → chunk-OQARLKZN.js} +4 -4
- package/dist/{chunk-3S7UULIC.js.map → chunk-OQARLKZN.js.map} +1 -1
- package/dist/{chunk-XQM74EP4.js → chunk-P6XUDT2P.js} +6 -3
- package/dist/chunk-P6XUDT2P.js.map +1 -0
- package/dist/{chunk-EOYE3ZAC.js → chunk-ZB3XIZIK.js} +3 -3
- package/dist/{chunk-EOYE3ZAC.js.map → chunk-ZB3XIZIK.js.map} +1 -1
- package/dist/crud/archetypes/OrderDetailPage.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderDetailRail.d.ts +2 -0
- package/dist/crud/archetypes/OrderDetailRail.d.ts.map +1 -1
- package/dist/data/client.d.ts +2 -0
- package/dist/data/client.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -17
- package/dist/index.js.map +1 -1
- package/dist/org/index.js +2 -2
- package/package.json +5 -5
- package/dist/ScheduleEditor-6YFOBHAE.js +0 -6
- package/dist/SubscriptionPage-DI6UV5LF.js +0 -8
- package/dist/chunk-XQM74EP4.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/billing/plan-feature.tsx","../src/access/limits-registry.ts","../src/access/upgrade-modal-store.ts","../src/access/context.tsx","../src/components/billing/access-contract.ts","../src/app/useAppPreset.ts","../src/components/billing/AiUsageSection.tsx","../src/billing/module-families.ts","../src/components/billing/PlanCheckoutSheet.tsx","../src/components/billing/PricingOverview.tsx","../src/app/app-config-cache.ts","../src/hooks/useAppConfig.ts","../src/components/billing/SubscriptionPage.tsx"],"names":["jsx","useMemo","React2","jsxs","Sparkles","money","formatCurrency","tl","usePluginRuntimeOptional","React3","Fragment","Button","Check","React4","list","Card","CardContent","AlertCircle","Breakdown","Sheet","SheetContent","SheetHeader","SheetTitle","SheetDescription","SheetBody","ChevronDown","useCallback","useEffect","error","React5","toast","invalidateAppConfig"],"mappings":"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","file":"chunk-TAN7UGC2.js","sourcesContent":["import * as React from 'react'\nimport { Check, Sparkles } from 'lucide-react'\nimport { cn } from '../../lib/cn'\n\n// A plan feature string prefixed with `*` renders highlighted (Sparkles on a\n// faint violet chip) — the config-side seam for \"hero\" features like the AI\n// assistant. Shared by UpgradePrompt, PlanSelector and the pricing cards.\n// violet-700 on violet-50 and violet-200 on violet-950 both clear AA (≥ 6:1).\n\nexport function parsePlanFeature(feature: string): { label: string; highlighted: boolean } {\n return feature.startsWith('*')\n ? { label: feature.slice(1).trim(), highlighted: true }\n : { label: feature, highlighted: false }\n}\n\nexport function PlanFeatureItem({ feature, className, iconClassName }: {\n feature: string\n className?: string\n iconClassName?: string\n}) {\n const { label, highlighted } = parsePlanFeature(feature)\n return (\n <li className={cn('flex items-start gap-2', className,\n highlighted && '-mx-1.5 rounded-md bg-violet-50 px-1.5 py-1 font-medium text-violet-700 dark:bg-violet-950/60 dark:text-violet-200')}>\n {highlighted ? (\n <Sparkles className={cn('mt-0.5 shrink-0 text-violet-600 dark:text-violet-300', iconClassName)} aria-hidden=\"true\" />\n ) : (\n <Check className={cn('mt-0.5 shrink-0 text-primary', iconClassName)} aria-hidden=\"true\" />\n )}\n <span>{label}</span>\n </li>\n )\n}\n","import type { LimitDeclaration, RegisteredEntity } from '@fayz-ai/core'\nimport { invalidateCount } from '@fayz-ai/core'\n\n/**\n * Module-level registry bridging React (the provider that knows the declarations)\n * and the plain `invalidateLimit(key)` function that create handlers call outside\n * any component. The AccessProvider publishes the merged declarations here on\n * mount; `useLimit`/`useLimitGuard` and `invalidateLimit` read from it.\n */\n\n/**\n * Shell built-in limit declarations. Unlike plugin/app limits (contributed via\n * `PluginManifest.declaredLimits` / `billing.limitDeclarations`), these count\n * core tenant tables that have no owning plugin: seats and units. Merged as the\n * LOWEST-priority layer by the AccessProvider, so a plugin or app may still\n * override a key (e.g. add a `kindFilter`).\n *\n * Counted through the public `v_*` bridges, not the base tables: the spine\n * moved memberships and units into schema `app`, which PostgREST cannot reach.\n */\nexport const CORE_LIMIT_DECLARATIONS: LimitDeclaration[] = [\n { key: 'users', label: 'Users', table: 'v_team_members' },\n { key: 'locations', label: 'Companies', table: 'v_units' },\n]\n\n/**\n * Entity-derived layer of the limit merge: any registered CRUD entity carrying\n * `limitKey` yields a declaration for free from its own data mapping (table +\n * archetype kind) — a cap without a countable binding is a dead cap. Shared by\n * the AccessProvider (live registry) and the manifest derivation (agent\n * contract), so both resolve the identical layer.\n */\nexport function entityDerivedLimitDeclarations(entities: RegisteredEntity[]): LimitDeclaration[] {\n const out: LimitDeclaration[] = []\n for (const e of entities) {\n const def = e.entityDef\n if (def?.limitKey && def.data?.table) {\n out.push({\n key: def.limitKey,\n label: e.labelPlural,\n table: def.data.table,\n kindFilter: def.data.archetypeKind,\n })\n }\n }\n return out\n}\n\nlet registry = new Map<string, LimitDeclaration>()\n\n/** Called by AccessProvider whenever the merged limit declarations change. */\nexport function setLimitRegistry(declarations: LimitDeclaration[]): void {\n const next = new Map<string, LimitDeclaration>()\n for (const decl of declarations) next.set(decl.key, decl)\n registry = next\n}\n\nexport function getLimitDeclaration(key: string): LimitDeclaration | undefined {\n return registry.get(key)\n}\n\n// --- Invalidation pub/sub -------------------------------------------------\n// useLimit subscribes per key; invalidateLimit(key) drops the cached count for\n// the declaration's table and notifies subscribers to re-fetch.\n\nconst listeners = new Map<string, Set<() => void>>()\n\nexport function subscribeLimit(key: string, cb: () => void): () => void {\n let set = listeners.get(key)\n if (!set) {\n set = new Set()\n listeners.set(key, set)\n }\n set.add(cb)\n return () => {\n set?.delete(cb)\n if (set && set.size === 0) listeners.delete(key)\n }\n}\n\n/**\n * Invalidate a limit after a create/delete so its next read is fresh, then wake\n * any mounted `useLimit(key)`. Safe to call from plain handlers (no React).\n */\nexport function invalidateLimit(key: string): void {\n const decl = registry.get(key)\n if (decl) invalidateCount(decl.table)\n listeners.get(key)?.forEach((cb) => cb())\n}\n","import { create } from 'zustand'\n\n/**\n * Payload describing WHY the upgrade modal opened, so the visual component (owned\n * by the shell/gates layer) can tailor its copy — a hit quantity cap\n * (`limitKey`) or a plan-gated feature (`feature`).\n */\nexport interface UpgradeModalPayload {\n limitKey?: string\n feature?: string\n}\n\nexport interface UpgradeModalStore {\n /** The active payload, or null when closed. */\n current: UpgradeModalPayload | null\n open(payload: UpgradeModalPayload): void\n close(): void\n}\n\n/**\n * Global, lightweight store for the single app-wide UpgradeModal. `useLimitGuard`\n * and imperative create handlers call `open(...)` when a limit blocks; the visual\n * modal (rendered once near the shell root by the gates layer) subscribes to\n * `current`. Kept as a zustand singleton so store + component share one instance.\n */\nexport const useUpgradeModalStore = create<UpgradeModalStore>((set) => ({\n current: null,\n open: (payload) => set({ current: payload }),\n close: () => set({ current: null }),\n}))\n","import * as React from 'react'\nimport type { LimitDeclaration, PermissionAction, Plan } from '@fayz-ai/core'\nimport { countByTenant, usePluginRuntimeOptional, getAllEntities } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../org/store'\nimport { usePermissionsStore } from '../permissions/store'\nimport { useBillingStore } from '../billing/store'\nimport { effectivePlan, useTrial } from '../billing/trial'\nimport { mergeLimitDeclarations, resolveAccess, isEntitledByPlan, resolveLimit } from '@fayz-ai/core/access'\nimport { entityDerivedLimitDeclarations } from './limits-registry'\nimport { setLimitRegistry, getLimitDeclaration, subscribeLimit, CORE_LIMIT_DECLARATIONS } from './limits-registry'\nimport { useUpgradeModalStore } from './upgrade-modal-store'\nimport type { AccessApi, AccessDecision, AccessSession, LimitState } from './types'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface AccessContextValue extends AccessApi {\n session: AccessSession\n}\n\nconst AccessContext = React.createContext<AccessContextValue | null>(null)\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface AccessProviderProps {\n children: React.ReactNode\n /**\n * App-level limit declarations layered ON TOP of the plugins' `declaredLimits`\n * (app wins on key collision). Sourced from `config.billing.limitDeclarations`.\n */\n limitDeclarations?: LimitDeclaration[]\n /** Plan the tenant is entitled to while its trial runs. See billing/trial.ts. */\n trialPlanId?: string\n}\n\n/**\n * Assembles the reactive {@link AccessSession} from the singleton stores and\n * exposes the composed access API (role × plan). Thin by design — mounts just\n * inside PermissionsProvider so it can reuse the live permission profile and the\n * plugin runtime. Also publishes the merged limit declarations to the module\n * registry so `invalidateLimit` works from non-React create handlers.\n */\nexport function AccessProvider({ children, limitDeclarations, trialPlanId }: AccessProviderProps) {\n const user = useAuthStore((s) => s.user)\n const org = useOrganizationStore((s) => s.currentOrg)\n const profile = usePermissionsStore((s) => s.currentProfile)\n const plans = useBillingStore((s) => s.plans)\n\n const runtime = usePluginRuntimeOptional()\n const pluginLimits = runtime?.pluginLimits\n\n // Merge limit declarations by priority (later wins by key): shell built-ins\n // (users/locations) < entity-derived < plugin `declaredLimits` < app\n // overrides. Then publish to the module registry consumed by\n // invalidateLimit / the limit hooks.\n //\n // Entity-derived: any registered CRUD entity carrying `limitKey` yields a\n // declaration for free from its own data mapping (table + archetype kind) —\n // this is what makes an app's `EntityDef.limitKey: 'clients'` enforceable\n // with ZERO extra wiring (a cap without a countable binding is a dead cap).\n React.useEffect(() => {\n setLimitRegistry(\n mergeLimitDeclarations(\n CORE_LIMIT_DECLARATIONS,\n entityDerivedLimitDeclarations(getAllEntities()),\n pluginLimits,\n limitDeclarations,\n ),\n )\n }, [pluginLimits, limitDeclarations])\n\n // The trial is resolved HERE and nowhere else: it changes which plan's\n // entitlements apply, and every gate in the product already reads that. A\n // per-feature \"…or on trial\" check would have to be repeated in the nav, the\n // gates, the caps and the assistant, and one of them would be forgotten.\n const trial = useTrial()\n const plan: Plan | null = React.useMemo(\n () => effectivePlan(org, plans, trial, trialPlanId),\n [plans, org?.plan, trial.status, trialPlanId],\n )\n\n const session: AccessSession = React.useMemo(\n () => ({ user, org, profile, plan }),\n [user, org, profile, plan],\n )\n\n const value = React.useMemo<AccessContextValue>(\n () => ({\n session,\n can: (feature, action) => resolveAccess(session, feature, action),\n entitled: (feature) => isEntitledByPlan(session.plan, feature),\n }),\n [session],\n )\n\n return <AccessContext.Provider value={value}>{children}</AccessContext.Provider>\n}\nAccessProvider.displayName = 'AccessProvider'\n\n// ---------------------------------------------------------------------------\n// Hooks\n// ---------------------------------------------------------------------------\n\nconst ALLOW_ALL: AccessApi = {\n can: () => ({ allowed: true }),\n entitled: () => true,\n}\n\n/**\n * The composed access API. Throws outside <AccessProvider> — use\n * {@link useAccessOptional} for SDK components that must degrade gracefully.\n */\nexport function useAccess(): AccessApi {\n const ctx = React.useContext(AccessContext)\n if (!ctx) throw new Error('useAccess must be used inside <AccessProvider>')\n return { can: ctx.can, entitled: ctx.entitled }\n}\n\n/**\n * Like {@link useAccess} but degrades to allow-all when no provider is mounted,\n * so components stay usable under a bare host shell (gating is an enhancement).\n */\nexport function useAccessOptional(): AccessApi {\n const ctx = React.useContext(AccessContext)\n return ctx ? { can: ctx.can, entitled: ctx.entitled } : ALLOW_ALL\n}\n\n/** Internal: the live session (for hooks that need tenant/plan directly). */\nfunction useAccessSession(): AccessSession | null {\n return React.useContext(AccessContext)?.session ?? null\n}\n\n// ---------------------------------------------------------------------------\n// Limits\n// ---------------------------------------------------------------------------\n\nfunction resolveCap(plan: Plan | null, key: string): number | undefined {\n return plan?.entitlements?.limits?.[key]\n}\n\n/**\n * Live usage of a quantity limit for the active tenant. Resolves the limit's\n * declaration (plugin manifest or app override) → a tenant-scoped `count(*)`,\n * capped by the current plan. No declaration or no cap (or `-1`) ⇒ unlimited.\n * Re-fetches when the tenant, plan cap, or an `invalidateLimit(key)` fires.\n */\nexport function useLimit(key: string): LimitState {\n const session = useAccessSession()\n const tenantId = session?.org?.id\n const cap = resolveCap(session?.plan ?? null, key)\n const declaration = getLimitDeclaration(key)\n\n const unlimited = !declaration || cap === undefined || cap === -1\n\n const [used, setUsed] = React.useState(0)\n const [loading, setLoading] = React.useState(!unlimited)\n const [version, setVersion] = React.useState(0)\n\n const refresh = React.useCallback(() => setVersion((v) => v + 1), [])\n\n // Wake on external invalidation (a create/delete elsewhere).\n React.useEffect(() => subscribeLimit(key, refresh), [key, refresh])\n\n React.useEffect(() => {\n if (unlimited || !declaration || !tenantId) {\n setUsed(0)\n setLoading(false)\n return\n }\n let active = true\n setLoading(true)\n countByTenant(declaration.table, {\n kind: declaration.kindFilter,\n period: declaration.period,\n tenantId,\n fresh: version > 0,\n })\n .then((n) => {\n if (active) {\n setUsed(n)\n setLoading(false)\n }\n })\n .catch(() => {\n if (active) setLoading(false)\n })\n return () => {\n active = false\n }\n }, [unlimited, declaration, tenantId, version])\n\n const bounds = resolveLimit({ cap, hasDeclaration: Boolean(declaration), used })\n\n return { key, ...bounds, loading, refresh }\n}\n\n/**\n * Imperative guard for create handlers: `await guard(n)` returns `'ok'` when\n * adding `n` more rows stays within the cap, or `'blocked'` (and opens the global\n * UpgradeModal) when it would exceed it. Always checks a FRESH count so it never\n * relies on stale hook state.\n */\nexport function useLimitGuard(key: string): (n?: number) => Promise<'ok' | 'blocked'> {\n const session = useAccessSession()\n const tenantId = session?.org?.id\n const plan = session?.plan ?? null\n const openModal = useUpgradeModalStore((s) => s.open)\n\n return React.useCallback(\n async (n = 1) => {\n const cap = resolveCap(plan, key)\n const declaration = getLimitDeclaration(key)\n // Unlimited / no declaration / no tenant ⇒ never block.\n if (!declaration || cap === undefined || cap === -1 || !tenantId) return 'ok'\n\n const used = await countByTenant(declaration.table, {\n kind: declaration.kindFilter,\n period: declaration.period,\n tenantId,\n fresh: true,\n })\n\n if (used + n > cap) {\n openModal({ limitKey: key })\n return 'blocked'\n }\n return 'ok'\n },\n [key, plan, tenantId, openModal],\n )\n}\n","// ---------------------------------------------------------------------------\n// access-contract — the single import seam the billing UI uses for the\n// entitlements engine (UpgradePrompt, UpgradeModal, EntitlementGate, LimitGate,\n// SoftLimitWidget, the AdminShell route guard / nav badge, SubscriptionPage\n// matrix). Re-exports the core access engine (packages/saas/src/access) so the\n// billing layer has ONE stable path and the wiring (AccessProvider) stays in the\n// núcleo. `getPlanEntitlements` is a thin local reader — core's Plan carries the\n// entitlements, so this just narrows the access.\n//\n// (History: this file shipped as a temporary stub while the access engine landed\n// in parallel; now repointed to the real module. The public names/types below\n// match the fixed contract, so no billing-wave consumer changed.)\n// ---------------------------------------------------------------------------\nimport type { Plan, PlanEntitlements } from '@fayz-ai/core'\n\nexport { useAccessOptional, useLimit, useLimitGuard } from '../../access/context'\nexport { invalidateLimit } from '../../access/limits-registry'\nexport { useUpgradeModalStore } from '../../access/upgrade-modal-store'\n\nexport type { AccessApi, AccessDecision } from '../../access/types'\n// The billing layer refers to the limit shape as `LimitInfo`; the engine calls\n// it `LimitState`. Same structure — alias to keep call sites stable.\nexport type { LimitState as LimitInfo } from '../../access/types'\nexport type { PlanEntitlements } from '@fayz-ai/core'\n\n/** Narrow a plan to its entitlements (undefined when the plan declares none). */\nexport function getPlanEntitlements(plan: Plan | undefined | null): PlanEntitlements | undefined {\n return plan?.entitlements\n}\n\n/**\n * Clean a feature's raw permission label into a display name for the upgrade\n * surfaces. Feature labels in an app's permissions config carry an access-scope\n * suffix — e.g. \"Marketing (acesso)\" / \"Reports (access)\" — which reads as noise\n * when interpolated into a headline (\"Unlock Marketing (acesso)\"). Strip a single\n * trailing parenthetical group and collapse surrounding whitespace. Shared by\n * UpgradePrompt AND UpgradeModal so the two surfaces stay in lockstep.\n */\nexport function featureDisplayName(label: string | null | undefined): string {\n if (!label) return ''\n return label.replace(/\\s*\\([^)]*\\)\\s*$/, '').trim() || label.trim()\n}\n\n/**\n * Which ISO-4217 code to price a plan in. `Plan.currency` is the source of\n * truth, but apps DO ship billing configs that omit it — and silently printing\n * \"$79\" to a tenant billed in reais is worse than any other failure mode here.\n * So the fallback follows the ACTIVE LOCALE's region rather than a hardcoded\n * 'USD'; only a locale we can't place at all lands on USD.\n */\nconst CURRENCY_BY_REGION: Record<string, string> = {\n BR: 'BRL', PT: 'EUR', ES: 'EUR', FR: 'EUR', DE: 'EUR', IT: 'EUR', NL: 'EUR', IE: 'EUR',\n GB: 'GBP', US: 'USD', CA: 'CAD', AU: 'AUD', MX: 'MXN', AR: 'ARS', CL: 'CLP', CO: 'COP',\n}\n\nexport function resolvePlanCurrency(planCurrency: string | undefined, locale: string | undefined): string {\n if (planCurrency) return planCurrency\n const region = locale?.split(/[-_]/)[1]?.toUpperCase()\n return (region && CURRENCY_BY_REGION[region]) || 'USD'\n}\n","import { useMemo } from 'react'\nimport { useAppConfigStore } from '../stores/app-config.store'\nimport { resolveAppId } from '../directory/app-id'\nimport type { FayzAppConfig } from './config'\n\n/**\n * O ponto de partida do aplicativo que ESTA conta roda (077).\n *\n * ── O que ele conserta ─────────────────────────────────────────────────────\n * O aplicativo central monta o rail a partir dos plugins ligados, e para um\n * restaurante isso deu quinze linhas planas — Pedidos, Agenda, Cozinha, Salão,\n * Estoque, CRM, Marketing, Reservas, Financeiro… O ChefControl resolveu isso\n * com SETE rubricas e filhos dentro, e esse desenho é conhecimento de produto\n * validado em cliente. Pedir a cada conta que o remonte a partir de plugins\n * soltos é pedir que ela redescubra o que já sabíamos.\n *\n * ── A conta ESTENDE, não recria ────────────────────────────────────────────\n * O preset diz a árvore; `app.tenant_plugins` diz o que desta conta está\n * ligado; e o shell poda o que sobrou apontando para nada (ver nav-serving).\n * Uma rubrica cujos filhos estão todos desligados não desenha — \"Operação\"\n * some sozinha numa casa sem cozinha, sem mesa e sem reserva.\n *\n * ── Quando a conta roda dois aplicativos ───────────────────────────────────\n * Papa Léguas roda ChefControl e StoreControl sobre os mesmos dados. O preset\n * é o do PRIMEIRO — `app_config()` já os ordena — porque um rail com as duas\n * árvores não é a soma de dois sistemas, é nenhum dos dois.\n */\nexport interface AppPreset {\n shell?: {\n layout?: FayzAppConfig['layout']\n moduleNav?: FayzAppConfig['moduleNav']\n contentFrame?: boolean\n navChildConnector?: boolean\n }\n /**\n * Como este ofício agrupa e ordena o rail (083). Ver ./rail-preset.\n *\n * Uma string é um plugin, com os rótulos DELE; um objeto é uma rubrica, e\n * `under` são prefixos de rota. O preset nunca diz como uma linha se chama —\n * era isso que fazia a árvore de SQL discordar dos plugins.\n */\n rail?: Array<string | { label: string; icon?: string; under: string[] }>\n /**\n * As rotas que este ofício NÃO põe no rail — o `hideNav()` em forma de dado.\n * Ver ./rail-preset.\n */\n hide?: string[]\n /**\n * Os módulos que ABREM INTEIROS: uma linha no rail, sem sanfona, porque a\n * própria página já desenha a faixa de abas das telas irmãs. Prefixos de\n * rota. Ver ./rail-preset.\n */\n whole?: string[]\n /**\n * O VOCABULÁRIO deste ofício: rota → nome. Ver ./rail-preset (`labelFor`).\n *\n * O plugin continua sendo quem nomeia por padrão; isto é a conta dizendo\n * que na CASA dela aquela tela se chama outra coisa — \"Funcionários\" onde o\n * plugin diz \"Equipe\" —, e é assim que quem vem do V1 reconhece o menu.\n */\n labels?: Record<string, string>\n /** O que este ofício OFERECE (079). Ver `useOfferedPlugins`. */\n modules?: string[]\n}\n\nexport function useAppPreset(): AppPreset {\n const apps = useAppConfigStore((s) => s.config.apps)\n return useMemo(() => {\n const own = (apps ?? []).find((a) => !(a as { house?: boolean }).house)\n return ((own as { preset?: AppPreset } | undefined)?.preset ?? {}) as AppPreset\n }, [apps])\n}\n\n/**\n * O catálogo desta conta: a união do que cada ofício que ela roda oferece (079).\n *\n * UNIÃO e não \"o primeiro\", ao contrário do rail: Papa Léguas roda ChefControl\n * e StoreControl, desenha UM rail (dois não seriam nenhum) mas TEM os dois\n * catálogos — a loja dele existe mesmo com o rail sendo o do restaurante.\n *\n * Vazio quando nenhum aplicativo declarou oferta, e aí o runtime volta a ser o\n * de antes: quem cura é o `import` do aplicativo.\n */\nexport function useOfferedPlugins(): string[] {\n const apps = useAppConfigStore((s) => s.config.apps)\n return useMemo(() => {\n const ids = new Set<string>()\n for (const app of apps ?? []) {\n if ((app as { house?: boolean }).house) continue\n for (const id of (app as { preset?: AppPreset }).preset?.modules ?? []) ids.add(id)\n }\n return [...ids]\n }, [apps])\n}\n\n/**\n * A identidade no alto da trilha é da CONTA, não do produto?\n *\n * Sim em dois casos, e são o mesmo caso visto de dois lados:\n *\n * a conta tem marca própria Espaço Facial não abre um software chamado\n * StudioControl: abre o sistema DELES.\n * o pacote não tem produto O aplicativo central não é um produto — ele\n * carrega o ofício de quem entrar. O nome que\n * apareceria ali (\"FullControl\", \"ChefControl\")\n * é o do registro `app.apps`, não o do pacote, e\n * empilhá-lo sobre o seletor mostra duas\n * identidades onde só existe uma.\n *\n * Sem `VITE_APP_ID` o pacote não reivindica produto nenhum — é a mesma leitura\n * que o WrongAppGate já usa para não bloquear ninguém.\n */\nexport function useTenantLedIdentity(hasTenantBrand: boolean): boolean {\n return hasTenantBrand || resolveAppId() === null\n}\n\n/**\n * O nome que ESTE ofício dá à tela de uma rota — em qualquer superfície.\n *\n * `preset.labels` nasceu para o rail, e por um tempo só valeu lá: a barra\n * dizia \"Funcionários\" e a ficha aberta a partir dela dizia \"← Profissionais\".\n * Duas palavras para a mesma coisa, a uma linha de distância, é o bastante para\n * alguém perguntar se são dois cadastros. Vocabulário de ofício é do produto\n * inteiro, não de um componente.\n *\n * Sem rótulo no preset devolve o `fallback` — que é o nome do plugin, como\n * sempre foi.\n */\nexport function usePresetLabel(route: string | undefined, fallback: string): string {\n const preset = useAppPreset()\n return (route ? preset.labels?.[route] : undefined) ?? fallback\n}\n\n/**\n * A COR do aplicativo que esta conta roda (138).\n *\n * Irmã de `useAppPreset`, e deliberadamente com a mesma escolha: o PRIMEIRO\n * aplicativo da lista — `app_config()` já os ordena por ofício. O rail e a cara\n * têm de vir do mesmo produto, senão a casa abre com o menu do ChefControl e a\n * cor do FullControl, que é um sistema que ninguém desenhou.\n *\n * Nulo quando o aplicativo não reivindica tema (o `control-admin`, um pool que\n * ainda não rodou a 138). Aí vale o tema compilado no bundle, que é como era\n * antes desta migração — e é a leitura certa para uma ferramenta interna.\n */\nexport function useAppTheme(): unknown | null {\n const apps = useAppConfigStore((s) => s.config.apps)\n return useMemo(() => {\n const own = (apps ?? []).find((a) => !(a as { house?: boolean }).house)\n return (own as { theme?: unknown } | undefined)?.theme ?? null\n }, [apps])\n}\n","import * as React from 'react'\nimport { AlertTriangle, ArrowUpRight, ChevronDown, Sparkles } from 'lucide-react'\nimport { tl, formatCurrency } from '@fayz-ai/core'\nimport { Button, Card, CardContent, ConfirmDialog, Skeleton, toast } from '@fayz-ai/ui'\nimport { cn } from '../../lib/cn'\nimport { useBillingStore } from '../../billing/store'\nimport { EXTRA_AI_CREDITS } from '../../billing/module-pricing'\nimport { useAiUsage, type AiUsageSummary } from '../../billing/ai-usage'\n\nconst num = (n: number) => n.toLocaleString('pt-BR')\n// The platform's own prices are in BRL whatever the tenant's currency.\nconst money = (n: number) => formatCurrency(n, 'BRL')\nconst FEATURE_LABELS: Record<string, readonly [string, string]> = {\n assistant: ['Assistant', 'Assistente'],\n atendeai: ['AtendeAI (WhatsApp)', 'AtendeAI (WhatsApp)'],\n scribe: ['AI scribe', 'Escriba (IA)'],\n}\n\n/**\n * \"Uso de IA neste período\": the plan's credits like a CI minutes meter —\n * spent, left, the pace, who spends — and the way out when it runs short.\n */\nexport function AiUsageSection({ included, planName, upgrade }: {\n included: number\n planName?: string\n /** The next plan up that includes more credits, if any. */\n upgrade?: { name: string; credits: number; onChoose?: () => void }\n}) {\n const state = useAiUsage(included)\n const checkout = useBillingStore((s) => s.checkout)\n const [pack, setPack] = React.useState<(typeof EXTRA_AI_CREDITS)[number] | null>(null)\n\n const buy = async (p: (typeof EXTRA_AI_CREDITS)[number]) => {\n // The gateway seam takes an id; the credit pack is one more product on it.\n if (checkout) {\n try { await checkout(`ai-credits-${p.credits}`) } catch { toast.error(tl('Could not start the purchase.', 'Não foi possível iniciar a compra.')) }\n return\n }\n setPack(p)\n }\n\n return (\n <section aria-labelledby=\"ai-usage-title\" className=\"space-y-3\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-2\">\n <h2 id=\"ai-usage-title\" className=\"flex items-center gap-2 text-lg font-semibold\">\n <Sparkles className=\"h-4 w-4 text-violet-600 dark:text-violet-300\" aria-hidden />\n {tl('AI usage this period', 'Uso de IA neste período')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {planName ? `${planName} · ` : ''}{num(included)} {tl('credits/mo included', 'créditos/mês incluídos')}\n </p>\n </div>\n <Card>\n <CardContent className=\"space-y-4 p-5\">\n {state.status === 'loading' && <Skeleton className=\"h-16 w-full\" />}\n {state.status === 'not-metered' && (\n <EmptyState text={tl('Usage starts counting once the assistant is used this period. Your plan includes these credits every month.',\n 'O consumo começa a contar quando o assistente for usado neste período. O seu plano inclui estes créditos todo mês.')} />\n )}\n {state.status === 'empty' && (\n <>\n <Meter s={state.summary} />\n <EmptyState text={tl('No credits spent yet this period.', 'Nenhum crédito usado neste período ainda.')} />\n </>\n )}\n {state.status === 'ok' && <Usage s={state.summary} upgrade={upgrade} onBuy={buy} />}\n </CardContent>\n </Card>\n\n <ConfirmDialog\n open={pack !== null}\n onConfirm={() => setPack(null)}\n onCancel={() => setPack(null)}\n title={pack ? tl(`${num(pack.credits)} extra credits for ${money(pack.price)}`, `${num(pack.credits)} créditos extras por ${money(pack.price)}`) : ''}\n description={tl('Buying credits online is not available for this account yet. Ask support to add the pack — it is charged on the next invoice.',\n 'A compra de créditos online ainda não está disponível nesta conta. Peça o pacote ao suporte — ele entra na próxima fatura.')}\n confirmLabel={tl('Got it', 'Entendi')}\n cancelLabel={tl('Cancel', 'Cancelar')}\n />\n </section>\n )\n}\n\nfunction EmptyState({ text }: { text: string }) {\n return <p className=\"text-sm text-muted-foreground\">{text}</p>\n}\n\nfunction Meter({ s }: { s: AiUsageSummary }) {\n const pct = Math.round(s.ratio * 100)\n // The bar's scale stretches past 100% when usage or the projection does, so\n // both stay on it; the allowance line marks where 100% sits.\n const scale = Math.max(s.included, s.used, s.projected, 1)\n const at = (n: number) => `${Math.min(100, (n / scale) * 100)}%`\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1\">\n <p className=\"tabular-nums\">\n <span className=\"text-3xl font-bold\">{num(s.used)}</span>\n <span className=\"text-base text-muted-foreground\"> {tl('of', 'de')} {num(s.included)} {tl('credits', 'créditos')}</span>\n <span className={cn('ml-2 text-base font-semibold', s.over ? 'text-amber-700 dark:text-amber-300' : 'text-violet-700 dark:text-violet-300')}>· {pct}%</span>\n </p>\n <p className=\"text-sm text-muted-foreground tabular-nums\">\n {s.daysLeft} {tl(s.daysLeft === 1 ? 'day left' : 'days left', s.daysLeft === 1 ? 'dia para fechar' : 'dias para fechar')}\n </p>\n </div>\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={s.included}\n aria-valuenow={s.used}\n aria-valuetext={tl(`${num(s.used)} of ${num(s.included)} credits`, `${num(s.used)} de ${num(s.included)} créditos`)}\n aria-label={tl('AI credits used', 'Créditos de IA usados')}\n className=\"relative h-4 w-full rounded-full bg-muted\"\n >\n {/* Projection: a faint band from today's usage to the period's end at this pace. */}\n {s.projected > s.used && (\n <div className={cn('absolute inset-y-0 left-0 rounded-full', s.projectedOver ? 'bg-amber-200 dark:bg-amber-900/70' : 'bg-violet-200 dark:bg-violet-900/70')} style={{ width: at(s.projected) }} />\n )}\n <div className={cn('absolute inset-y-0 left-0 rounded-full', s.over ? 'bg-amber-500' : 'bg-violet-600 dark:bg-violet-400')} style={{ width: at(s.used) }} />\n {scale > s.included && (\n <div className=\"absolute -inset-y-1 w-0.5 rounded bg-foreground/70\" style={{ left: at(s.included) }} title={tl('Plan allowance', 'Incluído no plano')} />\n )}\n </div>\n {s.projected > 0 && (\n <p className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\"><span className={cn('h-2.5 w-2.5 rounded-full', s.over ? 'bg-amber-500' : 'bg-violet-600 dark:bg-violet-400')} />{tl('Used', 'Usado')}</span>\n <span className=\"inline-flex items-center gap-1.5\"><span className={cn('h-2.5 w-2.5 rounded-full', s.projectedOver ? 'bg-amber-200 dark:bg-amber-900' : 'bg-violet-200 dark:bg-violet-900')} />{tl(`At this pace: ${num(s.projected)}`, `Neste ritmo: ${num(s.projected)}`)}</span>\n {scale > s.included && <span className=\"inline-flex items-center gap-1.5\"><span className=\"h-3 w-0.5 bg-foreground/70\" />{tl('Included', 'Incluído no plano')}</span>}\n </p>\n )}\n </div>\n )\n}\n\nfunction Usage({ s, upgrade, onBuy }: {\n s: AiUsageSummary\n upgrade?: { name: string; credits: number; onChoose?: () => void }\n onBuy: (p: (typeof EXTRA_AI_CREDITS)[number]) => void\n}) {\n const short = s.over || s.projectedOver\n return (\n <>\n <Meter s={s} />\n {s.over ? (\n <p role=\"status\" className=\"flex items-start gap-2 rounded-input border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-900 dark:border-amber-800 dark:bg-amber-950/50 dark:text-amber-100\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0\" aria-hidden />\n {tl(`You went ${num(s.overBy)} credits over the plan's allowance.`, `Você passou ${num(s.overBy)} créditos do que o plano inclui.`)}\n </p>\n ) : (\n s.projectedOver ? (\n <p className=\"text-sm tabular-nums text-amber-800 dark:text-amber-200\">\n {tl(`At this pace you will reach ${num(s.projected)} credits — over the allowance before the period ends.`, `Neste ritmo você chega a ${num(s.projected)} créditos — acima do que o plano inclui antes de o período fechar.`)}\n </p>\n ) : null\n )}\n\n {(s.byUser.length > 0 || s.byFeature.length > 0) && (\n <details className=\"group\">\n <summary className=\"flex min-h-11 cursor-pointer list-none items-center gap-1.5 text-sm font-medium text-muted-foreground hover:text-foreground\">\n <ChevronDown className=\"h-4 w-4 transition-transform group-open:rotate-180\" aria-hidden />\n {tl('Who uses it and where', 'Quem usa e onde')}\n </summary>\n <div className=\"grid gap-4 pt-2 sm:grid-cols-2\">\n {s.byUser.length > 0 && <Breakdown title={tl('Who uses it most', 'Quem mais usa')} rows={s.byUser.slice(0, 5).map((u) => [u.name, u.credits])} total={s.used} />}\n {s.byFeature.length > 0 && <Breakdown title={tl('Where it goes', 'Onde vai')} rows={s.byFeature.map((f) => [FEATURE_LABELS[f.feature] ? tl(...FEATURE_LABELS[f.feature]!) : f.feature, f.credits])} total={s.used} />}\n </div>\n </details>\n )}\n\n {short && (\n <div className=\"flex flex-col gap-2 border-t pt-4 sm:flex-row sm:flex-wrap sm:items-center\">\n <span className=\"text-sm font-medium\">{tl('Buy extra credits', 'Comprar créditos extras')}</span>\n {EXTRA_AI_CREDITS.map((p) => (\n <Button key={p.credits} variant=\"outline\" className=\"h-11\" onClick={() => onBuy(p)}>\n +{num(p.credits)} · {money(p.price)}\n </Button>\n ))}\n {upgrade && (\n <Button variant=\"ghost\" className=\"h-11\" onClick={upgrade.onChoose} disabled={!upgrade.onChoose}>\n <ArrowUpRight className=\"h-4 w-4\" />\n {tl(`More with ${upgrade.name} (${num(upgrade.credits)}/mo)`, `Aumentar com o plano ${upgrade.name} (${num(upgrade.credits)}/mês)`)}\n </Button>\n )}\n </div>\n )}\n </>\n )\n}\n\nfunction Breakdown({ title, rows, total }: { title: string; rows: Array<[string, number]>; total: number }) {\n return (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">{title}</p>\n <ul className=\"space-y-1.5 text-sm\">\n {rows.map(([label, credits]) => (\n <li key={label} className=\"flex items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate\" title={label}>{label}</span>\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">\n {num(credits)} <span className=\"text-xs\">({total ? Math.round((credits / total) * 100) : 0}%)</span>\n </span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n","import { tl } from '@fayz-ai/core'\n\n/**\n * Families of modules — how Módulos (and anything else that lists modules, the\n * price list included) groups them. Keyed by plugin id; a facet follows its\n * plugin. A module not listed falls in \"Base do sistema\".\n */\nexport interface ModuleFamily {\n id: string\n label: readonly [string, string]\n /** One line under the heading: what this family is for. */\n line: readonly [string, string]\n plugins: readonly string[]\n}\n\nexport const MODULE_FAMILIES: readonly ModuleFamily[] = [\n { id: 'sales', label: ['Sales & floor', 'Vendas e salão'], line: ['Selling at the counter, the table and online.', 'Vender no balcão, na mesa e online.'],\n plugins: ['orders', 'tables', 'menu', 'reservations', 'shop', 'payments', 'sites', 'marketplaces'] },\n { id: 'stock', label: ['Stock & production', 'Estoque e produção'], line: ['What comes in, what is made, what goes out.', 'O que entra, o que se produz, o que sai.'],\n plugins: ['inventory', 'production', 'kitchen'] },\n { id: 'care', label: ['Attendance & schedule', 'Atendimento e agenda'], line: ['Bookings, records and the service itself.', 'Agendamento, prontuário e o atendimento em si.'],\n plugins: ['agenda', 'clinical', 'forms', 'custom_forms', 'scribe', 'courses', 'tiss', 'pet'] },\n { id: 'finance', label: ['Finance & tax', 'Financeiro e fiscal'], line: ['Cash, bills, banks and invoices.', 'Caixa, contas, bancos e nota fiscal.'],\n plugins: ['financial', 'fiscal-br', 'banking-br', 'openbanking'] },\n { id: 'clients', label: ['Clients & marketing', 'Clientes e marketing'], line: ['Who your clients are and how you talk to them.', 'Quem são seus clientes e como você fala com eles.'],\n plugins: ['crm', 'conversations', 'marketing', 'automations', 'reputation'] },\n { id: 'team', label: ['Team', 'Equipe'], line: ['Shifts, time clock and tasks.', 'Escala, ponto e tarefas.'],\n plugins: ['workforce', 'tasks'] },\n { id: 'base', label: ['Platform', 'Base do sistema'], line: ['Registries, reports and what every account has.', 'Cadastros, relatórios e o que toda conta tem.'],\n plugins: ['registry', 'reports', 'dashboard', 'notifications', 'analytics'] },\n]\n\nconst FAMILY_OF = new Map(MODULE_FAMILIES.flatMap((f) => f.plugins.map((p) => [p, f.id] as const)))\n\n/** The family of a module or facet key (`plugin` / `plugin.facet`). */\nexport function moduleFamilyOf(key: string): string {\n return FAMILY_OF.get(key) ?? FAMILY_OF.get(key.split('.')[0]!) ?? 'base'\n}\n\nexport function familyLabel(id: string): string {\n const f = MODULE_FAMILIES.find((x) => x.id === id)\n return f ? tl(...f.label) : id\n}\n\n/**\n * What each coming-soon module (`COMING_SOON_MODULES` in the price list) is\n * for, and where it came from. Data only: none of these registers a route.\n */\nexport const UPCOMING_MODULE_INFO: Readonly<Record<string, { line: readonly [string, string]; v1?: string }>> = {\n tiss: { line: ['Bill health plans in the TISS standard, guide by guide.', 'Fature convênios no padrão TISS, guia por guia.'] },\n 'pet.grooming': { line: ['Booked by pet, priced by size and coat, from drop-off to pick-up.', 'Marcado pelo pet, preço por porte e pelagem, do recebido ao entregue.'], v1: 'ThePet · /pet/servicos' },\n 'pet.vet': { line: ['Vet records, vaccines and returns per pet.', 'Prontuário, vacinas e retornos de cada pet.'], v1: 'ThePet' },\n 'pet.lodging': { line: ['Hotel and daycare stays with check-in and daily log.', 'Hospedagem e creche com entrada, saída e diário.'], v1: 'ThePet' },\n 'pet.packages': { line: ['Weekly bath plans and pick-up & drop-off.', 'Planos de banho semanais e leva-e-traz.'], v1: 'ThePet · /pet/planos, /pet/leva-e-traz' },\n marketplaces: { line: ['Sell the same catalog on Mercado Livre, Shopee and Amazon.', 'Venda o mesmo catálogo no Mercado Livre, Shopee e Amazon.'] },\n}\n","import * as React from 'react'\nimport { AlertCircle, Check } from 'lucide-react'\nimport { tl, usePluginRuntimeOptional, type Plan, formatCurrency } from '@fayz-ai/core'\nimport {\n Button, Sheet, SheetBody, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, Switch, getLucideIcon,\n} from '@fayz-ai/ui'\nimport { cn } from '../../lib/cn'\nimport {\n PRICE_BOOK, UPSELL_KEY, billableModules, includedIn, moduleFitsTrades, packageFor, perUnitModules, planFit, quote,\n type BasePackage, type OperationSize, type PricingPlan, type Trade,\n} from '../../billing/module-pricing'\nimport { MODULE_FAMILIES, moduleFamilyOf } from '../../billing/module-families'\n\n// The platform's own prices are in BRL whatever the tenant's currency.\nconst money = (n: number) => formatCurrency(n, 'BRL')\n\n/** One switch the plan change will flip: a module or one of its paid parts. */\nexport interface ModuleChange {\n plugin: string\n facet: string\n status: 'active' | 'disabled'\n}\n\nconst split = (key: string) => {\n const dot = key.indexOf('.')\n return dot < 0 ? { plugin: key, facet: '' } : { plugin: key.slice(0, dot), facet: key.slice(dot + 1) }\n}\n\nfunction priceLabel(key: string, pkg: BasePackage): string {\n const e = PRICE_BOOK[key]!\n if (includedIn(pkg, key)) return tl(`Included in ${pkg.name}`, `Incluído no ${pkg.name}`)\n return `${money(e.price)} ${e.per === 'unit' ? tl('per unit', 'por unidade') : tl('/mo', '/mês')}`\n}\n\n/**\n * Switching plan is composing the subscription: the plan, plus the modules and\n * paid parts this account will run on it. Starts from what is on today, prices\n * every change live, and confirms all of it at once.\n */\nexport function PlanCheckoutSheet({ plan, pricing, size, trades, currentTotal, onCancel, onConfirm }: {\n plan: Plan | null\n pricing: PricingPlan | null\n size: OperationSize\n trades: readonly Trade[]\n currentTotal?: number\n onCancel: () => void\n onConfirm: (plan: Plan, changes: ModuleChange[]) => Promise<void>\n}) {\n const runtime = usePluginRuntimeOptional()\n const initial = React.useMemo(\n () => new Set(billableModules([...size.modules, ...(size.unitModules ?? []).flatMap((u) => u.modules)])\n .concat([...size.modules, ...(size.unitModules ?? []).flatMap((u) => u.modules)].filter((k) => PRICE_BOOK[k]))),\n [size],\n )\n const [selected, setSelected] = React.useState<Set<string>>(initial)\n const [busy, setBusy] = React.useState(false)\n React.useEffect(() => { if (plan) setSelected(new Set(initial)) }, [plan, initial])\n\n // What can be switched here: priced, sold to this trade, and shipped in this\n // app (a module the bundle doesn't carry cannot be turned on from a screen).\n const offer = React.useMemo(() => {\n const plugins = runtime?.plugins ?? []\n return Object.keys(PRICE_BOOK).filter((key) => {\n if (PRICE_BOOK[key]!.comingSoon) return false\n // Off-trade modules stay offered only if the account already runs them.\n if (trades.length && !moduleFitsTrades(key, trades) && !initial.has(key)) return false\n const { plugin, facet } = split(key)\n const manifest = plugins.find((p) => p.id === plugin)\n if (!manifest) return false\n return !facet || !!manifest.facets?.some((f) => f.id === facet && !f.includedWithPlugin)\n })\n }, [runtime?.plugins, trades, initial])\n\n const toggle = (key: string) => setSelected((cur) => {\n const next = new Set(cur)\n const { plugin, facet } = split(key)\n if (next.has(key)) {\n next.delete(key)\n // A module out takes its paid parts with it.\n if (!facet) for (const k of [...next]) if (k.startsWith(`${plugin}.`)) next.delete(k)\n } else {\n next.add(key)\n if (facet) next.add(plugin)\n }\n return next\n })\n\n const pkg = React.useMemo(() => packageFor({ package: size.package, trades, modules: [...selected] }), [size.package, trades, selected])\n const nextSize: OperationSize = React.useMemo(() => {\n const keys = [...selected]\n const perUnit = perUnitModules(keys, pkg)\n return {\n ...size,\n trades,\n modules: keys,\n unitModules: (size.unitModules ?? []).map((u) => ({ ...u, modules: perUnit })),\n }\n }, [selected, size, pkg, trades])\n const q = pricing ? quote(nextSize, pricing) : null\n const total = q?.total ?? plan?.price ?? 0\n const fit = plan ? planFit(plan, nextSize) : { fits: true as const }\n const units = nextSize.unitModules?.length || nextSize.units\n const delta = currentTotal !== undefined ? total - currentTotal : undefined\n\n const changes: ModuleChange[] = [\n ...[...selected].filter((k) => !initial.has(k)).map((k) => ({ ...split(k), status: 'active' as const })),\n ...[...initial].filter((k) => !selected.has(k) && offer.includes(k)).map((k) => ({ ...split(k), status: 'disabled' as const })),\n ]\n\n const families = MODULE_FAMILIES\n .map((f) => ({ family: f, keys: offer.filter((k) => !k.includes('.') && moduleFamilyOf(k) === f.id) }))\n .filter((g) => g.keys.length > 0)\n\n const confirm = async () => {\n if (!plan) return\n setBusy(true)\n try { await onConfirm(plan, changes) } finally { setBusy(false) }\n }\n\n return (\n <Sheet open={!!plan} onOpenChange={(open) => { if (!open && !busy) onCancel() }}>\n <SheetContent width=\"max-w-2xl\">\n <SheetHeader>\n <SheetTitle>{plan ? tl(`Switch to ${plan.name}`, `Mudar para ${plan.name}`) : ''}</SheetTitle>\n <SheetDescription>\n {tl('Choose the modules this account will run on the plan. What is on today comes checked; the price follows each switch.',\n 'Escolha os módulos que a conta vai usar no plano. O que já está ligado vem marcado; o preço acompanha cada escolha.')}\n </SheetDescription>\n </SheetHeader>\n <SheetBody className=\"space-y-6\">\n {families.map(({ family, keys }) => (\n <section key={family.id} className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{tl(...family.label)}</h3>\n <ul className=\"divide-y rounded-card border\">\n {keys.map((key) => {\n const manifest = runtime?.plugins.find((p) => p.id === key)\n const Icon = manifest?.icon ? getLucideIcon(manifest.icon) : undefined\n const on = selected.has(key)\n const parts = offer.filter((k) => k.startsWith(`${key}.`))\n return (\n <li key={key} className=\"space-y-2 px-4 py-3\">\n <label className=\"flex cursor-pointer items-center gap-3\">\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden /> : <span className=\"w-4\" />}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">{manifest?.name ?? tl(...PRICE_BOOK[key]!.label)}</span>\n <span className=\"block text-xs text-muted-foreground tabular-nums\">{priceLabel(key, pkg)}</span>\n </span>\n <Switch checked={on} onCheckedChange={() => toggle(key)} aria-label={tl(...PRICE_BOOK[key]!.label)} />\n </label>\n {parts.length > 0 && (\n <ul className=\"space-y-2 border-l pl-4 ml-2\">\n {parts.map((part) => {\n const ai = part === UPSELL_KEY\n return (\n <li key={part}>\n <label className=\"flex cursor-pointer items-center gap-3\">\n <span className=\"min-w-0 flex-1\">\n <span className={cn('block text-sm', ai && 'font-medium text-violet-700 dark:text-violet-300')}>{tl(...PRICE_BOOK[part]!.label)}</span>\n <span className=\"block text-xs text-muted-foreground tabular-nums\">+ {priceLabel(part, pkg)}</span>\n </span>\n <Switch checked={selected.has(part)} onCheckedChange={() => toggle(part)} aria-label={tl(...PRICE_BOOK[part]!.label)} />\n </label>\n </li>\n )\n })}\n </ul>\n )}\n </li>\n )\n })}\n </ul>\n </section>\n ))}\n </SheetBody>\n <SheetFooter className=\"flex-col items-stretch gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n {fit.fits ? (\n <>\n <p className=\"text-xl font-bold tabular-nums\">\n {total > 0 ? money(total) : tl('Free', 'Grátis')}\n {total > 0 && <span className=\"text-sm font-normal text-muted-foreground\">{tl('/mo', '/mês')}</span>}\n </p>\n <p className=\"text-xs text-muted-foreground tabular-nums\">\n {units > 1 && total > 0 ? `≈ ${money(total / units)} ${tl('per unit', 'por unidade')} · ` : ''}\n {delta !== undefined && Math.abs(delta) >= 0.01\n ? (delta > 0 ? tl(`+${money(delta)} vs today`, `+${money(delta)} em relação a hoje`) : tl(`${money(-delta)} less than today`, `${money(-delta)} a menos que hoje`))\n : tl('Same as today', 'Igual a hoje')}\n </p>\n </>\n ) : (\n <p className=\"flex items-start gap-2 text-sm text-muted-foreground\">\n <AlertCircle className=\"mt-0.5 h-4 w-4 shrink-0\" aria-hidden />\n {fit.limit === 'locations'\n ? tl(`This plan takes up to ${fit.max} units; you have ${fit.have}.`, `Este plano vai até ${fit.max} unidades; você tem ${fit.have}.`)\n : tl(`This plan takes up to ${fit.max} users; you have ${fit.have}.`, `Este plano vai até ${fit.max} usuários; você tem ${fit.have}.`)}\n </p>\n )}\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" className=\"h-11\" onClick={onCancel} disabled={busy}>{tl('Cancel', 'Cancelar')}</Button>\n <Button className=\"h-11\" onClick={() => void confirm()} disabled={busy || !fit.fits}>\n <Check className=\"h-4 w-4\" aria-hidden />\n {busy ? tl('Saving…', 'Salvando…') : tl('Confirm', 'Confirmar')}\n {changes.length > 0 && !busy ? ` · ${changes.length} ${tl(changes.length === 1 ? 'change' : 'changes', changes.length === 1 ? 'mudança' : 'mudanças')}` : ''}\n </Button>\n </div>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import * as React from 'react'\nimport { AlertCircle, Blocks, Building2, Calculator, ChevronDown, RotateCcw, TrendingDown, Users } from 'lucide-react'\nimport { tl, usePluginRuntimeOptional, type Plan, formatCurrency } from '@fayz-ai/core'\nimport {\n Badge, Button, Card, CardContent, ChoiceSelect,\n Sheet, SheetBody, SheetContent, SheetDescription, SheetHeader, SheetTitle, Input\n} from '@fayz-ai/ui'\nimport { cn } from '../../lib/cn'\nimport { useUnitStore } from '../../units/store'\nimport { useOrganizationStore } from '../../org/store'\nimport { useOrgAdapterOptional } from '../../org/context'\nimport { useAppConfigStore } from '../../stores/app-config.store'\nimport { useOfferedPlugins } from '../../app/useAppPreset'\nimport { AiUsageSection } from './AiUsageSection'\nimport { PlanCheckoutSheet, type ModuleChange } from './PlanCheckoutSheet'\nimport { PlanFeatureItem, parsePlanFeature } from './plan-feature'\nimport {\n PRICE_BOOK, PRICING_PLANS, PRICING_SCENARIOS, SCENARIO_VERTICAL_LABELS, EXTRA_SEAT_PRICE, activeModuleKeys, billableModules, perUnitModules,\n TRADE_BY_APP, aiCreditsFor, moduleFitsTrades, packageFor, planFit, pricingForPlans, quote,\n type Trade,\n type OperationSize, type PlanFit, type PricingPlan, type Quote, type UnitFootprint,\n} from '../../billing/module-pricing'\n\n// The platform's own prices are in BRL whatever the tenant's currency.\nconst money = (n: number) => formatCurrency(n, 'BRL')\nconst MINE = 'mine'\nconst FEATURES_SHOWN = 5\n\n// ── The operation being priced ─────────────────────────────────────────────\n\n/** This account's real size, read from the stores the shell already fills. */\nfunction useRealOperation() {\n const units = useUnitStore((s) => s.units)\n const members = useOrganizationStore((s) => s.members)\n const orgId = useOrganizationStore((s) => s.currentOrg?.id)\n const adapter = useOrgAdapterOptional()\n const runtime = usePluginRuntimeOptional()\n const [fetchedMembers, setFetchedMembers] = React.useState<number | null>(null)\n\n // The members list is filled by the Team tab; opened straight here it may\n // still be empty, so ask once.\n React.useEffect(() => {\n if (members.length > 0 || !adapter || !orgId) return\n let alive = true\n adapter.listMembers(orgId).then((list) => { if (alive) setFetchedMembers(list.length) }).catch(() => {})\n return () => { alive = false }\n }, [members.length, adapter, orgId])\n\n const apps = useAppConfigStore((s) => s.config.apps)\n const offered = useOfferedPlugins()\n // The trades this account runs; a house app (the central one) adds none.\n const trades = React.useMemo<Trade[]>(\n () => [...new Set((apps ?? []).filter((a) => !(a as { house?: boolean }).house).map((a) => TRADE_BY_APP[a.id]).filter(Boolean) as Trade[])],\n [apps],\n )\n const modules = React.useMemo(\n () => activeModuleKeys((runtime?.plugins ?? []) as Parameters<typeof activeModuleKeys>[0], { trades, offered }),\n [runtime?.plugins, trades, offered],\n )\n const active = units.filter((u) => u.isActive !== false && u.kind !== 'region')\n const list = active.length ? active.map((u) => ({ id: u.id, name: u.name })) : [{ id: 'main', name: tl('Main unit', 'Unidade principal') }]\n const perUnit = perUnitModules(modules, packageFor({ trades, modules }))\n return {\n units: list.length,\n users: Math.max(1, members.length || fetchedMembers || 1),\n modules,\n unitModules: list.map((u) => ({ ...u, modules: perUnit })),\n trades,\n }\n}\n\n/** The operation on screen: the account's own, or a ready-made example, with\n * whatever the owner changed in the simulator on top. */\nfunction useOperation() {\n const real = useRealOperation()\n const [scenario, setScenarioState] = React.useState(MINE)\n const [users, setUsers] = React.useState<number | null>(null)\n const [footprints, setFootprints] = React.useState<UnitFootprint[] | null>(null)\n\n const example = PRICING_SCENARIOS.find((x) => x.id === scenario)\n const base: OperationSize = example ? example.size : real\n const trades: Trade[] = example ? [example.vertical] : real.trades\n // Only what this trade sells (a salon is never offered Pedidos e PDV), and\n // only extras: what the package covers is not a chip to switch.\n const allBase = [...base.modules, ...(base.unitModules ?? []).flatMap((u) => u.modules)]\n const pkg = packageFor({ trades, modules: allBase })\n const available = perUnitModules(allBase, pkg)\n .filter((k, i, all) => all.indexOf(k) === i && (!trades.length || moduleFitsTrades(k, trades)))\n const baseUnits: UnitFootprint[] = base.unitModules?.length\n ? [...base.unitModules]\n : Array.from({ length: base.units }, (_, i) => ({ id: `u${i + 1}`, name: `${tl('Unit', 'Unidade')} ${i + 1}`, modules: available }))\n const units = footprints ?? baseUnits\n const size: OperationSize = { units: units.length, users: users ?? base.users, modules: base.modules, unitModules: units, trades, package: pkg.id }\n\n const reset = () => { setUsers(null); setFootprints(null) }\n return {\n size,\n units,\n available,\n trades,\n scenario,\n simulated: scenario !== MINE || users !== null || footprints !== null,\n pkg,\n paidModules: billableModules([...size.modules, ...units.flatMap((u) => u.modules)], pkg).filter((k, i, all) => all.indexOf(k) === i).length,\n setScenario: (id: string) => { setScenarioState(id); reset() },\n setUsers,\n reset: () => { setScenarioState(MINE); reset() },\n setUnitCount: (n: number) => {\n const next = units.slice(0, n)\n while (next.length < n) next.push({ id: `extra-${next.length + 1}`, name: `${tl('Unit', 'Unidade')} ${next.length + 1}`, modules: units[0]?.modules ?? available })\n setFootprints(next)\n },\n toggle: (unitId: string, key: string) => setFootprints(units.map((u) => u.id !== unitId ? u : {\n ...u,\n modules: u.modules.includes(key)\n // Taking a module out takes its paid parts with it.\n ? u.modules.filter((m) => m !== key && !m.startsWith(`${key}.`))\n : [...u.modules, key, ...(key.includes('.') ? [key.slice(0, key.indexOf('.'))] : [])].filter((m, i, all) => all.indexOf(m) === i),\n })),\n }\n}\ntype Operation = ReturnType<typeof useOperation>\n\ninterface PricedPlan {\n plan: Plan\n pricing: PricingPlan | null\n quote: Quote | null\n total: number\n fit: PlanFit\n aiCredits: number\n}\n\n// The plan's own \"AI assistant\" bullet is replaced by the model's line, so a\n// card never shows the allowance twice or two different numbers.\nconst AI_FEATURE = /assistente de ia|ai assistant/i\n\n// Without app plans the model's own tiers are the offer.\nconst MODEL_PLANS: Plan[] = PRICING_PLANS.filter((p) => p.id !== 'a-la-carte').map((p) => ({\n id: p.id, name: tl(...p.name), price: p.platformFee, currency: 'BRL', interval: 'month', features: [],\n pricing: { platformFee: p.platformFee, seatsPerUnit: p.seatsPerUnit, discount: p.discount },\n}))\n\n// ── Pieces ─────────────────────────────────────────────────────────────────\n\nfunction Stat({ icon, children }: { icon: React.ReactNode; children: React.ReactNode }) {\n return (\n <span className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground\">\n <span aria-hidden>{icon}</span>\n <span className=\"tabular-nums text-foreground\">{children}</span>\n </span>\n )\n}\n\nfunction fitReason(fit: PlanFit): string | null {\n if (fit.fits) return null\n const one = fit.max === 1\n return fit.limit === 'locations'\n ? tl(`Up to ${fit.max} ${one ? 'unit' : 'units'} — you have ${fit.have}`, `Até ${fit.max} ${one ? 'unidade' : 'unidades'} — você tem ${fit.have}`)\n : tl(`Up to ${fit.max} ${one ? 'user' : 'users'} — you have ${fit.have}`, `Até ${fit.max} ${one ? 'usuário' : 'usuários'} — você tem ${fit.have}`)\n}\n\nfunction PlanCard({ p, units, recommended, current, onChoose, onDetails }: {\n p: PricedPlan\n units: number\n recommended: boolean\n current: boolean\n onChoose?: () => void\n onDetails: () => void\n}) {\n const [allFeatures, setAllFeatures] = React.useState(false)\n const reason = fitReason(p.fit)\n // Every plan leads with its AI allowance, highlighted like the app's own `*` features.\n const all = [\n `*${tl(`AI assistant — ${p.aiCredits.toLocaleString('pt-BR')} credits/mo`, `Assistente de IA — ${p.aiCredits.toLocaleString('pt-BR')} créditos/mês`)}`,\n ...p.plan.features.filter((f) => !AI_FEATURE.test(parsePlanFeature(f).label)),\n ]\n const features = allFeatures ? all : all.slice(0, FEATURES_SHOWN)\n const hidden = all.length - features.length\n\n return (\n // On a phone the recommended plan comes first; wide screens keep the price ladder.\n <Card className={cn('relative flex flex-col', recommended && 'order-first border-primary shadow-md md:order-none', !p.fit.fits && 'bg-muted/30')}>\n {(recommended || (p.plan.highlighted && p.fit.fits)) && (\n <div className=\"absolute -top-3 left-5\">\n <Badge className={cn(recommended ? 'border-transparent bg-primary text-primary-foreground' : 'bg-secondary text-secondary-foreground')}>\n {recommended ? tl('Recommended for you', 'Recomendado para você') : tl('Most popular', 'Mais popular')}\n </Badge>\n </div>\n )}\n <CardContent className=\"flex flex-1 flex-col gap-4 p-5 pt-6\">\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"text-lg font-semibold\">{p.plan.name}</h3>\n {current && <Badge variant=\"outline\">{tl('Your plan', 'Seu plano')}</Badge>}\n </div>\n {p.plan.description && <p className=\"text-sm text-muted-foreground\">{p.plan.description}</p>}\n </div>\n\n {reason ? (\n <div className=\"flex items-start gap-2 rounded-input border border-dashed px-3 py-2.5 text-sm text-muted-foreground\">\n <AlertCircle className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <span><span className=\"font-medium text-foreground\">{tl('Too small for you', 'Não comporta a sua operação')}</span><br />{reason}</span>\n </div>\n ) : (\n <div>\n {/* Wraps instead of overflowing: three cards side by side leave a\n narrow column, and a five-digit price does not fit it at 3xl. */}\n <p className=\"flex min-w-0 flex-wrap items-baseline gap-x-1\">\n <span className=\"text-2xl font-bold tabular-nums 2xl:text-3xl\">{p.total > 0 ? money(p.total) : tl('Free', 'Grátis')}</span>\n {p.total > 0 && <span className=\"text-sm text-muted-foreground\">{tl('/mo', '/mês')}</span>}\n </p>\n {p.total > 0 && units > 1 && (\n <p className=\"text-sm text-muted-foreground tabular-nums\">\n ≈ {money(p.total / units)} {tl('per unit', 'por unidade')}\n </p>\n )}\n </div>\n )}\n\n {features.length > 0 && (\n <ul className=\"flex-1 space-y-2 text-sm\">\n {features.map((f) => <PlanFeatureItem key={f} feature={f} iconClassName=\"h-4 w-4\" />)}\n {hidden > 0 && (\n <li>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" className=\"font-normal whitespace-normal text-sm font-medium text-primary underline-offset-2 hover:underline\" onClick={() => setAllFeatures(true)}>\n + {hidden} {tl('more', hidden === 1 ? 'recurso' : 'recursos')}\n </Button>\n </li>\n )}\n </ul>\n )}\n\n <div className=\"mt-auto space-y-2\">\n {p.quote && p.fit.fits && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onDetails}\n className=\"font-normal whitespace-normal flex w-full items-center justify-center gap-1.5 py-1 text-sm text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\">\n <Calculator className=\"h-3.5 w-3.5\" />\n {tl('How we got here', 'Como chegamos neste valor')}\n </Button>\n )}\n {current ? (\n <Button variant=\"outline\" className=\"w-full\" disabled>{tl('Current plan', 'Plano atual')}</Button>\n ) : onChoose ? (\n <Button className=\"w-full\" variant={recommended ? 'default' : 'outline'} disabled={!p.fit.fits} onClick={onChoose}>\n {tl(`Switch to ${p.plan.name}`, `Mudar para ${p.plan.name}`)}\n </Button>\n ) : null}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nfunction NumberField({ icon, label, value, onChange }: {\n icon: React.ReactNode; label: string; value: number; onChange: (n: number) => void\n}) {\n return (\n <label className=\"flex h-11 items-center gap-2 rounded-input border bg-background px-3 text-sm\">\n <span className=\"text-muted-foreground\" aria-hidden>{icon}</span>\n <span className=\"text-muted-foreground\">{label}</span>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n wrapperClassName=\"w-14\"\n className=\"h-auto border-0 bg-transparent p-0 text-right font-medium tabular-nums shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n value={value}\n onChange={(e) => onChange(Math.max(1, Number(e.target.value) || 1))}\n />\n </label>\n )\n}\n\n/** One card per unit, like the proposal: what it runs (tap to take a module\n * out or put it back) and what it adds a month. */\nfunction UnitCards({ op, quoteFor }: { op: Operation; quoteFor: Quote | null }) {\n if (op.available.length === 0) return null\n return (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {op.units.map((u) => <UnitCard key={u.id} op={op} unit={u} amount={quoteFor?.lines.find((l) => l.key === `unit:${u.id}`)?.amount ?? 0} />)}\n </div>\n )\n}\n\nfunction UnitCard({ op, unit, amount }: { op: Operation; unit: UnitFootprint; amount: number }) {\n const [adding, setAdding] = React.useState(false)\n const on = op.available.filter((k) => unit.modules.includes(k))\n const off = op.available.filter((k) => !unit.modules.includes(k))\n const chip = (key: string, active: boolean) => (\n <Button variant=\"bare\" size=\"bare\" key={key} type=\"button\" aria-pressed={active} onClick={() => op.toggle(unit.id, key)}\n title={active ? tl('Take out of this unit', 'Tirar desta unidade') : tl('Add to this unit', 'Pôr nesta unidade')}\n className={cn('min-h-8 rounded-full border px-2.5 py-1 text-xs transition-colors',\n active ? 'border-primary/40 bg-primary/10 text-foreground hover:bg-primary/20' : 'border-dashed text-muted-foreground hover:text-foreground')}>\n {active ? '' : '+ '}{tl(...PRICE_BOOK[key]!.label)}\n </Button>\n )\n return (\n <div className=\"space-y-2 rounded-card border border-t-4 border-t-primary bg-card p-4\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <p className=\"min-w-0 font-semibold\">{unit.name}</p>\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{money(amount)}</span>\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {on.map((k) => chip(k, true))}\n {off.length > 0 && !adding && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setAdding(true)}\n className=\"font-normal whitespace-normal min-h-8 rounded-full px-2.5 py-1 text-xs font-medium text-primary underline-offset-2 hover:underline\">\n + {off.length} {tl(off.length === 1 ? 'module' : 'modules', off.length === 1 ? 'módulo' : 'módulos')}\n </Button>\n )}\n {adding && off.map((k) => chip(k, false))}\n </div>\n </div>\n )\n}\n\nfunction Breakdown({ q }: { q: Quote }) {\n return (\n <ul className=\"divide-y rounded-card border text-sm\">\n {q.lines.map((line) => (\n <li key={line.key} className=\"flex items-start justify-between gap-4 px-4 py-2.5\">\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{line.label}</p>\n <p className=\"text-xs text-muted-foreground\">{line.detail}</p>\n </div>\n {line.kind === 'credits' ? (\n <span className=\"shrink-0 font-medium text-violet-700 dark:text-violet-200\">{tl('Included', 'Incluído')}</span>\n ) : (\n <span className={cn('shrink-0 tabular-nums', line.amount < 0 && 'text-emerald-700 dark:text-emerald-400')}>{money(line.amount)}</span>\n )}\n </li>\n ))}\n <li className=\"flex justify-between gap-4 bg-muted/40 px-4 py-3 font-semibold\">\n <span>{tl('Total per month', 'Total por mês')}</span>\n <span className=\"tabular-nums\">{money(q.total)}</span>\n </li>\n </ul>\n )\n}\n\nfunction DetailsSheet({ open, onOpenChange, op, priced, planId, setPlanId }: {\n open: boolean\n onOpenChange: (open: boolean) => void\n op: Operation\n priced: PricedPlan[]\n planId: string | undefined\n setPlanId: (id: string) => void\n}) {\n const withMath = priced.filter((p) => p.quote)\n const scenarioInfo = PRICING_SCENARIOS.find((x) => x.id === op.scenario)\n const shown = withMath.find((p) => p.plan.id === planId) ?? withMath[0]\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent width=\"max-w-2xl\">\n <SheetHeader>\n <SheetTitle>{tl('How we price', 'Como calculamos')}</SheetTitle>\n <SheetDescription>\n {tl('Each unit pays for what it runs; the one that runs most pays in full, the others 85% (65% from the 6th). Group-wide modules are paid once.',\n 'Cada unidade paga o que usa; a que mais usa paga cheio, as outras 85% (65% a partir da 6ª). O que serve o grupo todo é pago uma vez.')}\n </SheetDescription>\n </SheetHeader>\n <SheetBody className=\"space-y-6\">\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">{tl('1. Your operation', '1. Sua operação')}</h3>\n <div className=\"flex flex-wrap items-center gap-2\">\n <ChoiceSelect\n aria-label={tl('Operation', 'Operação')}\n className=\"h-11 w-full sm:w-72\"\n value={op.scenario}\n onChange={(v) => op.setScenario(v ?? MINE)}\n options={[\n { value: MINE, label: tl('My operation', 'Minha operação') },\n // Grouped by trade, so a salon compares itself with salons.\n ...(Object.keys(SCENARIO_VERTICAL_LABELS) as Array<keyof typeof SCENARIO_VERTICAL_LABELS>).flatMap((v) =>\n PRICING_SCENARIOS.filter((x) => x.vertical === v).map((x) => ({\n value: x.id,\n label: `${tl(...SCENARIO_VERTICAL_LABELS[v])} · ${tl(...x.name)}`,\n }))),\n ]}\n />\n <NumberField icon={<Building2 className=\"h-4 w-4\" />} label={tl('Units', 'Unidades')} value={op.units.length} onChange={op.setUnitCount} />\n <NumberField icon={<Users className=\"h-4 w-4\" />} label={tl('Users', 'Usuários')} value={op.size.users} onChange={op.setUsers} />\n </div>\n {scenarioInfo?.assumptions?.length ? (\n <div className=\"rounded-input border border-dashed bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n <p className=\"font-medium text-foreground\">\n {tl('Assumptions', 'Premissas')}\n </p>\n <ul className=\"mt-1 list-disc space-y-0.5 pl-4\">\n {scenarioInfo.assumptions.map((a) => <li key={a}>{a}</li>)}\n </ul>\n </div>\n ) : null}\n <p className=\"text-xs text-muted-foreground\">\n {tl('Tap a module to take it out of a unit or put it back. The plan cards follow.', 'Toque num módulo para tirar ou pôr em uma unidade. Os cartões dos planos acompanham.')}\n </p>\n <UnitCards op={op} quoteFor={shown?.quote ?? null} />\n </section>\n\n {shown?.quote && (\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">{tl('2. The math, per plan', '2. A conta, por plano')}</h3>\n {withMath.length > 1 && (\n // Plan · value, one line each: a tab strip of names alone made the\n // reader open each plan to learn what it costs.\n <div role=\"radiogroup\" aria-label={tl('Plan', 'Plano')} className={cn('grid gap-2', withMath.length >= 3 ? 'sm:grid-cols-3' : 'sm:grid-cols-2')}>\n {withMath.map((p) => {\n const on = p.plan.id === shown.plan.id\n const seats = p.pricing?.seatsPerUnit\n const units = op.units.length\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={p.plan.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={on}\n onClick={() => setPlanId(p.plan.id)}\n className={cn(\n 'min-h-11 rounded-card border px-3 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n on ? 'border-primary bg-primary/5' : 'hover:bg-muted/40',\n )}\n >\n <span className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-sm font-semibold\">{p.plan.name}</span>\n <span className=\"text-sm font-semibold tabular-nums\">{money(p.total)}</span>\n </span>\n <span className=\"mt-0.5 block text-[11px] leading-snug text-muted-foreground\">\n {units > 1 ? `≈ ${money(p.total / units)} ${tl('per unit', 'por unidade')} · ` : ''}\n {seats === null || seats === undefined\n ? tl('Unlimited users', 'Usuários ilimitados')\n : tl(`${seats} users per unit`, `${seats} usuários por unidade`)}\n {` · ${p.aiCredits.toLocaleString('pt-BR')} ${tl('AI credits', 'créditos de IA')}`}\n </span>\n </Button>\n )\n })}\n </div>\n )}\n <Breakdown q={shown.quote} />\n </section>\n )}\n </SheetBody>\n </SheetContent>\n </Sheet>\n )\n}\n\n// ── The page block ─────────────────────────────────────────────────────────\n\n/**\n * One answer to \"what do I pay\": the account's plan and its price for THIS\n * operation on top, the plans priced the same way below, and the math behind a\n * button. The price of a plan is never a fixed number on this screen — it is\n * what this operation would pay on it.\n */\nexport function PricingOverview({ plans, currentPlanId, onChoose, onConfirm, compare }: {\n plans?: Plan[]\n currentPlanId?: string\n onChoose?: (plan: Plan) => void\n /** Switching plan composes it: the plan plus the modules it will run,\n * confirmed at once. Given, choosing a plan opens that composer. */\n onConfirm?: (plan: Plan, changes: ModuleChange[]) => Promise<void>\n /** The feature comparison, revealed on demand under the cards. */\n compare?: React.ReactNode\n}) {\n const op = useOperation()\n const sources = plans?.length ? plans : MODEL_PLANS\n const [detailsOpen, setDetailsOpen] = React.useState(false)\n const [detailsPlan, setDetailsPlan] = React.useState<string | undefined>()\n const [compareOpen, setCompareOpen] = React.useState(false)\n const [checkout, setCheckout] = React.useState<Plan | null>(null)\n const choose = onConfirm ? (plan: Plan) => setCheckout(plan) : onChoose\n\n const priced = React.useMemo<PricedPlan[]>(() => {\n const pricings = pricingForPlans(sources)\n return sources.map((plan, i) => {\n const pricing = pricings[i] ?? null\n const q = pricing ? quote(op.size, pricing) : null\n return { plan, pricing, quote: q, total: q?.total ?? plan.price, fit: planFit(plan, op.size), aiCredits: aiCreditsFor(plan, pricing) }\n })\n }, [sources, JSON.stringify(op.size)])\n\n const fitting = priced.filter((p) => p.fit.fits)\n const recommended = fitting.reduce<PricedPlan | undefined>((best, p) => (!best || p.total < best.total ? p : best), undefined)\n const current = priced.find((p) => p.plan.id === currentPlanId)\n // Savings speak to the account's own plan, never to an example's.\n const saving = op.scenario === MINE && current && recommended && current.fit.fits && recommended.plan.id !== current.plan.id\n ? current.total - recommended.total : 0\n const openDetails = (planId?: string) => { setDetailsPlan(planId ?? current?.plan.id ?? recommended?.plan.id); setDetailsOpen(true) }\n const cols = priced.length >= 4 ? 'lg:grid-cols-4' : priced.length === 3 ? 'lg:grid-cols-3' : 'lg:grid-cols-2'\n\n return (\n <div className=\"space-y-8\">\n {/* The answer first: your plan, what you pay, and the one thing worth knowing. */}\n <Card>\n <CardContent className=\"flex flex-col gap-5 p-5 md:flex-row md:items-center md:justify-between\">\n <div className=\"min-w-0 space-y-1\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {op.simulated ? tl('Simulation', 'Simulação') : current ? tl('Your plan', 'Seu plano') : tl('Your operation', 'Sua operação')}\n </p>\n {current && !op.simulated ? (\n <p className=\"flex flex-wrap items-baseline gap-x-2\">\n <span className=\"text-lg font-semibold\">{current.plan.name}</span>\n <span className=\"text-3xl font-bold tabular-nums\">{current.total > 0 ? money(current.total) : tl('Free', 'Grátis')}</span>\n {current.total > 0 && <span className=\"text-sm text-muted-foreground\">{tl('/mo for your operation', '/mês para a sua operação')}</span>}\n </p>\n ) : recommended ? (\n <p className=\"flex flex-wrap items-baseline gap-x-2\">\n <span className=\"text-sm text-muted-foreground\">{tl('From', 'A partir de')}</span>\n <span className=\"text-3xl font-bold tabular-nums\">{money(recommended.total)}</span>\n <span className=\"text-sm text-muted-foreground\">{tl('/mo on', '/mês no')} {recommended.plan.name}</span>\n </p>\n ) : null}\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pt-1\">\n <Stat icon={<Building2 className=\"h-4 w-4\" />}>{op.units.length} {tl(op.units.length === 1 ? 'unit' : 'units', op.units.length === 1 ? 'unidade' : 'unidades')}</Stat>\n <Stat icon={<Users className=\"h-4 w-4\" />}>{op.size.users} {tl(op.size.users === 1 ? 'user' : 'users', op.size.users === 1 ? 'usuário' : 'usuários')}</Stat>\n <Stat icon={<Blocks className=\"h-4 w-4\" />}>{op.pkg.name} + {op.paidModules} {tl(op.paidModules === 1 ? 'extra' : 'extras', op.paidModules === 1 ? 'extra' : 'extras')}</Stat>\n </div>\n <p className=\"pt-1 text-xs text-muted-foreground\">\n {tl(`What sets your price: the modules each unit runs (the next units pay less), what serves the whole group, and the plan fee. Logins beyond the plan: R$ ${EXTRA_SEAT_PRICE} each.`,\n `O que define o seu preço: os módulos de cada unidade (as seguintes pagam menos), o que serve o grupo todo e a plataforma do plano. Login além do incluído: R$ ${EXTRA_SEAT_PRICE} cada.`)}\n </p>\n {saving > 0.5 && (\n <p className=\"flex items-center gap-1.5 pt-1 text-sm font-medium text-emerald-700 dark:text-emerald-400\">\n <TrendingDown className=\"h-4 w-4\" aria-hidden />\n {tl(`On ${recommended!.plan.name} you would pay ${money(saving)} less a month.`,\n `No ${recommended!.plan.name} você pagaria ${money(saving)} a menos por mês.`)}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col gap-2 sm:flex-row md:flex-col\">\n <Button variant=\"outline\" className=\"h-11\" onClick={() => openDetails()}>\n <Calculator className=\"h-4 w-4\" />\n {tl('See the details', 'Ver detalhes do cálculo')}\n </Button>\n {op.simulated && (\n <Button variant=\"ghost\" className=\"h-11\" onClick={op.reset}>\n <RotateCcw className=\"h-4 w-4\" />\n {tl('Back to my numbers', 'Voltar aos meus números')}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n\n {/* The account's own meter: hidden while simulating someone else's numbers. */}\n {current && op.scenario === MINE && (() => {\n const next = priced.find((p) => p.aiCredits > current.aiCredits && p.plan.id !== current.plan.id && p.fit.fits)\n return (\n <AiUsageSection\n included={current.aiCredits}\n planName={current.plan.name}\n upgrade={next ? { name: next.plan.name, credits: next.aiCredits, onChoose: choose && plans?.length ? () => choose(next.plan) : undefined } : undefined}\n />\n )\n })()}\n\n <div className={cn('grid items-stretch gap-5 md:grid-cols-2', cols)}>\n {priced.map((p) => (\n <PlanCard\n key={p.plan.id}\n p={p}\n units={op.units.length}\n recommended={p.plan.id === recommended?.plan.id}\n current={op.scenario === MINE && p.plan.id === currentPlanId}\n // An example is someone else's operation: nothing to switch to from it.\n onChoose={choose && plans?.length && op.scenario === MINE ? () => choose(p.plan) : undefined}\n onDetails={() => openDetails(p.plan.id)}\n />\n ))}\n </div>\n\n {compare && (\n <div className=\"space-y-3\">\n <Button variant=\"ghost\" className=\"h-11 px-2\" aria-expanded={compareOpen} onClick={() => setCompareOpen((o) => !o)}>\n <ChevronDown className={cn('h-4 w-4 transition-transform', compareOpen && 'rotate-180')} />\n {compareOpen ? tl('Hide the comparison', 'Ocultar comparação') : tl('Compare what each plan includes', 'Comparar o que cada plano inclui')}\n </Button>\n {compareOpen && compare}\n </div>\n )}\n\n <p className=\"text-xs text-muted-foreground\">\n {tl('Not included: equipment, digital certificates, internet and the providers\\' own fees (invoicing, iFood, acquirers). Setup and migration are free.',\n 'Não incluído: equipamentos, certificado digital, internet e as taxas dos próprios provedores (emissão fiscal, iFood, adquirentes). Implantação e migração sem custo.')}\n </p>\n\n <PlanCheckoutSheet\n plan={checkout}\n pricing={checkout ? priced.find((p) => p.plan.id === checkout.id)?.pricing ?? null : null}\n size={op.size}\n trades={op.trades}\n currentTotal={op.scenario === MINE ? current?.total : undefined}\n onCancel={() => setCheckout(null)}\n onConfirm={async (plan, changes) => { await onConfirm!(plan, changes); setCheckout(null) }}\n />\n <DetailsSheet open={detailsOpen} onOpenChange={setDetailsOpen} op={op} priced={priced} planId={detailsPlan} setPlanId={setDetailsPlan} />\n </div>\n )\n}\n","import type { AppConfig } from '@fayz-ai/core'\n\n/**\n * Snapshot of `app_config()` so a reload paints the tenant's own shell before\n * the network answers.\n *\n * The in-memory cache in @fayz-ai/core survives a route change and dies with\n * the tab, so every reload used to render the app's DEFAULT rail first and\n * correct itself a round trip later — the one flash a tenant with a trimmed\n * menu notices, because the modules they turned off appear and then leave.\n *\n * Same shape as the org snapshot next door (see ../org/cache.ts): versioned,\n * keyed by tenant, dropped when too old, skipped when too big. It is a paint\n * accelerator, never the source of truth — `useAppConfig` always revalidates.\n */\n\nconst STORAGE_KEY = 'fayz:app-config'\nconst VERSION = 1\n\n/** Painted without waiting for the network. Beyond this it is still painted, but as stale. */\nexport const APP_CONFIG_TTL_MS = 5 * 60 * 1000\n/** Older than this and the snapshot is dropped rather than painted. */\nconst MAX_AGE_MS = 24 * 60 * 60 * 1000\n/** A config this big is a defect; skip persisting rather than blow the quota. */\nconst MAX_BYTES = 256 * 1024\n\ninterface Snapshot {\n version: number\n tenantId: string\n savedAt: number\n config: AppConfig\n}\n\nfunction storage(): Storage | null {\n try {\n // The bare global, as ../org/cache.ts reads it: a test stubs `localStorage`\n // and `window` may not exist at all (SSR, a node test).\n return globalThis.localStorage ?? null\n } catch {\n // Private windows and blocked site data throw on ACCESS, not on read.\n return null\n }\n}\n\nconst keyFor = (tenantId: string) => `${STORAGE_KEY}:${tenantId}`\n\n/** The last known config for this tenant, or null. Never throws. */\nexport function readAppConfigSnapshot(tenantId: string): { config: AppConfig; stale: boolean } | null {\n const store = storage()\n if (!store) return null\n try {\n const raw = store.getItem(keyFor(tenantId))\n if (!raw) return null\n const snap = JSON.parse(raw) as Snapshot\n if (snap.version !== VERSION || snap.tenantId !== tenantId) return null\n const age = Date.now() - snap.savedAt\n if (age > MAX_AGE_MS) {\n store.removeItem(keyFor(tenantId))\n return null\n }\n return { config: snap.config, stale: age > APP_CONFIG_TTL_MS }\n } catch {\n return null\n }\n}\n\n/** Records what the server just said. Never throws. */\nexport function writeAppConfigSnapshot(tenantId: string, config: AppConfig): void {\n const store = storage()\n if (!store) return\n try {\n const payload = JSON.stringify({ version: VERSION, tenantId, savedAt: Date.now(), config } satisfies Snapshot)\n if (payload.length > MAX_BYTES) return\n store.setItem(keyFor(tenantId), payload)\n } catch {\n // A quota error must not break a render. The next load is simply cold.\n }\n}\n\n/** Drops the snapshot — after a write through the config RPCs, or on sign-out. */\nexport function clearAppConfigSnapshot(tenantId?: string): void {\n const store = storage()\n if (!store) return\n try {\n if (tenantId) {\n store.removeItem(keyFor(tenantId))\n return\n }\n for (let i = store.length - 1; i >= 0; i -= 1) {\n const key = store.key(i)\n if (key?.startsWith(`${STORAGE_KEY}:`)) store.removeItem(key)\n }\n } catch {\n // Nothing to do: a snapshot we cannot drop is revalidated anyway.\n }\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport { useCallback, useEffect, useLayoutEffect, useMemo } from 'react'\nimport { fetchAppConfig, invalidateAppConfig, toTenantPluginBindings, type AppConfig } from '@fayz-ai/core'\nimport { getSupabaseClientOptional } from '../lib/supabase'\nimport { useOrganizationStore } from '../stores/organization.store'\nimport { useAppConfigStore, activePluginIds, hasPlugin } from '../stores/app-config.store'\nimport { readAppConfigSnapshot, writeAppConfigSnapshot, clearAppConfigSnapshot } from '../app/app-config-cache'\n\n// ---------------------------------------------------------------------------\n// useAppConfig — the shell's single initial load (#280, ADR 0023).\n//\n// One call, one round trip: branding, which plugins and facets are on, the\n// tenant's menu composition, and the caller's permissions. Everything the frame\n// needs before it knows anything else.\n//\n// ── It never throws, and that is the requirement ────────────────────────────\n// A shell that will not render because a config call failed is worse than one\n// that renders defaults. `fetchAppConfig` already guarantees this; the hook\n// keeps the guarantee by treating a failure as \"an empty config, and a note in\n// the store\" rather than as an exception a boundary has to catch.\n//\n// ── Why a refresh does not blank the screen ─────────────────────────────────\n// This drives the frame. Re-reading it after an activation change must leave\n// the previous answer on screen until the new one lands, or every toggle is a\n// flash of empty application.\n// ---------------------------------------------------------------------------\n\nexport interface UseAppConfigResult {\n config: AppConfig\n /** True only until the first answer arrives. */\n initializing: boolean\n /**\n * A configuração em mãos é sobre a conta em que a sessão está.\n *\n * Falso na janela entre escolher outra conta e a resposta dela chegar — a\n * janela em que o shell pintava o rail do bundle e o guarda de rota negava\n * por não ter perfil ainda. Quem renderiza a moldura espera por isto.\n */\n ready: boolean\n stale: boolean\n error: string | null\n /** Active plugin ids, facets folded in. */\n activePlugins: string[]\n /** `has('financial')` for the plugin, `has('financial', 'reconciliation')` for a part. */\n has: (plugin: string, facet?: string) => boolean\n /** What `resolvePluginRuntime` takes — the bridge from config to the runtime. */\n bindings: ReturnType<typeof toTenantPluginBindings>\n /** Re-reads after an activation change. Keeps the current config visible. */\n refresh: () => Promise<void>\n}\n\n/** How often to ask whether the tenant's entitlements moved. One timestamp. */\nconst CONFIG_POLL_MS = 60_000\n\nconst EMPTY = { tenant_id: null, plugins: [], apps: [], nav: [], permissions: [] } as AppConfig\n\nasync function loadFor(tenantId: string | null, force = false): Promise<AppConfig> {\n const supabase = getSupabaseClientOptional()\n // No client is not an error — a storybook, a test, a page rendered before\n // sign-in. An empty config renders the defaults, which is the point.\n if (!supabase) return { ...EMPTY, tenant_id: tenantId }\n return fetchAppConfig(supabase, { tenantId: tenantId ?? undefined, force })\n}\n\nexport function useAppConfig(options?: { enabled?: boolean }): UseAppConfigResult {\n const enabled = options?.enabled !== false\n const currentOrg = useOrganizationStore((state) => state.currentOrg)\n const tenantId = currentOrg?.id ?? null\n\n const config = useAppConfigStore((state) => state.config)\n const configTenantId = useAppConfigStore((state) => state.tenantId)\n const beginTenant = useAppConfigStore((state) => state.beginTenant)\n const initializing = useAppConfigStore((state) => state.initializing)\n const stale = useAppConfigStore((state) => state.stale)\n const error = useAppConfigStore((state) => state.error)\n const setConfig = useAppConfigStore((state) => state.setConfig)\n const setStale = useAppConfigStore((state) => state.setStale)\n const setError = useAppConfigStore((state) => state.setError)\n const reset = useAppConfigStore((state) => state.reset)\n\n const refresh = useCallback(async () => {\n setStale(true)\n try {\n if (tenantId) {\n invalidateAppConfig(tenantId)\n clearAppConfigSnapshot(tenantId)\n }\n const next = await loadFor(tenantId, true)\n if (tenantId) writeAppConfigSnapshot(tenantId, next)\n setConfig(next, tenantId)\n } catch (err) {\n setError(errorMessage(err))\n } finally {\n setStale(false)\n }\n }, [tenantId, setConfig, setError, setStale])\n\n // A conta mudou: o que está em tela não é sobre ela.\n //\n // Antes desta marca o shell seguia com a configuração anterior (ou o padrão\n // do bundle) até a resposta nova chegar, e então trocava tudo de uma vez —\n // o rail curto e o \"acesso restrito\" que piscavam na troca de conta.\n useLayoutEffect(() => {\n if (!enabled) return\n if (configTenantId !== tenantId) beginTenant(tenantId)\n }, [enabled, tenantId, configTenantId, beginTenant])\n\n // Paint the tenant's own shell before the network answers.\n //\n // In a layout effect, not a plain one: the rail is composed during render, so\n // an effect that lands after paint shows the app's DEFAULT menu for a frame\n // and corrects it — which is exactly the flash a tenant with modules turned\n // off notices, because the ones they removed appear and then leave.\n useLayoutEffect(() => {\n if (!enabled || !tenantId) return\n const snap = readAppConfigSnapshot(tenantId)\n if (!snap) return\n setConfig(snap.config, tenantId)\n if (snap.stale) setStale(true)\n }, [enabled, tenantId, setConfig, setStale])\n\n useEffect(() => {\n if (!enabled) {\n reset()\n return\n }\n let cancelled = false\n void (async () => {\n try {\n const next = await loadFor(tenantId)\n if (cancelled) return\n if (tenantId) writeAppConfigSnapshot(tenantId, next)\n setConfig(next, tenantId)\n setStale(false)\n } catch (err) {\n // fetchAppConfig does not throw; this catches a client that does.\n if (!cancelled) setError(errorMessage(err))\n }\n })()\n return () => {\n cancelled = true\n }\n }, [enabled, tenantId, setConfig, setError, setStale, reset])\n\n // A plan change has to reach the screen without a reload (#281, ADR 0025).\n //\n // Polling `app_config()` would work and would be wasteful — it returns\n // branding, every activation, the whole menu. `tenant_config_version()`\n // returns one timestamp, so the common case (nothing changed) costs a number,\n // and the config is re-read only when it actually moved. An upgrade taken on\n // the billing page lights up the module on this one within a minute, and a\n // downgrade takes it away just as quickly.\n useEffect(() => {\n if (!enabled || !tenantId) return\n const supabase = getSupabaseClientOptional()\n if (!supabase) return\n let cancelled = false\n let seen: string | null = null\n\n const poll = async () => {\n try {\n const { data, error } = await supabase.rpc('tenant_config_version')\n if (cancelled || error || !data) return\n const stamp = String(data)\n if (seen === null) {\n seen = stamp\n return\n }\n if (stamp !== seen) {\n seen = stamp\n invalidateAppConfig(tenantId)\n const next = await loadFor(tenantId, true)\n writeAppConfigSnapshot(tenantId, next)\n setConfig(next, tenantId)\n }\n } catch {\n // A poll that fails changes nothing on screen, which is the correct\n // outcome: the config already rendered is still the last good answer.\n }\n }\n\n const timer = setInterval(() => void poll(), CONFIG_POLL_MS)\n void poll()\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [enabled, tenantId, setConfig])\n\n // Derived per config, not per render. `bindings` feeds the dependency array of\n // the plugin runtime: a fresh array on every render would re-resolve the whole\n // runtime on every render and remount every plugin page under it.\n const activePlugins = useMemo(() => activePluginIds(config), [config])\n const bindings = useMemo(() => toTenantPluginBindings(config), [config])\n const has = useCallback(\n (plugin: string, facet?: string) => hasPlugin(config, plugin, facet),\n [config],\n )\n\n // Sem conta escolhida não há o que esperar: a tela de escolha é a própria\n // resposta. Com conta, `ready` só é verdade quando a configuração em mãos é a\n // dela.\n const ready = !tenantId || (configTenantId === tenantId && !initializing)\n\n return { config, initializing, ready, stale, error, activePlugins, has, bindings, refresh }\n}\n\n","import * as React from 'react'\nimport { Crown, Check, Minus } from 'lucide-react'\nimport { parsePlanFeature } from './plan-feature'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable, toast } from '@fayz-ai/ui'\nimport { invalidateAppConfig } from '@fayz-ai/core'\nimport type { Plan } from '@fayz-ai/core'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useBillingStore } from '../../billing/store'\nimport { useOrgAdapterOptional } from '../../org/context'\nimport { useOrganizationStore } from '../../org/store'\nimport { usePermissionsStore } from '../../permissions'\nimport { formatPlanPrice } from '../../lib/currency'\nimport { getPlanEntitlements } from './access-contract'\nimport { PricingOverview } from './PricingOverview'\nimport type { ModuleChange } from './PlanCheckoutSheet'\nimport { getSupabaseClientOptional } from '../../lib/supabase'\nimport { clearAppConfigSnapshot } from '../../app/app-config-cache'\nimport { useAppConfig } from '../../hooks/useAppConfig'\n\n// ---------------------------------------------------------------------------\n// SubscriptionPage — the shell's self-serve subscription surface. Present as the\n// /settings/subscription tab whenever `config.billing` is configured. Reads the\n// plans seeded into the billing store from config, resolves the current plan\n// from `currentOrg.plan`, and changes plan via the checkout seam (Stripe/Pix) or,\n// when no seam is configured, an optimistic `adapter.updateOrg(orgId, { plan })`.\n// ---------------------------------------------------------------------------\n\ninterface MatrixRow {\n id: string\n label: string\n cell: (plan: Plan) => React.ReactNode\n odd: boolean\n}\n\nexport function SubscriptionPage({ className }: { className?: string }) {\n const { t } = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n const plans = useBillingStore((s) => s.plans)\n const checkout = useBillingStore((s) => s.checkout)\n const adapter = useOrgAdapterOptional()\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n\n const currentPlanId = currentOrg?.plan || 'free'\n\n const { refresh: refreshAppConfig } = useAppConfig()\n\n // Feature matrix — union of every plan's features, order-preserved.\n const allFeatures = React.useMemo(() => {\n const seen = new Set<string>()\n const out: string[] = []\n for (const plan of plans) {\n for (const f of plan.features) {\n if (!seen.has(f)) {\n seen.add(f)\n out.push(f)\n }\n }\n }\n return out\n }, [plans])\n\n // Real entitlements matrix — derived from plan.entitlements when any plan\n // declares them. Feature rows show ✓/— per plan; limit rows show \"Up to N\" /\n // \"Unlimited\". Falls back to the marketing-bullet matrix (allFeatures) below\n // when no plan carries entitlements.\n const featureCatalog = usePermissionsStore((s) => s.features)\n const entitlementsMatrix = React.useMemo(() => {\n const hasAny = plans.some((p) => getPlanEntitlements(p))\n if (!hasAny) return null\n\n const featureIds: string[] = []\n const featureSeen = new Set<string>()\n const limitKeys: string[] = []\n const limitSeen = new Set<string>()\n for (const plan of plans) {\n const ent = getPlanEntitlements(plan)\n for (const id of Object.keys(ent?.features ?? {})) {\n if (!featureSeen.has(id)) { featureSeen.add(id); featureIds.push(id) }\n }\n for (const key of Object.keys(ent?.limits ?? {})) {\n if (!limitSeen.has(key)) { limitSeen.add(key); limitKeys.push(key) }\n }\n }\n if (featureIds.length === 0 && limitKeys.length === 0) return null\n\n const labelForFeature = (id: string) => featureCatalog.find((f) => f.id === id)?.label ?? id\n const labelForLimit = (key: string) => {\n const v = t(`limit.label.${key}`)\n return !v || v === `limit.label.${key}` ? key : v\n }\n return { featureIds, limitKeys, labelForFeature, labelForLimit }\n }, [plans, featureCatalog, t])\n\n async function applyChange(plan: Plan): Promise<boolean> {\n try {\n // Seam: a configured gateway (Stripe/Pix) owns the transition; the webhook\n // is the source of truth for the persisted plan, so we don't mutate here.\n if (checkout) {\n await checkout(plan.id)\n return true\n }\n // No gateway: optimistic org update. Persist + swap the store so the plan\n // badge and CTAs re-render immediately.\n if (adapter && currentOrg) {\n const updated = await adapter.updateOrg(currentOrg.id, { plan: plan.id })\n setCurrentOrg(updated)\n } else if (currentOrg) {\n setCurrentOrg({ ...currentOrg, plan: plan.id })\n }\n toast.success(\n tr('billing.planChanged', 'Plan updated').replace('{{plan}}', plan.name),\n )\n return true\n } catch {\n toast.error(tr('billing.planChangeFailed', \"Couldn't change your plan. Please try again.\"))\n return false\n }\n }\n\n const featureMark = (on: boolean) =>\n on ? <Check className=\"mx-auto h-4 w-4 text-primary\" /> : <Minus className=\"mx-auto h-4 w-4 text-muted-foreground/40\" />\n const limitText = (cap: number | undefined) =>\n cap === undefined\n ? '—'\n : cap < 0\n ? tr('billing.unlimited', 'Unlimited')\n : tr('billing.upTo', 'Up to {count}').replace('{count}', String(cap)).replace('{{count}}', String(cap))\n const matrixRows: MatrixRow[] = (\n entitlementsMatrix\n ? [\n ...entitlementsMatrix.featureIds.map((id) => ({\n id: `f:${id}`,\n label: entitlementsMatrix.labelForFeature(id),\n cell: (plan: Plan) => featureMark(getPlanEntitlements(plan)?.features?.[id] !== false),\n })),\n ...entitlementsMatrix.limitKeys.map((key) => ({\n id: `l:${key}`,\n label: entitlementsMatrix.labelForLimit(key),\n cell: (plan: Plan) => <span className=\"text-muted-foreground\">{limitText(getPlanEntitlements(plan)?.limits?.[key])}</span>,\n })),\n ]\n : allFeatures.map((feature) => ({\n id: feature,\n label: parsePlanFeature(feature).label,\n cell: (plan: Plan) => featureMark(plan.features.includes(feature)),\n }))\n ).map((row, i) => ({ ...row, odd: i % 2 === 1 }))\n const matrixColumns: ColumnDef<MatrixRow>[] = [\n { id: 'feature', header: tr('billing.features', 'Features'), cell: ({ row }) => row.original.label },\n ...plans.map((plan): ColumnDef<MatrixRow> => ({\n id: plan.id,\n header: () => (\n <span className=\"inline-flex items-center gap-1\">\n {plan.price > 0 && <Crown className=\"h-3.5 w-3.5 text-amber-500\" />}\n {plan.name}\n </span>\n ),\n meta: { className: 'text-center' },\n cell: ({ row }) => row.original.cell(plan),\n })),\n ]\n\n const compare = entitlementsMatrix || allFeatures.length > 0 ? (\n <div className=\"space-y-3\">\n <DataTable variant=\"flat\" columns={matrixColumns} data={matrixRows} rowClassName={(r) => (r.odd ? 'bg-muted/20' : undefined)} />\n </div>\n ) : null\n\n if (plans.length === 0) {\n return (\n <div className={className ?? 'mx-auto max-w-5xl'}>\n <PricingOverview />\n </div>\n )\n }\n\n // The plan and the modules it will run, in one confirmation. With a payment\n // gateway the plan is the webhook's to persist, so modules go first; without\n // one the plan changes first, so its ceiling lets the new modules in.\n async function applyPlanWithModules(plan: Plan, changes: ModuleChange[]) {\n const supabase = getSupabaseClientOptional()\n const failed: string[] = []\n const setModules = async () => {\n if (!supabase) return\n for (const c of changes) {\n const { error } = await supabase.rpc('tenant_plugin_set', { p_plugin: c.plugin, p_status: c.status, p_facet: c.facet })\n if (error) failed.push(c.facet ? `${c.plugin}.${c.facet}` : c.plugin)\n }\n }\n if (checkout) await setModules()\n // A plan that did not change leaves the modules as they were.\n if (plan.id !== currentPlanId && !(await applyChange(plan))) return\n if (!checkout) await setModules()\n if (currentOrg?.id) {\n invalidateAppConfig(currentOrg.id)\n clearAppConfigSnapshot(currentOrg.id)\n }\n await refreshAppConfig()\n if (failed.length) {\n toast.error(tr('billing.modulesNotChanged', 'Some modules were not changed'), { description: failed.join(', ') })\n } else if (changes.length) {\n toast.success(tr('billing.modulesChanged', 'Modules updated'))\n }\n }\n\n return (\n <div className={className ?? 'mx-auto max-w-5xl space-y-8'}>\n {/* Sem título nem descrição: a barra já escreve \"Assinatura\", e a frase\n embaixo custava uma linha para repetir o que os planos mostram. */}\n\n <PricingOverview\n plans={plans}\n currentPlanId={currentPlanId}\n onConfirm={applyPlanWithModules}\n compare={compare}\n />\n\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/billing/plan-feature.tsx","../src/access/limits-registry.ts","../src/access/upgrade-modal-store.ts","../src/access/context.tsx","../src/components/billing/access-contract.ts","../src/app/useAppPreset.ts","../src/components/billing/AiUsageSection.tsx","../src/billing/module-families.ts","../src/components/billing/PlanCheckoutSheet.tsx","../src/components/billing/PricingOverview.tsx","../src/app/app-config-cache.ts","../src/hooks/useAppConfig.ts","../src/components/billing/SubscriptionPage.tsx"],"names":["jsx","useMemo","React2","jsxs","Sparkles","money","formatCurrency","tl","usePluginRuntimeOptional","React3","Fragment","Button","Check","React4","list","Card","CardContent","AlertCircle","Breakdown","Sheet","SheetContent","SheetHeader","SheetTitle","SheetDescription","SheetBody","ChevronDown","useCallback","useEffect","error","React5","toast","invalidateAppConfig"],"mappings":"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","file":"chunk-OMRPCQR6.js","sourcesContent":["import * as React from 'react'\nimport { Check, Sparkles } from 'lucide-react'\nimport { cn } from '../../lib/cn'\n\n// A plan feature string prefixed with `*` renders highlighted (Sparkles on a\n// faint violet chip) — the config-side seam for \"hero\" features like the AI\n// assistant. Shared by UpgradePrompt, PlanSelector and the pricing cards.\n// violet-700 on violet-50 and violet-200 on violet-950 both clear AA (≥ 6:1).\n\nexport function parsePlanFeature(feature: string): { label: string; highlighted: boolean } {\n return feature.startsWith('*')\n ? { label: feature.slice(1).trim(), highlighted: true }\n : { label: feature, highlighted: false }\n}\n\nexport function PlanFeatureItem({ feature, className, iconClassName }: {\n feature: string\n className?: string\n iconClassName?: string\n}) {\n const { label, highlighted } = parsePlanFeature(feature)\n return (\n <li className={cn('flex items-start gap-2', className,\n highlighted && '-mx-1.5 rounded-md bg-violet-50 px-1.5 py-1 font-medium text-violet-700 dark:bg-violet-950/60 dark:text-violet-200')}>\n {highlighted ? (\n <Sparkles className={cn('mt-0.5 shrink-0 text-violet-600 dark:text-violet-300', iconClassName)} aria-hidden=\"true\" />\n ) : (\n <Check className={cn('mt-0.5 shrink-0 text-primary', iconClassName)} aria-hidden=\"true\" />\n )}\n <span>{label}</span>\n </li>\n )\n}\n","import type { LimitDeclaration, RegisteredEntity } from '@fayz-ai/core'\nimport { invalidateCount } from '@fayz-ai/core'\n\n/**\n * Module-level registry bridging React (the provider that knows the declarations)\n * and the plain `invalidateLimit(key)` function that create handlers call outside\n * any component. The AccessProvider publishes the merged declarations here on\n * mount; `useLimit`/`useLimitGuard` and `invalidateLimit` read from it.\n */\n\n/**\n * Shell built-in limit declarations. Unlike plugin/app limits (contributed via\n * `PluginManifest.declaredLimits` / `billing.limitDeclarations`), these count\n * core tenant tables that have no owning plugin: seats and units. Merged as the\n * LOWEST-priority layer by the AccessProvider, so a plugin or app may still\n * override a key (e.g. add a `kindFilter`).\n *\n * Counted through the public `v_*` bridges, not the base tables: the spine\n * moved memberships and units into schema `app`, which PostgREST cannot reach.\n */\nexport const CORE_LIMIT_DECLARATIONS: LimitDeclaration[] = [\n { key: 'users', label: 'Users', table: 'v_team_members' },\n { key: 'locations', label: 'Companies', table: 'v_units' },\n]\n\n/**\n * Entity-derived layer of the limit merge: any registered CRUD entity carrying\n * `limitKey` yields a declaration for free from its own data mapping (table +\n * archetype kind) — a cap without a countable binding is a dead cap. Shared by\n * the AccessProvider (live registry) and the manifest derivation (agent\n * contract), so both resolve the identical layer.\n */\nexport function entityDerivedLimitDeclarations(entities: RegisteredEntity[]): LimitDeclaration[] {\n const out: LimitDeclaration[] = []\n for (const e of entities) {\n const def = e.entityDef\n if (def?.limitKey && def.data?.table) {\n out.push({\n key: def.limitKey,\n label: e.labelPlural,\n table: def.data.table,\n kindFilter: def.data.archetypeKind,\n })\n }\n }\n return out\n}\n\nlet registry = new Map<string, LimitDeclaration>()\n\n/** Called by AccessProvider whenever the merged limit declarations change. */\nexport function setLimitRegistry(declarations: LimitDeclaration[]): void {\n const next = new Map<string, LimitDeclaration>()\n for (const decl of declarations) next.set(decl.key, decl)\n registry = next\n}\n\nexport function getLimitDeclaration(key: string): LimitDeclaration | undefined {\n return registry.get(key)\n}\n\n// --- Invalidation pub/sub -------------------------------------------------\n// useLimit subscribes per key; invalidateLimit(key) drops the cached count for\n// the declaration's table and notifies subscribers to re-fetch.\n\nconst listeners = new Map<string, Set<() => void>>()\n\nexport function subscribeLimit(key: string, cb: () => void): () => void {\n let set = listeners.get(key)\n if (!set) {\n set = new Set()\n listeners.set(key, set)\n }\n set.add(cb)\n return () => {\n set?.delete(cb)\n if (set && set.size === 0) listeners.delete(key)\n }\n}\n\n/**\n * Invalidate a limit after a create/delete so its next read is fresh, then wake\n * any mounted `useLimit(key)`. Safe to call from plain handlers (no React).\n */\nexport function invalidateLimit(key: string): void {\n const decl = registry.get(key)\n if (decl) invalidateCount(decl.table)\n listeners.get(key)?.forEach((cb) => cb())\n}\n","import { create } from 'zustand'\n\n/**\n * Payload describing WHY the upgrade modal opened, so the visual component (owned\n * by the shell/gates layer) can tailor its copy — a hit quantity cap\n * (`limitKey`) or a plan-gated feature (`feature`).\n */\nexport interface UpgradeModalPayload {\n limitKey?: string\n feature?: string\n}\n\nexport interface UpgradeModalStore {\n /** The active payload, or null when closed. */\n current: UpgradeModalPayload | null\n open(payload: UpgradeModalPayload): void\n close(): void\n}\n\n/**\n * Global, lightweight store for the single app-wide UpgradeModal. `useLimitGuard`\n * and imperative create handlers call `open(...)` when a limit blocks; the visual\n * modal (rendered once near the shell root by the gates layer) subscribes to\n * `current`. Kept as a zustand singleton so store + component share one instance.\n */\nexport const useUpgradeModalStore = create<UpgradeModalStore>((set) => ({\n current: null,\n open: (payload) => set({ current: payload }),\n close: () => set({ current: null }),\n}))\n","import * as React from 'react'\nimport type { LimitDeclaration, PermissionAction, Plan } from '@fayz-ai/core'\nimport { countByTenant, usePluginRuntimeOptional, getAllEntities } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../org/store'\nimport { usePermissionsStore } from '../permissions/store'\nimport { useBillingStore } from '../billing/store'\nimport { effectivePlan, useTrial } from '../billing/trial'\nimport { mergeLimitDeclarations, resolveAccess, isEntitledByPlan, resolveLimit } from '@fayz-ai/core/access'\nimport { entityDerivedLimitDeclarations } from './limits-registry'\nimport { setLimitRegistry, getLimitDeclaration, subscribeLimit, CORE_LIMIT_DECLARATIONS } from './limits-registry'\nimport { useUpgradeModalStore } from './upgrade-modal-store'\nimport type { AccessApi, AccessDecision, AccessSession, LimitState } from './types'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface AccessContextValue extends AccessApi {\n session: AccessSession\n}\n\nconst AccessContext = React.createContext<AccessContextValue | null>(null)\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface AccessProviderProps {\n children: React.ReactNode\n /**\n * App-level limit declarations layered ON TOP of the plugins' `declaredLimits`\n * (app wins on key collision). Sourced from `config.billing.limitDeclarations`.\n */\n limitDeclarations?: LimitDeclaration[]\n /** Plan the tenant is entitled to while its trial runs. See billing/trial.ts. */\n trialPlanId?: string\n}\n\n/**\n * Assembles the reactive {@link AccessSession} from the singleton stores and\n * exposes the composed access API (role × plan). Thin by design — mounts just\n * inside PermissionsProvider so it can reuse the live permission profile and the\n * plugin runtime. Also publishes the merged limit declarations to the module\n * registry so `invalidateLimit` works from non-React create handlers.\n */\nexport function AccessProvider({ children, limitDeclarations, trialPlanId }: AccessProviderProps) {\n const user = useAuthStore((s) => s.user)\n const org = useOrganizationStore((s) => s.currentOrg)\n const profile = usePermissionsStore((s) => s.currentProfile)\n const plans = useBillingStore((s) => s.plans)\n\n const runtime = usePluginRuntimeOptional()\n const pluginLimits = runtime?.pluginLimits\n\n // Merge limit declarations by priority (later wins by key): shell built-ins\n // (users/locations) < entity-derived < plugin `declaredLimits` < app\n // overrides. Then publish to the module registry consumed by\n // invalidateLimit / the limit hooks.\n //\n // Entity-derived: any registered CRUD entity carrying `limitKey` yields a\n // declaration for free from its own data mapping (table + archetype kind) —\n // this is what makes an app's `EntityDef.limitKey: 'clients'` enforceable\n // with ZERO extra wiring (a cap without a countable binding is a dead cap).\n React.useEffect(() => {\n setLimitRegistry(\n mergeLimitDeclarations(\n CORE_LIMIT_DECLARATIONS,\n entityDerivedLimitDeclarations(getAllEntities()),\n pluginLimits,\n limitDeclarations,\n ),\n )\n }, [pluginLimits, limitDeclarations])\n\n // The trial is resolved HERE and nowhere else: it changes which plan's\n // entitlements apply, and every gate in the product already reads that. A\n // per-feature \"…or on trial\" check would have to be repeated in the nav, the\n // gates, the caps and the assistant, and one of them would be forgotten.\n const trial = useTrial()\n const plan: Plan | null = React.useMemo(\n () => effectivePlan(org, plans, trial, trialPlanId),\n [plans, org?.plan, trial.status, trialPlanId],\n )\n\n const session: AccessSession = React.useMemo(\n () => ({ user, org, profile, plan }),\n [user, org, profile, plan],\n )\n\n const value = React.useMemo<AccessContextValue>(\n () => ({\n session,\n can: (feature, action) => resolveAccess(session, feature, action),\n entitled: (feature) => isEntitledByPlan(session.plan, feature),\n }),\n [session],\n )\n\n return <AccessContext.Provider value={value}>{children}</AccessContext.Provider>\n}\nAccessProvider.displayName = 'AccessProvider'\n\n// ---------------------------------------------------------------------------\n// Hooks\n// ---------------------------------------------------------------------------\n\nconst ALLOW_ALL: AccessApi = {\n can: () => ({ allowed: true }),\n entitled: () => true,\n}\n\n/**\n * The composed access API. Throws outside <AccessProvider> — use\n * {@link useAccessOptional} for SDK components that must degrade gracefully.\n */\nexport function useAccess(): AccessApi {\n const ctx = React.useContext(AccessContext)\n if (!ctx) throw new Error('useAccess must be used inside <AccessProvider>')\n return { can: ctx.can, entitled: ctx.entitled }\n}\n\n/**\n * Like {@link useAccess} but degrades to allow-all when no provider is mounted,\n * so components stay usable under a bare host shell (gating is an enhancement).\n */\nexport function useAccessOptional(): AccessApi {\n const ctx = React.useContext(AccessContext)\n return ctx ? { can: ctx.can, entitled: ctx.entitled } : ALLOW_ALL\n}\n\n/** Internal: the live session (for hooks that need tenant/plan directly). */\nfunction useAccessSession(): AccessSession | null {\n return React.useContext(AccessContext)?.session ?? null\n}\n\n// ---------------------------------------------------------------------------\n// Limits\n// ---------------------------------------------------------------------------\n\nfunction resolveCap(plan: Plan | null, key: string): number | undefined {\n return plan?.entitlements?.limits?.[key]\n}\n\n/**\n * Live usage of a quantity limit for the active tenant. Resolves the limit's\n * declaration (plugin manifest or app override) → a tenant-scoped `count(*)`,\n * capped by the current plan. No declaration or no cap (or `-1`) ⇒ unlimited.\n * Re-fetches when the tenant, plan cap, or an `invalidateLimit(key)` fires.\n */\nexport function useLimit(key: string): LimitState {\n const session = useAccessSession()\n const tenantId = session?.org?.id\n const cap = resolveCap(session?.plan ?? null, key)\n const declaration = getLimitDeclaration(key)\n\n const unlimited = !declaration || cap === undefined || cap === -1\n\n const [used, setUsed] = React.useState(0)\n const [loading, setLoading] = React.useState(!unlimited)\n const [version, setVersion] = React.useState(0)\n\n const refresh = React.useCallback(() => setVersion((v) => v + 1), [])\n\n // Wake on external invalidation (a create/delete elsewhere).\n React.useEffect(() => subscribeLimit(key, refresh), [key, refresh])\n\n React.useEffect(() => {\n if (unlimited || !declaration || !tenantId) {\n setUsed(0)\n setLoading(false)\n return\n }\n let active = true\n setLoading(true)\n countByTenant(declaration.table, {\n kind: declaration.kindFilter,\n period: declaration.period,\n tenantId,\n fresh: version > 0,\n })\n .then((n) => {\n if (active) {\n setUsed(n)\n setLoading(false)\n }\n })\n .catch(() => {\n if (active) setLoading(false)\n })\n return () => {\n active = false\n }\n }, [unlimited, declaration, tenantId, version])\n\n const bounds = resolveLimit({ cap, hasDeclaration: Boolean(declaration), used })\n\n return { key, ...bounds, loading, refresh }\n}\n\n/**\n * Imperative guard for create handlers: `await guard(n)` returns `'ok'` when\n * adding `n` more rows stays within the cap, or `'blocked'` (and opens the global\n * UpgradeModal) when it would exceed it. Always checks a FRESH count so it never\n * relies on stale hook state.\n */\nexport function useLimitGuard(key: string): (n?: number) => Promise<'ok' | 'blocked'> {\n const session = useAccessSession()\n const tenantId = session?.org?.id\n const plan = session?.plan ?? null\n const openModal = useUpgradeModalStore((s) => s.open)\n\n return React.useCallback(\n async (n = 1) => {\n const cap = resolveCap(plan, key)\n const declaration = getLimitDeclaration(key)\n // Unlimited / no declaration / no tenant ⇒ never block.\n if (!declaration || cap === undefined || cap === -1 || !tenantId) return 'ok'\n\n const used = await countByTenant(declaration.table, {\n kind: declaration.kindFilter,\n period: declaration.period,\n tenantId,\n fresh: true,\n })\n\n if (used + n > cap) {\n openModal({ limitKey: key })\n return 'blocked'\n }\n return 'ok'\n },\n [key, plan, tenantId, openModal],\n )\n}\n","// ---------------------------------------------------------------------------\n// access-contract — the single import seam the billing UI uses for the\n// entitlements engine (UpgradePrompt, UpgradeModal, EntitlementGate, LimitGate,\n// SoftLimitWidget, the AdminShell route guard / nav badge, SubscriptionPage\n// matrix). Re-exports the core access engine (packages/saas/src/access) so the\n// billing layer has ONE stable path and the wiring (AccessProvider) stays in the\n// núcleo. `getPlanEntitlements` is a thin local reader — core's Plan carries the\n// entitlements, so this just narrows the access.\n//\n// (History: this file shipped as a temporary stub while the access engine landed\n// in parallel; now repointed to the real module. The public names/types below\n// match the fixed contract, so no billing-wave consumer changed.)\n// ---------------------------------------------------------------------------\nimport type { Plan, PlanEntitlements } from '@fayz-ai/core'\n\nexport { useAccessOptional, useLimit, useLimitGuard } from '../../access/context'\nexport { invalidateLimit } from '../../access/limits-registry'\nexport { useUpgradeModalStore } from '../../access/upgrade-modal-store'\n\nexport type { AccessApi, AccessDecision } from '../../access/types'\n// The billing layer refers to the limit shape as `LimitInfo`; the engine calls\n// it `LimitState`. Same structure — alias to keep call sites stable.\nexport type { LimitState as LimitInfo } from '../../access/types'\nexport type { PlanEntitlements } from '@fayz-ai/core'\n\n/** Narrow a plan to its entitlements (undefined when the plan declares none). */\nexport function getPlanEntitlements(plan: Plan | undefined | null): PlanEntitlements | undefined {\n return plan?.entitlements\n}\n\n/**\n * Clean a feature's raw permission label into a display name for the upgrade\n * surfaces. Feature labels in an app's permissions config carry an access-scope\n * suffix — e.g. \"Marketing (acesso)\" / \"Reports (access)\" — which reads as noise\n * when interpolated into a headline (\"Unlock Marketing (acesso)\"). Strip a single\n * trailing parenthetical group and collapse surrounding whitespace. Shared by\n * UpgradePrompt AND UpgradeModal so the two surfaces stay in lockstep.\n */\nexport function featureDisplayName(label: string | null | undefined): string {\n if (!label) return ''\n return label.replace(/\\s*\\([^)]*\\)\\s*$/, '').trim() || label.trim()\n}\n\n/**\n * Which ISO-4217 code to price a plan in. `Plan.currency` is the source of\n * truth, but apps DO ship billing configs that omit it — and silently printing\n * \"$79\" to a tenant billed in reais is worse than any other failure mode here.\n * So the fallback follows the ACTIVE LOCALE's region rather than a hardcoded\n * 'USD'; only a locale we can't place at all lands on USD.\n */\nconst CURRENCY_BY_REGION: Record<string, string> = {\n BR: 'BRL', PT: 'EUR', ES: 'EUR', FR: 'EUR', DE: 'EUR', IT: 'EUR', NL: 'EUR', IE: 'EUR',\n GB: 'GBP', US: 'USD', CA: 'CAD', AU: 'AUD', MX: 'MXN', AR: 'ARS', CL: 'CLP', CO: 'COP',\n}\n\nexport function resolvePlanCurrency(planCurrency: string | undefined, locale: string | undefined): string {\n if (planCurrency) return planCurrency\n const region = locale?.split(/[-_]/)[1]?.toUpperCase()\n return (region && CURRENCY_BY_REGION[region]) || 'USD'\n}\n","import { useMemo } from 'react'\nimport { useAppConfigStore } from '../stores/app-config.store'\nimport { resolveAppId } from '../directory/app-id'\nimport type { FayzAppConfig } from './config'\n\n/**\n * O ponto de partida do aplicativo que ESTA conta roda (077).\n *\n * ── O que ele conserta ─────────────────────────────────────────────────────\n * O aplicativo central monta o rail a partir dos plugins ligados, e para um\n * restaurante isso deu quinze linhas planas — Pedidos, Agenda, Cozinha, Salão,\n * Estoque, CRM, Marketing, Reservas, Financeiro… O ChefControl resolveu isso\n * com SETE rubricas e filhos dentro, e esse desenho é conhecimento de produto\n * validado em cliente. Pedir a cada conta que o remonte a partir de plugins\n * soltos é pedir que ela redescubra o que já sabíamos.\n *\n * ── A conta ESTENDE, não recria ────────────────────────────────────────────\n * O preset diz a árvore; `app.tenant_plugins` diz o que desta conta está\n * ligado; e o shell poda o que sobrou apontando para nada (ver nav-serving).\n * Uma rubrica cujos filhos estão todos desligados não desenha — \"Operação\"\n * some sozinha numa casa sem cozinha, sem mesa e sem reserva.\n *\n * ── Quando a conta roda dois aplicativos ───────────────────────────────────\n * Papa Léguas roda ChefControl e StoreControl sobre os mesmos dados. O preset\n * é o do PRIMEIRO — `app_config()` já os ordena — porque um rail com as duas\n * árvores não é a soma de dois sistemas, é nenhum dos dois.\n */\nexport interface AppPreset {\n shell?: {\n layout?: FayzAppConfig['layout']\n moduleNav?: FayzAppConfig['moduleNav']\n contentFrame?: boolean\n navChildConnector?: boolean\n }\n /**\n * Como este ofício agrupa e ordena o rail (083). Ver ./rail-preset.\n *\n * Uma string é um plugin, com os rótulos DELE; um objeto é uma rubrica, e\n * `under` são prefixos de rota. O preset nunca diz como uma linha se chama —\n * era isso que fazia a árvore de SQL discordar dos plugins.\n */\n rail?: Array<string | { label: string; icon?: string; under: string[] }>\n /**\n * As rotas que este ofício NÃO põe no rail — o `hideNav()` em forma de dado.\n * Ver ./rail-preset.\n */\n hide?: string[]\n /**\n * Os módulos que ABREM INTEIROS: uma linha no rail, sem sanfona, porque a\n * própria página já desenha a faixa de abas das telas irmãs. Prefixos de\n * rota. Ver ./rail-preset.\n */\n whole?: string[]\n /**\n * O VOCABULÁRIO deste ofício: rota → nome. Ver ./rail-preset (`labelFor`).\n *\n * O plugin continua sendo quem nomeia por padrão; isto é a conta dizendo\n * que na CASA dela aquela tela se chama outra coisa — \"Funcionários\" onde o\n * plugin diz \"Equipe\" —, e é assim que quem vem do V1 reconhece o menu.\n */\n labels?: Record<string, string>\n /** O que este ofício OFERECE (079). Ver `useOfferedPlugins`. */\n modules?: string[]\n}\n\nexport function useAppPreset(): AppPreset {\n const apps = useAppConfigStore((s) => s.config.apps)\n return useMemo(() => {\n const own = (apps ?? []).find((a) => !(a as { house?: boolean }).house)\n return ((own as { preset?: AppPreset } | undefined)?.preset ?? {}) as AppPreset\n }, [apps])\n}\n\n/**\n * O catálogo desta conta: a união do que cada ofício que ela roda oferece (079).\n *\n * UNIÃO e não \"o primeiro\", ao contrário do rail: Papa Léguas roda ChefControl\n * e StoreControl, desenha UM rail (dois não seriam nenhum) mas TEM os dois\n * catálogos — a loja dele existe mesmo com o rail sendo o do restaurante.\n *\n * Vazio quando nenhum aplicativo declarou oferta, e aí o runtime volta a ser o\n * de antes: quem cura é o `import` do aplicativo.\n */\nexport function useOfferedPlugins(): string[] {\n const apps = useAppConfigStore((s) => s.config.apps)\n return useMemo(() => {\n const ids = new Set<string>()\n for (const app of apps ?? []) {\n if ((app as { house?: boolean }).house) continue\n for (const id of (app as { preset?: AppPreset }).preset?.modules ?? []) ids.add(id)\n }\n return [...ids]\n }, [apps])\n}\n\n/**\n * A identidade no alto da trilha é da CONTA, não do produto?\n *\n * Sim em dois casos, e são o mesmo caso visto de dois lados:\n *\n * a conta tem marca própria Espaço Facial não abre um software chamado\n * StudioControl: abre o sistema DELES.\n * o pacote não tem produto O aplicativo central não é um produto — ele\n * carrega o ofício de quem entrar. O nome que\n * apareceria ali (\"FullControl\", \"ChefControl\")\n * é o do registro `app.apps`, não o do pacote, e\n * empilhá-lo sobre o seletor mostra duas\n * identidades onde só existe uma.\n *\n * Sem `VITE_APP_ID` o pacote não reivindica produto nenhum — é a mesma leitura\n * que o WrongAppGate já usa para não bloquear ninguém.\n */\nexport function useTenantLedIdentity(hasTenantBrand: boolean): boolean {\n return hasTenantBrand || resolveAppId() === null\n}\n\n/**\n * O nome que ESTE ofício dá à tela de uma rota — em qualquer superfície.\n *\n * `preset.labels` nasceu para o rail, e por um tempo só valeu lá: a barra\n * dizia \"Funcionários\" e a ficha aberta a partir dela dizia \"← Profissionais\".\n * Duas palavras para a mesma coisa, a uma linha de distância, é o bastante para\n * alguém perguntar se são dois cadastros. Vocabulário de ofício é do produto\n * inteiro, não de um componente.\n *\n * Sem rótulo no preset devolve o `fallback` — que é o nome do plugin, como\n * sempre foi.\n */\nexport function usePresetLabel(route: string | undefined, fallback: string): string {\n const preset = useAppPreset()\n return (route ? preset.labels?.[route] : undefined) ?? fallback\n}\n\n/**\n * A COR do aplicativo que esta conta roda (138).\n *\n * Irmã de `useAppPreset`, e deliberadamente com a mesma escolha: o PRIMEIRO\n * aplicativo da lista — `app_config()` já os ordena por ofício. O rail e a cara\n * têm de vir do mesmo produto, senão a casa abre com o menu do ChefControl e a\n * cor do FullControl, que é um sistema que ninguém desenhou.\n *\n * Nulo quando o aplicativo não reivindica tema (o `control-admin`, um pool que\n * ainda não rodou a 138). Aí vale o tema compilado no bundle, que é como era\n * antes desta migração — e é a leitura certa para uma ferramenta interna.\n */\nexport function useAppTheme(): unknown | null {\n const apps = useAppConfigStore((s) => s.config.apps)\n return useMemo(() => {\n const own = (apps ?? []).find((a) => !(a as { house?: boolean }).house)\n return (own as { theme?: unknown } | undefined)?.theme ?? null\n }, [apps])\n}\n","import * as React from 'react'\nimport { AlertTriangle, ArrowUpRight, ChevronDown, Sparkles } from 'lucide-react'\nimport { tl, formatCurrency } from '@fayz-ai/core'\nimport { Button, Card, CardContent, ConfirmDialog, Skeleton, toast } from '@fayz-ai/ui'\nimport { cn } from '../../lib/cn'\nimport { useBillingStore } from '../../billing/store'\nimport { EXTRA_AI_CREDITS } from '../../billing/module-pricing'\nimport { useAiUsage, type AiUsageSummary } from '../../billing/ai-usage'\n\nconst num = (n: number) => n.toLocaleString('pt-BR')\n// The platform's own prices are in BRL whatever the tenant's currency.\nconst money = (n: number) => formatCurrency(n, 'BRL')\nconst FEATURE_LABELS: Record<string, readonly [string, string]> = {\n assistant: ['Assistant', 'Assistente'],\n atendeai: ['AtendeAI (WhatsApp)', 'AtendeAI (WhatsApp)'],\n scribe: ['AI scribe', 'Escriba (IA)'],\n}\n\n/**\n * \"Uso de IA neste período\": the plan's credits like a CI minutes meter —\n * spent, left, the pace, who spends — and the way out when it runs short.\n */\nexport function AiUsageSection({ included, planName, upgrade }: {\n included: number\n planName?: string\n /** The next plan up that includes more credits, if any. */\n upgrade?: { name: string; credits: number; onChoose?: () => void }\n}) {\n const state = useAiUsage(included)\n const checkout = useBillingStore((s) => s.checkout)\n const [pack, setPack] = React.useState<(typeof EXTRA_AI_CREDITS)[number] | null>(null)\n\n const buy = async (p: (typeof EXTRA_AI_CREDITS)[number]) => {\n // The gateway seam takes an id; the credit pack is one more product on it.\n if (checkout) {\n try { await checkout(`ai-credits-${p.credits}`) } catch { toast.error(tl('Could not start the purchase.', 'Não foi possível iniciar a compra.')) }\n return\n }\n setPack(p)\n }\n\n return (\n <section aria-labelledby=\"ai-usage-title\" className=\"space-y-3\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-2\">\n <h2 id=\"ai-usage-title\" className=\"flex items-center gap-2 text-lg font-semibold\">\n <Sparkles className=\"h-4 w-4 text-violet-600 dark:text-violet-300\" aria-hidden />\n {tl('AI usage this period', 'Uso de IA neste período')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {planName ? `${planName} · ` : ''}{num(included)} {tl('credits/mo included', 'créditos/mês incluídos')}\n </p>\n </div>\n <Card>\n <CardContent className=\"space-y-4 p-5\">\n {state.status === 'loading' && <Skeleton className=\"h-16 w-full\" />}\n {state.status === 'not-metered' && (\n <EmptyState text={tl('Usage starts counting once the assistant is used this period. Your plan includes these credits every month.',\n 'O consumo começa a contar quando o assistente for usado neste período. O seu plano inclui estes créditos todo mês.')} />\n )}\n {state.status === 'empty' && (\n <>\n <Meter s={state.summary} />\n <EmptyState text={tl('No credits spent yet this period.', 'Nenhum crédito usado neste período ainda.')} />\n </>\n )}\n {state.status === 'ok' && <Usage s={state.summary} upgrade={upgrade} onBuy={buy} />}\n </CardContent>\n </Card>\n\n <ConfirmDialog\n open={pack !== null}\n onConfirm={() => setPack(null)}\n onCancel={() => setPack(null)}\n title={pack ? tl(`${num(pack.credits)} extra credits for ${money(pack.price)}`, `${num(pack.credits)} créditos extras por ${money(pack.price)}`) : ''}\n description={tl('Buying credits online is not available for this account yet. Ask support to add the pack — it is charged on the next invoice.',\n 'A compra de créditos online ainda não está disponível nesta conta. Peça o pacote ao suporte — ele entra na próxima fatura.')}\n confirmLabel={tl('Got it', 'Entendi')}\n cancelLabel={tl('Cancel', 'Cancelar')}\n />\n </section>\n )\n}\n\nfunction EmptyState({ text }: { text: string }) {\n return <p className=\"text-sm text-muted-foreground\">{text}</p>\n}\n\nfunction Meter({ s }: { s: AiUsageSummary }) {\n const pct = Math.round(s.ratio * 100)\n // The bar's scale stretches past 100% when usage or the projection does, so\n // both stay on it; the allowance line marks where 100% sits.\n const scale = Math.max(s.included, s.used, s.projected, 1)\n const at = (n: number) => `${Math.min(100, (n / scale) * 100)}%`\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1\">\n <p className=\"tabular-nums\">\n <span className=\"text-3xl font-bold\">{num(s.used)}</span>\n <span className=\"text-base text-muted-foreground\"> {tl('of', 'de')} {num(s.included)} {tl('credits', 'créditos')}</span>\n <span className={cn('ml-2 text-base font-semibold', s.over ? 'text-amber-700 dark:text-amber-300' : 'text-violet-700 dark:text-violet-300')}>· {pct}%</span>\n </p>\n <p className=\"text-sm text-muted-foreground tabular-nums\">\n {s.daysLeft} {tl(s.daysLeft === 1 ? 'day left' : 'days left', s.daysLeft === 1 ? 'dia para fechar' : 'dias para fechar')}\n </p>\n </div>\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={s.included}\n aria-valuenow={s.used}\n aria-valuetext={tl(`${num(s.used)} of ${num(s.included)} credits`, `${num(s.used)} de ${num(s.included)} créditos`)}\n aria-label={tl('AI credits used', 'Créditos de IA usados')}\n className=\"relative h-4 w-full rounded-full bg-muted\"\n >\n {/* Projection: a faint band from today's usage to the period's end at this pace. */}\n {s.projected > s.used && (\n <div className={cn('absolute inset-y-0 left-0 rounded-full', s.projectedOver ? 'bg-amber-200 dark:bg-amber-900/70' : 'bg-violet-200 dark:bg-violet-900/70')} style={{ width: at(s.projected) }} />\n )}\n <div className={cn('absolute inset-y-0 left-0 rounded-full', s.over ? 'bg-amber-500' : 'bg-violet-600 dark:bg-violet-400')} style={{ width: at(s.used) }} />\n {scale > s.included && (\n <div className=\"absolute -inset-y-1 w-0.5 rounded bg-foreground/70\" style={{ left: at(s.included) }} title={tl('Plan allowance', 'Incluído no plano')} />\n )}\n </div>\n {s.projected > 0 && (\n <p className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\"><span className={cn('h-2.5 w-2.5 rounded-full', s.over ? 'bg-amber-500' : 'bg-violet-600 dark:bg-violet-400')} />{tl('Used', 'Usado')}</span>\n <span className=\"inline-flex items-center gap-1.5\"><span className={cn('h-2.5 w-2.5 rounded-full', s.projectedOver ? 'bg-amber-200 dark:bg-amber-900' : 'bg-violet-200 dark:bg-violet-900')} />{tl(`At this pace: ${num(s.projected)}`, `Neste ritmo: ${num(s.projected)}`)}</span>\n {scale > s.included && <span className=\"inline-flex items-center gap-1.5\"><span className=\"h-3 w-0.5 bg-foreground/70\" />{tl('Included', 'Incluído no plano')}</span>}\n </p>\n )}\n </div>\n )\n}\n\nfunction Usage({ s, upgrade, onBuy }: {\n s: AiUsageSummary\n upgrade?: { name: string; credits: number; onChoose?: () => void }\n onBuy: (p: (typeof EXTRA_AI_CREDITS)[number]) => void\n}) {\n const short = s.over || s.projectedOver\n return (\n <>\n <Meter s={s} />\n {s.over ? (\n <p role=\"status\" className=\"flex items-start gap-2 rounded-input border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-900 dark:border-amber-800 dark:bg-amber-950/50 dark:text-amber-100\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0\" aria-hidden />\n {tl(`You went ${num(s.overBy)} credits over the plan's allowance.`, `Você passou ${num(s.overBy)} créditos do que o plano inclui.`)}\n </p>\n ) : (\n s.projectedOver ? (\n <p className=\"text-sm tabular-nums text-amber-800 dark:text-amber-200\">\n {tl(`At this pace you will reach ${num(s.projected)} credits — over the allowance before the period ends.`, `Neste ritmo você chega a ${num(s.projected)} créditos — acima do que o plano inclui antes de o período fechar.`)}\n </p>\n ) : null\n )}\n\n {(s.byUser.length > 0 || s.byFeature.length > 0) && (\n <details className=\"group\">\n <summary className=\"flex min-h-11 cursor-pointer list-none items-center gap-1.5 text-sm font-medium text-muted-foreground hover:text-foreground\">\n <ChevronDown className=\"h-4 w-4 transition-transform group-open:rotate-180\" aria-hidden />\n {tl('Who uses it and where', 'Quem usa e onde')}\n </summary>\n <div className=\"grid gap-4 pt-2 sm:grid-cols-2\">\n {s.byUser.length > 0 && <Breakdown title={tl('Who uses it most', 'Quem mais usa')} rows={s.byUser.slice(0, 5).map((u) => [u.name, u.credits])} total={s.used} />}\n {s.byFeature.length > 0 && <Breakdown title={tl('Where it goes', 'Onde vai')} rows={s.byFeature.map((f) => [FEATURE_LABELS[f.feature] ? tl(...FEATURE_LABELS[f.feature]!) : f.feature, f.credits])} total={s.used} />}\n </div>\n </details>\n )}\n\n {short && (\n <div className=\"flex flex-col gap-2 border-t pt-4 sm:flex-row sm:flex-wrap sm:items-center\">\n <span className=\"text-sm font-medium\">{tl('Buy extra credits', 'Comprar créditos extras')}</span>\n {EXTRA_AI_CREDITS.map((p) => (\n <Button key={p.credits} variant=\"outline\" className=\"h-11\" onClick={() => onBuy(p)}>\n +{num(p.credits)} · {money(p.price)}\n </Button>\n ))}\n {upgrade && (\n <Button variant=\"ghost\" className=\"h-11\" onClick={upgrade.onChoose} disabled={!upgrade.onChoose}>\n <ArrowUpRight className=\"h-4 w-4\" />\n {tl(`More with ${upgrade.name} (${num(upgrade.credits)}/mo)`, `Aumentar com o plano ${upgrade.name} (${num(upgrade.credits)}/mês)`)}\n </Button>\n )}\n </div>\n )}\n </>\n )\n}\n\nfunction Breakdown({ title, rows, total }: { title: string; rows: Array<[string, number]>; total: number }) {\n return (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">{title}</p>\n <ul className=\"space-y-1.5 text-sm\">\n {rows.map(([label, credits]) => (\n <li key={label} className=\"flex items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate\" title={label}>{label}</span>\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">\n {num(credits)} <span className=\"text-xs\">({total ? Math.round((credits / total) * 100) : 0}%)</span>\n </span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n","import { tl } from '@fayz-ai/core'\n\n/**\n * Families of modules — how Módulos (and anything else that lists modules, the\n * price list included) groups them. Keyed by plugin id; a facet follows its\n * plugin. A module not listed falls in \"Base do sistema\".\n */\nexport interface ModuleFamily {\n id: string\n label: readonly [string, string]\n /** One line under the heading: what this family is for. */\n line: readonly [string, string]\n plugins: readonly string[]\n}\n\nexport const MODULE_FAMILIES: readonly ModuleFamily[] = [\n { id: 'sales', label: ['Sales & floor', 'Vendas e salão'], line: ['Selling at the counter, the table and online.', 'Vender no balcão, na mesa e online.'],\n plugins: ['orders', 'tables', 'menu', 'reservations', 'shop', 'payments', 'sites', 'marketplaces'] },\n { id: 'stock', label: ['Stock & production', 'Estoque e produção'], line: ['What comes in, what is made, what goes out.', 'O que entra, o que se produz, o que sai.'],\n plugins: ['inventory', 'production', 'kitchen'] },\n { id: 'care', label: ['Attendance & schedule', 'Atendimento e agenda'], line: ['Bookings, records and the service itself.', 'Agendamento, prontuário e o atendimento em si.'],\n plugins: ['agenda', 'clinical', 'forms', 'custom_forms', 'scribe', 'courses', 'tiss', 'pet'] },\n { id: 'finance', label: ['Finance & tax', 'Financeiro e fiscal'], line: ['Cash, bills, banks and invoices.', 'Caixa, contas, bancos e nota fiscal.'],\n plugins: ['financial', 'fiscal-br', 'banking-br', 'openbanking'] },\n { id: 'clients', label: ['Clients & marketing', 'Clientes e marketing'], line: ['Who your clients are and how you talk to them.', 'Quem são seus clientes e como você fala com eles.'],\n plugins: ['crm', 'conversations', 'marketing', 'automations', 'reputation'] },\n { id: 'team', label: ['Team', 'Equipe'], line: ['Shifts, time clock and tasks.', 'Escala, ponto e tarefas.'],\n plugins: ['workforce', 'tasks'] },\n { id: 'base', label: ['Platform', 'Base do sistema'], line: ['Registries, reports and what every account has.', 'Cadastros, relatórios e o que toda conta tem.'],\n plugins: ['registry', 'reports', 'dashboard', 'notifications', 'analytics'] },\n]\n\nconst FAMILY_OF = new Map(MODULE_FAMILIES.flatMap((f) => f.plugins.map((p) => [p, f.id] as const)))\n\n/** The family of a module or facet key (`plugin` / `plugin.facet`). */\nexport function moduleFamilyOf(key: string): string {\n return FAMILY_OF.get(key) ?? FAMILY_OF.get(key.split('.')[0]!) ?? 'base'\n}\n\nexport function familyLabel(id: string): string {\n const f = MODULE_FAMILIES.find((x) => x.id === id)\n return f ? tl(...f.label) : id\n}\n\n/**\n * What each coming-soon module (`COMING_SOON_MODULES` in the price list) is\n * for, and where it came from. Data only: none of these registers a route.\n */\nexport const UPCOMING_MODULE_INFO: Readonly<Record<string, { line: readonly [string, string]; v1?: string }>> = {\n tiss: { line: ['Bill health plans in the TISS standard, guide by guide.', 'Fature convênios no padrão TISS, guia por guia.'] },\n 'pet.grooming': { line: ['Booked by pet, priced by size and coat, from drop-off to pick-up.', 'Marcado pelo pet, preço por porte e pelagem, do recebido ao entregue.'], v1: 'ThePet · /pet/servicos' },\n 'pet.vet': { line: ['Vet records, vaccines and returns per pet.', 'Prontuário, vacinas e retornos de cada pet.'], v1: 'ThePet' },\n 'pet.lodging': { line: ['Hotel and daycare stays with check-in and daily log.', 'Hospedagem e creche com entrada, saída e diário.'], v1: 'ThePet' },\n 'pet.packages': { line: ['Weekly bath plans and pick-up & drop-off.', 'Planos de banho semanais e leva-e-traz.'], v1: 'ThePet · /pet/planos, /pet/leva-e-traz' },\n marketplaces: { line: ['Sell the same catalog on Mercado Livre, Shopee and Amazon.', 'Venda o mesmo catálogo no Mercado Livre, Shopee e Amazon.'] },\n}\n","import * as React from 'react'\nimport { AlertCircle, Check } from 'lucide-react'\nimport { tl, usePluginRuntimeOptional, type Plan, formatCurrency } from '@fayz-ai/core'\nimport {\n Button, Sheet, SheetBody, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, Switch, getLucideIcon,\n} from '@fayz-ai/ui'\nimport { cn } from '../../lib/cn'\nimport {\n PRICE_BOOK, UPSELL_KEY, billableModules, includedIn, moduleFitsTrades, packageFor, perUnitModules, planFit, quote,\n type BasePackage, type OperationSize, type PricingPlan, type Trade,\n} from '../../billing/module-pricing'\nimport { MODULE_FAMILIES, moduleFamilyOf } from '../../billing/module-families'\n\n// The platform's own prices are in BRL whatever the tenant's currency.\nconst money = (n: number) => formatCurrency(n, 'BRL')\n\n/** One switch the plan change will flip: a module or one of its paid parts. */\nexport interface ModuleChange {\n plugin: string\n facet: string\n status: 'active' | 'disabled'\n}\n\nconst split = (key: string) => {\n const dot = key.indexOf('.')\n return dot < 0 ? { plugin: key, facet: '' } : { plugin: key.slice(0, dot), facet: key.slice(dot + 1) }\n}\n\nfunction priceLabel(key: string, pkg: BasePackage): string {\n const e = PRICE_BOOK[key]!\n if (includedIn(pkg, key)) return tl(`Included in ${pkg.name}`, `Incluído no ${pkg.name}`)\n return `${money(e.price)} ${e.per === 'unit' ? tl('per unit', 'por unidade') : tl('/mo', '/mês')}`\n}\n\n/**\n * Switching plan is composing the subscription: the plan, plus the modules and\n * paid parts this account will run on it. Starts from what is on today, prices\n * every change live, and confirms all of it at once.\n */\nexport function PlanCheckoutSheet({ plan, pricing, size, trades, currentTotal, onCancel, onConfirm }: {\n plan: Plan | null\n pricing: PricingPlan | null\n size: OperationSize\n trades: readonly Trade[]\n currentTotal?: number\n onCancel: () => void\n onConfirm: (plan: Plan, changes: ModuleChange[]) => Promise<void>\n}) {\n const runtime = usePluginRuntimeOptional()\n const initial = React.useMemo(\n () => new Set(billableModules([...size.modules, ...(size.unitModules ?? []).flatMap((u) => u.modules)])\n .concat([...size.modules, ...(size.unitModules ?? []).flatMap((u) => u.modules)].filter((k) => PRICE_BOOK[k]))),\n [size],\n )\n const [selected, setSelected] = React.useState<Set<string>>(initial)\n const [busy, setBusy] = React.useState(false)\n React.useEffect(() => { if (plan) setSelected(new Set(initial)) }, [plan, initial])\n\n // What can be switched here: priced, sold to this trade, and shipped in this\n // app (a module the bundle doesn't carry cannot be turned on from a screen).\n const offer = React.useMemo(() => {\n const plugins = runtime?.plugins ?? []\n return Object.keys(PRICE_BOOK).filter((key) => {\n if (PRICE_BOOK[key]!.comingSoon) return false\n // Off-trade modules stay offered only if the account already runs them.\n if (trades.length && !moduleFitsTrades(key, trades) && !initial.has(key)) return false\n const { plugin, facet } = split(key)\n const manifest = plugins.find((p) => p.id === plugin)\n if (!manifest) return false\n return !facet || !!manifest.facets?.some((f) => f.id === facet && !f.includedWithPlugin)\n })\n }, [runtime?.plugins, trades, initial])\n\n const toggle = (key: string) => setSelected((cur) => {\n const next = new Set(cur)\n const { plugin, facet } = split(key)\n if (next.has(key)) {\n next.delete(key)\n // A module out takes its paid parts with it.\n if (!facet) for (const k of [...next]) if (k.startsWith(`${plugin}.`)) next.delete(k)\n } else {\n next.add(key)\n if (facet) next.add(plugin)\n }\n return next\n })\n\n const pkg = React.useMemo(() => packageFor({ package: size.package, trades, modules: [...selected] }), [size.package, trades, selected])\n const nextSize: OperationSize = React.useMemo(() => {\n const keys = [...selected]\n const perUnit = perUnitModules(keys, pkg)\n return {\n ...size,\n trades,\n modules: keys,\n unitModules: (size.unitModules ?? []).map((u) => ({ ...u, modules: perUnit })),\n }\n }, [selected, size, pkg, trades])\n const q = pricing ? quote(nextSize, pricing) : null\n const total = q?.total ?? plan?.price ?? 0\n const fit = plan ? planFit(plan, nextSize) : { fits: true as const }\n const units = nextSize.unitModules?.length || nextSize.units\n const delta = currentTotal !== undefined ? total - currentTotal : undefined\n\n const changes: ModuleChange[] = [\n ...[...selected].filter((k) => !initial.has(k)).map((k) => ({ ...split(k), status: 'active' as const })),\n ...[...initial].filter((k) => !selected.has(k) && offer.includes(k)).map((k) => ({ ...split(k), status: 'disabled' as const })),\n ]\n\n const families = MODULE_FAMILIES\n .map((f) => ({ family: f, keys: offer.filter((k) => !k.includes('.') && moduleFamilyOf(k) === f.id) }))\n .filter((g) => g.keys.length > 0)\n\n const confirm = async () => {\n if (!plan) return\n setBusy(true)\n try { await onConfirm(plan, changes) } finally { setBusy(false) }\n }\n\n return (\n <Sheet open={!!plan} onOpenChange={(open) => { if (!open && !busy) onCancel() }}>\n <SheetContent width=\"max-w-2xl\">\n <SheetHeader>\n <SheetTitle>{plan ? tl(`Switch to ${plan.name}`, `Mudar para ${plan.name}`) : ''}</SheetTitle>\n <SheetDescription>\n {tl('Choose the modules this account will run on the plan. What is on today comes checked; the price follows each switch.',\n 'Escolha os módulos que a conta vai usar no plano. O que já está ligado vem marcado; o preço acompanha cada escolha.')}\n </SheetDescription>\n </SheetHeader>\n <SheetBody className=\"space-y-6\">\n {families.map(({ family, keys }) => (\n <section key={family.id} className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{tl(...family.label)}</h3>\n <ul className=\"divide-y rounded-card border\">\n {keys.map((key) => {\n const manifest = runtime?.plugins.find((p) => p.id === key)\n const Icon = manifest?.icon ? getLucideIcon(manifest.icon) : undefined\n const on = selected.has(key)\n const parts = offer.filter((k) => k.startsWith(`${key}.`))\n return (\n <li key={key} className=\"space-y-2 px-4 py-3\">\n <label className=\"flex cursor-pointer items-center gap-3\">\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden /> : <span className=\"w-4\" />}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">{manifest?.name ?? tl(...PRICE_BOOK[key]!.label)}</span>\n <span className=\"block text-xs text-muted-foreground tabular-nums\">{priceLabel(key, pkg)}</span>\n </span>\n <Switch checked={on} onCheckedChange={() => toggle(key)} aria-label={tl(...PRICE_BOOK[key]!.label)} />\n </label>\n {parts.length > 0 && (\n <ul className=\"space-y-2 border-l pl-4 ml-2\">\n {parts.map((part) => {\n const ai = part === UPSELL_KEY\n return (\n <li key={part}>\n <label className=\"flex cursor-pointer items-center gap-3\">\n <span className=\"min-w-0 flex-1\">\n <span className={cn('block text-sm', ai && 'font-medium text-violet-700 dark:text-violet-300')}>{tl(...PRICE_BOOK[part]!.label)}</span>\n <span className=\"block text-xs text-muted-foreground tabular-nums\">+ {priceLabel(part, pkg)}</span>\n </span>\n <Switch checked={selected.has(part)} onCheckedChange={() => toggle(part)} aria-label={tl(...PRICE_BOOK[part]!.label)} />\n </label>\n </li>\n )\n })}\n </ul>\n )}\n </li>\n )\n })}\n </ul>\n </section>\n ))}\n </SheetBody>\n <SheetFooter className=\"flex-col items-stretch gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n {fit.fits ? (\n <>\n <p className=\"text-xl font-bold tabular-nums\">\n {total > 0 ? money(total) : tl('Free', 'Grátis')}\n {total > 0 && <span className=\"text-sm font-normal text-muted-foreground\">{tl('/mo', '/mês')}</span>}\n </p>\n <p className=\"text-xs text-muted-foreground tabular-nums\">\n {units > 1 && total > 0 ? `≈ ${money(total / units)} ${tl('per unit', 'por unidade')} · ` : ''}\n {delta !== undefined && Math.abs(delta) >= 0.01\n ? (delta > 0 ? tl(`+${money(delta)} vs today`, `+${money(delta)} em relação a hoje`) : tl(`${money(-delta)} less than today`, `${money(-delta)} a menos que hoje`))\n : tl('Same as today', 'Igual a hoje')}\n </p>\n </>\n ) : (\n <p className=\"flex items-start gap-2 text-sm text-muted-foreground\">\n <AlertCircle className=\"mt-0.5 h-4 w-4 shrink-0\" aria-hidden />\n {fit.limit === 'locations'\n ? tl(`This plan takes up to ${fit.max} units; you have ${fit.have}.`, `Este plano vai até ${fit.max} unidades; você tem ${fit.have}.`)\n : tl(`This plan takes up to ${fit.max} users; you have ${fit.have}.`, `Este plano vai até ${fit.max} usuários; você tem ${fit.have}.`)}\n </p>\n )}\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" className=\"h-11\" onClick={onCancel} disabled={busy}>{tl('Cancel', 'Cancelar')}</Button>\n <Button className=\"h-11\" onClick={() => void confirm()} disabled={busy || !fit.fits}>\n <Check className=\"h-4 w-4\" aria-hidden />\n {busy ? tl('Saving…', 'Salvando…') : tl('Confirm', 'Confirmar')}\n {changes.length > 0 && !busy ? ` · ${changes.length} ${tl(changes.length === 1 ? 'change' : 'changes', changes.length === 1 ? 'mudança' : 'mudanças')}` : ''}\n </Button>\n </div>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import * as React from 'react'\nimport { AlertCircle, Blocks, Building2, Calculator, ChevronDown, RotateCcw, TrendingDown, Users } from 'lucide-react'\nimport { tl, usePluginRuntimeOptional, type Plan, formatCurrency } from '@fayz-ai/core'\nimport {\n Badge, Button, Card, CardContent, ChoiceSelect,\n Sheet, SheetBody, SheetContent, SheetDescription, SheetHeader, SheetTitle, Input\n} from '@fayz-ai/ui'\nimport { cn } from '../../lib/cn'\nimport { useUnitStore } from '../../units/store'\nimport { useOrganizationStore } from '../../org/store'\nimport { useOrgAdapterOptional } from '../../org/context'\nimport { useAppConfigStore } from '../../stores/app-config.store'\nimport { useOfferedPlugins } from '../../app/useAppPreset'\nimport { AiUsageSection } from './AiUsageSection'\nimport { PlanCheckoutSheet, type ModuleChange } from './PlanCheckoutSheet'\nimport { PlanFeatureItem, parsePlanFeature } from './plan-feature'\nimport {\n PRICE_BOOK, PRICING_PLANS, PRICING_SCENARIOS, SCENARIO_VERTICAL_LABELS, EXTRA_SEAT_PRICE, activeModuleKeys, billableModules, perUnitModules,\n TRADE_BY_APP, aiCreditsFor, moduleFitsTrades, packageFor, planFit, pricingForPlans, quote,\n type Trade,\n type OperationSize, type PlanFit, type PricingPlan, type Quote, type UnitFootprint,\n} from '../../billing/module-pricing'\n\n// The platform's own prices are in BRL whatever the tenant's currency.\nconst money = (n: number) => formatCurrency(n, 'BRL')\nconst MINE = 'mine'\nconst FEATURES_SHOWN = 5\n\n// ── The operation being priced ─────────────────────────────────────────────\n\n/** This account's real size, read from the stores the shell already fills. */\nfunction useRealOperation() {\n const units = useUnitStore((s) => s.units)\n const members = useOrganizationStore((s) => s.members)\n const orgId = useOrganizationStore((s) => s.currentOrg?.id)\n const adapter = useOrgAdapterOptional()\n const runtime = usePluginRuntimeOptional()\n const [fetchedMembers, setFetchedMembers] = React.useState<number | null>(null)\n\n // The members list is filled by the Team tab; opened straight here it may\n // still be empty, so ask once.\n React.useEffect(() => {\n if (members.length > 0 || !adapter || !orgId) return\n let alive = true\n adapter.listMembers(orgId).then((list) => { if (alive) setFetchedMembers(list.length) }).catch(() => {})\n return () => { alive = false }\n }, [members.length, adapter, orgId])\n\n const apps = useAppConfigStore((s) => s.config.apps)\n const offered = useOfferedPlugins()\n // The trades this account runs; a house app (the central one) adds none.\n const trades = React.useMemo<Trade[]>(\n () => [...new Set((apps ?? []).filter((a) => !(a as { house?: boolean }).house).map((a) => TRADE_BY_APP[a.id]).filter(Boolean) as Trade[])],\n [apps],\n )\n const modules = React.useMemo(\n () => activeModuleKeys((runtime?.plugins ?? []) as Parameters<typeof activeModuleKeys>[0], { trades, offered }),\n [runtime?.plugins, trades, offered],\n )\n const active = units.filter((u) => u.isActive !== false && u.kind !== 'region')\n const list = active.length ? active.map((u) => ({ id: u.id, name: u.name })) : [{ id: 'main', name: tl('Main unit', 'Unidade principal') }]\n const perUnit = perUnitModules(modules, packageFor({ trades, modules }))\n return {\n units: list.length,\n users: Math.max(1, members.length || fetchedMembers || 1),\n modules,\n unitModules: list.map((u) => ({ ...u, modules: perUnit })),\n trades,\n }\n}\n\n/** The operation on screen: the account's own, or a ready-made example, with\n * whatever the owner changed in the simulator on top. */\nfunction useOperation() {\n const real = useRealOperation()\n const [scenario, setScenarioState] = React.useState(MINE)\n const [users, setUsers] = React.useState<number | null>(null)\n const [footprints, setFootprints] = React.useState<UnitFootprint[] | null>(null)\n\n const example = PRICING_SCENARIOS.find((x) => x.id === scenario)\n const base: OperationSize = example ? example.size : real\n const trades: Trade[] = example ? [example.vertical] : real.trades\n // Only what this trade sells (a salon is never offered Pedidos e PDV), and\n // only extras: what the package covers is not a chip to switch.\n const allBase = [...base.modules, ...(base.unitModules ?? []).flatMap((u) => u.modules)]\n const pkg = packageFor({ trades, modules: allBase })\n const available = perUnitModules(allBase, pkg)\n .filter((k, i, all) => all.indexOf(k) === i && (!trades.length || moduleFitsTrades(k, trades)))\n const baseUnits: UnitFootprint[] = base.unitModules?.length\n ? [...base.unitModules]\n : Array.from({ length: base.units }, (_, i) => ({ id: `u${i + 1}`, name: `${tl('Unit', 'Unidade')} ${i + 1}`, modules: available }))\n const units = footprints ?? baseUnits\n const size: OperationSize = { units: units.length, users: users ?? base.users, modules: base.modules, unitModules: units, trades, package: pkg.id }\n\n const reset = () => { setUsers(null); setFootprints(null) }\n return {\n size,\n units,\n available,\n trades,\n scenario,\n simulated: scenario !== MINE || users !== null || footprints !== null,\n pkg,\n paidModules: billableModules([...size.modules, ...units.flatMap((u) => u.modules)], pkg).filter((k, i, all) => all.indexOf(k) === i).length,\n setScenario: (id: string) => { setScenarioState(id); reset() },\n setUsers,\n reset: () => { setScenarioState(MINE); reset() },\n setUnitCount: (n: number) => {\n const next = units.slice(0, n)\n while (next.length < n) next.push({ id: `extra-${next.length + 1}`, name: `${tl('Unit', 'Unidade')} ${next.length + 1}`, modules: units[0]?.modules ?? available })\n setFootprints(next)\n },\n toggle: (unitId: string, key: string) => setFootprints(units.map((u) => u.id !== unitId ? u : {\n ...u,\n modules: u.modules.includes(key)\n // Taking a module out takes its paid parts with it.\n ? u.modules.filter((m) => m !== key && !m.startsWith(`${key}.`))\n : [...u.modules, key, ...(key.includes('.') ? [key.slice(0, key.indexOf('.'))] : [])].filter((m, i, all) => all.indexOf(m) === i),\n })),\n }\n}\ntype Operation = ReturnType<typeof useOperation>\n\ninterface PricedPlan {\n plan: Plan\n pricing: PricingPlan | null\n quote: Quote | null\n total: number\n fit: PlanFit\n aiCredits: number\n}\n\n// The plan's own \"AI assistant\" bullet is replaced by the model's line, so a\n// card never shows the allowance twice or two different numbers.\nconst AI_FEATURE = /assistente de ia|ai assistant/i\n\n// Without app plans the model's own tiers are the offer.\nconst MODEL_PLANS: Plan[] = PRICING_PLANS.filter((p) => p.id !== 'a-la-carte').map((p) => ({\n id: p.id, name: tl(...p.name), price: p.platformFee, currency: 'BRL', interval: 'month', features: [],\n pricing: { platformFee: p.platformFee, seatsPerUnit: p.seatsPerUnit, discount: p.discount },\n}))\n\n// ── Pieces ─────────────────────────────────────────────────────────────────\n\nfunction Stat({ icon, children }: { icon: React.ReactNode; children: React.ReactNode }) {\n return (\n <span className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground\">\n <span aria-hidden>{icon}</span>\n <span className=\"tabular-nums text-foreground\">{children}</span>\n </span>\n )\n}\n\nfunction fitReason(fit: PlanFit): string | null {\n if (fit.fits) return null\n const one = fit.max === 1\n return fit.limit === 'locations'\n ? tl(`Up to ${fit.max} ${one ? 'unit' : 'units'} — you have ${fit.have}`, `Até ${fit.max} ${one ? 'unidade' : 'unidades'} — você tem ${fit.have}`)\n : tl(`Up to ${fit.max} ${one ? 'user' : 'users'} — you have ${fit.have}`, `Até ${fit.max} ${one ? 'usuário' : 'usuários'} — você tem ${fit.have}`)\n}\n\nfunction PlanCard({ p, units, recommended, current, onChoose, onDetails }: {\n p: PricedPlan\n units: number\n recommended: boolean\n current: boolean\n onChoose?: () => void\n onDetails: () => void\n}) {\n const [allFeatures, setAllFeatures] = React.useState(false)\n const reason = fitReason(p.fit)\n // Every plan leads with its AI allowance, highlighted like the app's own `*` features.\n const all = [\n `*${tl(`AI assistant — ${p.aiCredits.toLocaleString('pt-BR')} credits/mo`, `Assistente de IA — ${p.aiCredits.toLocaleString('pt-BR')} créditos/mês`)}`,\n ...p.plan.features.filter((f) => !AI_FEATURE.test(parsePlanFeature(f).label)),\n ]\n const features = allFeatures ? all : all.slice(0, FEATURES_SHOWN)\n const hidden = all.length - features.length\n\n return (\n // On a phone the recommended plan comes first; wide screens keep the price ladder.\n <Card className={cn('relative flex flex-col', recommended && 'order-first border-primary shadow-md md:order-none', !p.fit.fits && 'bg-muted/30')}>\n {(recommended || (p.plan.highlighted && p.fit.fits)) && (\n <div className=\"absolute -top-3 left-5\">\n <Badge className={cn(recommended ? 'border-transparent bg-primary text-primary-foreground' : 'bg-secondary text-secondary-foreground')}>\n {recommended ? tl('Recommended for you', 'Recomendado para você') : tl('Most popular', 'Mais popular')}\n </Badge>\n </div>\n )}\n <CardContent className=\"flex flex-1 flex-col gap-4 p-5 pt-6\">\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"text-lg font-semibold\">{p.plan.name}</h3>\n {current && <Badge variant=\"outline\">{tl('Your plan', 'Seu plano')}</Badge>}\n </div>\n {p.plan.description && <p className=\"text-sm text-muted-foreground\">{p.plan.description}</p>}\n </div>\n\n {reason ? (\n <div className=\"flex items-start gap-2 rounded-input border border-dashed px-3 py-2.5 text-sm text-muted-foreground\">\n <AlertCircle className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <span><span className=\"font-medium text-foreground\">{tl('Too small for you', 'Não comporta a sua operação')}</span><br />{reason}</span>\n </div>\n ) : (\n <div>\n {/* Wraps instead of overflowing: three cards side by side leave a\n narrow column, and a five-digit price does not fit it at 3xl. */}\n <p className=\"flex min-w-0 flex-wrap items-baseline gap-x-1\">\n <span className=\"text-2xl font-bold tabular-nums 2xl:text-3xl\">{p.total > 0 ? money(p.total) : tl('Free', 'Grátis')}</span>\n {p.total > 0 && <span className=\"text-sm text-muted-foreground\">{tl('/mo', '/mês')}</span>}\n </p>\n {p.total > 0 && units > 1 && (\n <p className=\"text-sm text-muted-foreground tabular-nums\">\n ≈ {money(p.total / units)} {tl('per unit', 'por unidade')}\n </p>\n )}\n </div>\n )}\n\n {features.length > 0 && (\n <ul className=\"flex-1 space-y-2 text-sm\">\n {features.map((f) => <PlanFeatureItem key={f} feature={f} iconClassName=\"h-4 w-4\" />)}\n {hidden > 0 && (\n <li>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" className=\"font-normal whitespace-normal text-sm font-medium text-primary underline-offset-2 hover:underline\" onClick={() => setAllFeatures(true)}>\n + {hidden} {tl('more', hidden === 1 ? 'recurso' : 'recursos')}\n </Button>\n </li>\n )}\n </ul>\n )}\n\n <div className=\"mt-auto space-y-2\">\n {p.quote && p.fit.fits && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onDetails}\n className=\"font-normal whitespace-normal flex w-full items-center justify-center gap-1.5 py-1 text-sm text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\">\n <Calculator className=\"h-3.5 w-3.5\" />\n {tl('How we got here', 'Como chegamos neste valor')}\n </Button>\n )}\n {current ? (\n <Button variant=\"outline\" className=\"w-full\" disabled>{tl('Current plan', 'Plano atual')}</Button>\n ) : onChoose ? (\n <Button className=\"w-full\" variant={recommended ? 'default' : 'outline'} disabled={!p.fit.fits} onClick={onChoose}>\n {tl(`Switch to ${p.plan.name}`, `Mudar para ${p.plan.name}`)}\n </Button>\n ) : null}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nfunction NumberField({ icon, label, value, onChange }: {\n icon: React.ReactNode; label: string; value: number; onChange: (n: number) => void\n}) {\n return (\n <label className=\"flex h-11 items-center gap-2 rounded-input border bg-background px-3 text-sm\">\n <span className=\"text-muted-foreground\" aria-hidden>{icon}</span>\n <span className=\"text-muted-foreground\">{label}</span>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n wrapperClassName=\"w-14\"\n className=\"h-auto border-0 bg-transparent p-0 text-right font-medium tabular-nums shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n value={value}\n onChange={(e) => onChange(Math.max(1, Number(e.target.value) || 1))}\n />\n </label>\n )\n}\n\n/** One card per unit, like the proposal: what it runs (tap to take a module\n * out or put it back) and what it adds a month. */\nfunction UnitCards({ op, quoteFor }: { op: Operation; quoteFor: Quote | null }) {\n if (op.available.length === 0) return null\n return (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {op.units.map((u) => <UnitCard key={u.id} op={op} unit={u} amount={quoteFor?.lines.find((l) => l.key === `unit:${u.id}`)?.amount ?? 0} />)}\n </div>\n )\n}\n\nfunction UnitCard({ op, unit, amount }: { op: Operation; unit: UnitFootprint; amount: number }) {\n const [adding, setAdding] = React.useState(false)\n const on = op.available.filter((k) => unit.modules.includes(k))\n const off = op.available.filter((k) => !unit.modules.includes(k))\n const chip = (key: string, active: boolean) => (\n <Button variant=\"bare\" size=\"bare\" key={key} type=\"button\" aria-pressed={active} onClick={() => op.toggle(unit.id, key)}\n title={active ? tl('Take out of this unit', 'Tirar desta unidade') : tl('Add to this unit', 'Pôr nesta unidade')}\n className={cn('min-h-8 rounded-full border px-2.5 py-1 text-xs transition-colors',\n active ? 'border-primary/40 bg-primary/10 text-foreground hover:bg-primary/20' : 'border-dashed text-muted-foreground hover:text-foreground')}>\n {active ? '' : '+ '}{tl(...PRICE_BOOK[key]!.label)}\n </Button>\n )\n return (\n <div className=\"space-y-2 rounded-card border border-t-4 border-t-primary bg-card p-4\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <p className=\"min-w-0 font-semibold\">{unit.name}</p>\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{money(amount)}</span>\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {on.map((k) => chip(k, true))}\n {off.length > 0 && !adding && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setAdding(true)}\n className=\"font-normal whitespace-normal min-h-8 rounded-full px-2.5 py-1 text-xs font-medium text-primary underline-offset-2 hover:underline\">\n + {off.length} {tl(off.length === 1 ? 'module' : 'modules', off.length === 1 ? 'módulo' : 'módulos')}\n </Button>\n )}\n {adding && off.map((k) => chip(k, false))}\n </div>\n </div>\n )\n}\n\nfunction Breakdown({ q }: { q: Quote }) {\n return (\n <ul className=\"divide-y rounded-card border text-sm\">\n {q.lines.map((line) => (\n <li key={line.key} className=\"flex items-start justify-between gap-4 px-4 py-2.5\">\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{line.label}</p>\n <p className=\"text-xs text-muted-foreground\">{line.detail}</p>\n </div>\n {line.kind === 'credits' ? (\n <span className=\"shrink-0 font-medium text-violet-700 dark:text-violet-200\">{tl('Included', 'Incluído')}</span>\n ) : (\n <span className={cn('shrink-0 tabular-nums', line.amount < 0 && 'text-emerald-700 dark:text-emerald-400')}>{money(line.amount)}</span>\n )}\n </li>\n ))}\n <li className=\"flex justify-between gap-4 bg-muted/40 px-4 py-3 font-semibold\">\n <span>{tl('Total per month', 'Total por mês')}</span>\n <span className=\"tabular-nums\">{money(q.total)}</span>\n </li>\n </ul>\n )\n}\n\nfunction DetailsSheet({ open, onOpenChange, op, priced, planId, setPlanId }: {\n open: boolean\n onOpenChange: (open: boolean) => void\n op: Operation\n priced: PricedPlan[]\n planId: string | undefined\n setPlanId: (id: string) => void\n}) {\n const withMath = priced.filter((p) => p.quote)\n const scenarioInfo = PRICING_SCENARIOS.find((x) => x.id === op.scenario)\n const shown = withMath.find((p) => p.plan.id === planId) ?? withMath[0]\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent width=\"max-w-2xl\">\n <SheetHeader>\n <SheetTitle>{tl('How we price', 'Como calculamos')}</SheetTitle>\n <SheetDescription>\n {tl('Each unit pays for what it runs; the one that runs most pays in full, the others 85% (65% from the 6th). Group-wide modules are paid once.',\n 'Cada unidade paga o que usa; a que mais usa paga cheio, as outras 85% (65% a partir da 6ª). O que serve o grupo todo é pago uma vez.')}\n </SheetDescription>\n </SheetHeader>\n <SheetBody className=\"space-y-6\">\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">{tl('1. Your operation', '1. Sua operação')}</h3>\n <div className=\"flex flex-wrap items-center gap-2\">\n <ChoiceSelect\n aria-label={tl('Operation', 'Operação')}\n className=\"h-11 w-full sm:w-72\"\n value={op.scenario}\n onChange={(v) => op.setScenario(v ?? MINE)}\n options={[\n { value: MINE, label: tl('My operation', 'Minha operação') },\n // Grouped by trade, so a salon compares itself with salons.\n ...(Object.keys(SCENARIO_VERTICAL_LABELS) as Array<keyof typeof SCENARIO_VERTICAL_LABELS>).flatMap((v) =>\n PRICING_SCENARIOS.filter((x) => x.vertical === v).map((x) => ({\n value: x.id,\n label: `${tl(...SCENARIO_VERTICAL_LABELS[v])} · ${tl(...x.name)}`,\n }))),\n ]}\n />\n <NumberField icon={<Building2 className=\"h-4 w-4\" />} label={tl('Units', 'Unidades')} value={op.units.length} onChange={op.setUnitCount} />\n <NumberField icon={<Users className=\"h-4 w-4\" />} label={tl('Users', 'Usuários')} value={op.size.users} onChange={op.setUsers} />\n </div>\n {scenarioInfo?.assumptions?.length ? (\n <div className=\"rounded-input border border-dashed bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n <p className=\"font-medium text-foreground\">\n {tl('Assumptions', 'Premissas')}\n </p>\n <ul className=\"mt-1 list-disc space-y-0.5 pl-4\">\n {scenarioInfo.assumptions.map((a) => <li key={a}>{a}</li>)}\n </ul>\n </div>\n ) : null}\n <p className=\"text-xs text-muted-foreground\">\n {tl('Tap a module to take it out of a unit or put it back. The plan cards follow.', 'Toque num módulo para tirar ou pôr em uma unidade. Os cartões dos planos acompanham.')}\n </p>\n <UnitCards op={op} quoteFor={shown?.quote ?? null} />\n </section>\n\n {shown?.quote && (\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">{tl('2. The math, per plan', '2. A conta, por plano')}</h3>\n {withMath.length > 1 && (\n // Plan · value, one line each: a tab strip of names alone made the\n // reader open each plan to learn what it costs.\n <div role=\"radiogroup\" aria-label={tl('Plan', 'Plano')} className={cn('grid gap-2', withMath.length >= 3 ? 'sm:grid-cols-3' : 'sm:grid-cols-2')}>\n {withMath.map((p) => {\n const on = p.plan.id === shown.plan.id\n const seats = p.pricing?.seatsPerUnit\n const units = op.units.length\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={p.plan.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={on}\n onClick={() => setPlanId(p.plan.id)}\n className={cn(\n 'min-h-11 rounded-card border px-3 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n on ? 'border-primary bg-primary/5' : 'hover:bg-muted/40',\n )}\n >\n <span className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-sm font-semibold\">{p.plan.name}</span>\n <span className=\"text-sm font-semibold tabular-nums\">{money(p.total)}</span>\n </span>\n <span className=\"mt-0.5 block text-[11px] leading-snug text-muted-foreground\">\n {units > 1 ? `≈ ${money(p.total / units)} ${tl('per unit', 'por unidade')} · ` : ''}\n {seats === null || seats === undefined\n ? tl('Unlimited users', 'Usuários ilimitados')\n : tl(`${seats} users per unit`, `${seats} usuários por unidade`)}\n {` · ${p.aiCredits.toLocaleString('pt-BR')} ${tl('AI credits', 'créditos de IA')}`}\n </span>\n </Button>\n )\n })}\n </div>\n )}\n <Breakdown q={shown.quote} />\n </section>\n )}\n </SheetBody>\n </SheetContent>\n </Sheet>\n )\n}\n\n// ── The page block ─────────────────────────────────────────────────────────\n\n/**\n * One answer to \"what do I pay\": the account's plan and its price for THIS\n * operation on top, the plans priced the same way below, and the math behind a\n * button. The price of a plan is never a fixed number on this screen — it is\n * what this operation would pay on it.\n */\nexport function PricingOverview({ plans, currentPlanId, onChoose, onConfirm, compare }: {\n plans?: Plan[]\n currentPlanId?: string\n onChoose?: (plan: Plan) => void\n /** Switching plan composes it: the plan plus the modules it will run,\n * confirmed at once. Given, choosing a plan opens that composer. */\n onConfirm?: (plan: Plan, changes: ModuleChange[]) => Promise<void>\n /** The feature comparison, revealed on demand under the cards. */\n compare?: React.ReactNode\n}) {\n const op = useOperation()\n const sources = plans?.length ? plans : MODEL_PLANS\n const [detailsOpen, setDetailsOpen] = React.useState(false)\n const [detailsPlan, setDetailsPlan] = React.useState<string | undefined>()\n const [compareOpen, setCompareOpen] = React.useState(false)\n const [checkout, setCheckout] = React.useState<Plan | null>(null)\n const choose = onConfirm ? (plan: Plan) => setCheckout(plan) : onChoose\n\n const priced = React.useMemo<PricedPlan[]>(() => {\n const pricings = pricingForPlans(sources)\n return sources.map((plan, i) => {\n const pricing = pricings[i] ?? null\n const q = pricing ? quote(op.size, pricing) : null\n return { plan, pricing, quote: q, total: q?.total ?? plan.price, fit: planFit(plan, op.size), aiCredits: aiCreditsFor(plan, pricing) }\n })\n }, [sources, JSON.stringify(op.size)])\n\n const fitting = priced.filter((p) => p.fit.fits)\n const recommended = fitting.reduce<PricedPlan | undefined>((best, p) => (!best || p.total < best.total ? p : best), undefined)\n const current = priced.find((p) => p.plan.id === currentPlanId)\n // Savings speak to the account's own plan, never to an example's.\n const saving = op.scenario === MINE && current && recommended && current.fit.fits && recommended.plan.id !== current.plan.id\n ? current.total - recommended.total : 0\n const openDetails = (planId?: string) => { setDetailsPlan(planId ?? current?.plan.id ?? recommended?.plan.id); setDetailsOpen(true) }\n const cols = priced.length >= 4 ? 'lg:grid-cols-4' : priced.length === 3 ? 'lg:grid-cols-3' : 'lg:grid-cols-2'\n\n return (\n <div className=\"space-y-8\">\n {/* The answer first: your plan, what you pay, and the one thing worth knowing. */}\n <Card>\n <CardContent className=\"flex flex-col gap-5 p-5 md:flex-row md:items-center md:justify-between\">\n <div className=\"min-w-0 space-y-1\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {op.simulated ? tl('Simulation', 'Simulação') : current ? tl('Your plan', 'Seu plano') : tl('Your operation', 'Sua operação')}\n </p>\n {current && !op.simulated ? (\n <p className=\"flex flex-wrap items-baseline gap-x-2\">\n <span className=\"text-lg font-semibold\">{current.plan.name}</span>\n <span className=\"text-3xl font-bold tabular-nums\">{current.total > 0 ? money(current.total) : tl('Free', 'Grátis')}</span>\n {current.total > 0 && <span className=\"text-sm text-muted-foreground\">{tl('/mo for your operation', '/mês para a sua operação')}</span>}\n </p>\n ) : recommended ? (\n <p className=\"flex flex-wrap items-baseline gap-x-2\">\n <span className=\"text-sm text-muted-foreground\">{tl('From', 'A partir de')}</span>\n <span className=\"text-3xl font-bold tabular-nums\">{money(recommended.total)}</span>\n <span className=\"text-sm text-muted-foreground\">{tl('/mo on', '/mês no')} {recommended.plan.name}</span>\n </p>\n ) : null}\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pt-1\">\n <Stat icon={<Building2 className=\"h-4 w-4\" />}>{op.units.length} {tl(op.units.length === 1 ? 'unit' : 'units', op.units.length === 1 ? 'unidade' : 'unidades')}</Stat>\n <Stat icon={<Users className=\"h-4 w-4\" />}>{op.size.users} {tl(op.size.users === 1 ? 'user' : 'users', op.size.users === 1 ? 'usuário' : 'usuários')}</Stat>\n <Stat icon={<Blocks className=\"h-4 w-4\" />}>{op.pkg.name} + {op.paidModules} {tl(op.paidModules === 1 ? 'extra' : 'extras', op.paidModules === 1 ? 'extra' : 'extras')}</Stat>\n </div>\n <p className=\"pt-1 text-xs text-muted-foreground\">\n {tl(`What sets your price: the modules each unit runs (the next units pay less), what serves the whole group, and the plan fee. Logins beyond the plan: R$ ${EXTRA_SEAT_PRICE} each.`,\n `O que define o seu preço: os módulos de cada unidade (as seguintes pagam menos), o que serve o grupo todo e a plataforma do plano. Login além do incluído: R$ ${EXTRA_SEAT_PRICE} cada.`)}\n </p>\n {saving > 0.5 && (\n <p className=\"flex items-center gap-1.5 pt-1 text-sm font-medium text-emerald-700 dark:text-emerald-400\">\n <TrendingDown className=\"h-4 w-4\" aria-hidden />\n {tl(`On ${recommended!.plan.name} you would pay ${money(saving)} less a month.`,\n `No ${recommended!.plan.name} você pagaria ${money(saving)} a menos por mês.`)}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col gap-2 sm:flex-row md:flex-col\">\n <Button variant=\"outline\" className=\"h-11\" onClick={() => openDetails()}>\n <Calculator className=\"h-4 w-4\" />\n {tl('See the details', 'Ver detalhes do cálculo')}\n </Button>\n {op.simulated && (\n <Button variant=\"ghost\" className=\"h-11\" onClick={op.reset}>\n <RotateCcw className=\"h-4 w-4\" />\n {tl('Back to my numbers', 'Voltar aos meus números')}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n\n {/* The account's own meter: hidden while simulating someone else's numbers. */}\n {current && op.scenario === MINE && (() => {\n const next = priced.find((p) => p.aiCredits > current.aiCredits && p.plan.id !== current.plan.id && p.fit.fits)\n return (\n <AiUsageSection\n included={current.aiCredits}\n planName={current.plan.name}\n upgrade={next ? { name: next.plan.name, credits: next.aiCredits, onChoose: choose && plans?.length ? () => choose(next.plan) : undefined } : undefined}\n />\n )\n })()}\n\n <div className={cn('grid items-stretch gap-5 md:grid-cols-2', cols)}>\n {priced.map((p) => (\n <PlanCard\n key={p.plan.id}\n p={p}\n units={op.units.length}\n recommended={p.plan.id === recommended?.plan.id}\n current={op.scenario === MINE && p.plan.id === currentPlanId}\n // An example is someone else's operation: nothing to switch to from it.\n onChoose={choose && plans?.length && op.scenario === MINE ? () => choose(p.plan) : undefined}\n onDetails={() => openDetails(p.plan.id)}\n />\n ))}\n </div>\n\n {compare && (\n <div className=\"space-y-3\">\n <Button variant=\"ghost\" className=\"h-11 px-2\" aria-expanded={compareOpen} onClick={() => setCompareOpen((o) => !o)}>\n <ChevronDown className={cn('h-4 w-4 transition-transform', compareOpen && 'rotate-180')} />\n {compareOpen ? tl('Hide the comparison', 'Ocultar comparação') : tl('Compare what each plan includes', 'Comparar o que cada plano inclui')}\n </Button>\n {compareOpen && compare}\n </div>\n )}\n\n <p className=\"text-xs text-muted-foreground\">\n {tl('Not included: equipment, digital certificates, internet and the providers\\' own fees (invoicing, iFood, acquirers). Setup and migration are free.',\n 'Não incluído: equipamentos, certificado digital, internet e as taxas dos próprios provedores (emissão fiscal, iFood, adquirentes). Implantação e migração sem custo.')}\n </p>\n\n <PlanCheckoutSheet\n plan={checkout}\n pricing={checkout ? priced.find((p) => p.plan.id === checkout.id)?.pricing ?? null : null}\n size={op.size}\n trades={op.trades}\n currentTotal={op.scenario === MINE ? current?.total : undefined}\n onCancel={() => setCheckout(null)}\n onConfirm={async (plan, changes) => { await onConfirm!(plan, changes); setCheckout(null) }}\n />\n <DetailsSheet open={detailsOpen} onOpenChange={setDetailsOpen} op={op} priced={priced} planId={detailsPlan} setPlanId={setDetailsPlan} />\n </div>\n )\n}\n","import type { AppConfig } from '@fayz-ai/core'\n\n/**\n * Snapshot of `app_config()` so a reload paints the tenant's own shell before\n * the network answers.\n *\n * The in-memory cache in @fayz-ai/core survives a route change and dies with\n * the tab, so every reload used to render the app's DEFAULT rail first and\n * correct itself a round trip later — the one flash a tenant with a trimmed\n * menu notices, because the modules they turned off appear and then leave.\n *\n * Same shape as the org snapshot next door (see ../org/cache.ts): versioned,\n * keyed by tenant, dropped when too old, skipped when too big. It is a paint\n * accelerator, never the source of truth — `useAppConfig` always revalidates.\n */\n\nconst STORAGE_KEY = 'fayz:app-config'\nconst VERSION = 1\n\n/** Painted without waiting for the network. Beyond this it is still painted, but as stale. */\nexport const APP_CONFIG_TTL_MS = 5 * 60 * 1000\n/** Older than this and the snapshot is dropped rather than painted. */\nconst MAX_AGE_MS = 24 * 60 * 60 * 1000\n/** A config this big is a defect; skip persisting rather than blow the quota. */\nconst MAX_BYTES = 256 * 1024\n\ninterface Snapshot {\n version: number\n tenantId: string\n savedAt: number\n config: AppConfig\n}\n\nfunction storage(): Storage | null {\n try {\n // The bare global, as ../org/cache.ts reads it: a test stubs `localStorage`\n // and `window` may not exist at all (SSR, a node test).\n return globalThis.localStorage ?? null\n } catch {\n // Private windows and blocked site data throw on ACCESS, not on read.\n return null\n }\n}\n\nconst keyFor = (tenantId: string) => `${STORAGE_KEY}:${tenantId}`\n\n/** The last known config for this tenant, or null. Never throws. */\nexport function readAppConfigSnapshot(tenantId: string): { config: AppConfig; stale: boolean } | null {\n const store = storage()\n if (!store) return null\n try {\n const raw = store.getItem(keyFor(tenantId))\n if (!raw) return null\n const snap = JSON.parse(raw) as Snapshot\n if (snap.version !== VERSION || snap.tenantId !== tenantId) return null\n const age = Date.now() - snap.savedAt\n if (age > MAX_AGE_MS) {\n store.removeItem(keyFor(tenantId))\n return null\n }\n return { config: snap.config, stale: age > APP_CONFIG_TTL_MS }\n } catch {\n return null\n }\n}\n\n/** Records what the server just said. Never throws. */\nexport function writeAppConfigSnapshot(tenantId: string, config: AppConfig): void {\n const store = storage()\n if (!store) return\n try {\n const payload = JSON.stringify({ version: VERSION, tenantId, savedAt: Date.now(), config } satisfies Snapshot)\n if (payload.length > MAX_BYTES) return\n store.setItem(keyFor(tenantId), payload)\n } catch {\n // A quota error must not break a render. The next load is simply cold.\n }\n}\n\n/** Drops the snapshot — after a write through the config RPCs, or on sign-out. */\nexport function clearAppConfigSnapshot(tenantId?: string): void {\n const store = storage()\n if (!store) return\n try {\n if (tenantId) {\n store.removeItem(keyFor(tenantId))\n return\n }\n for (let i = store.length - 1; i >= 0; i -= 1) {\n const key = store.key(i)\n if (key?.startsWith(`${STORAGE_KEY}:`)) store.removeItem(key)\n }\n } catch {\n // Nothing to do: a snapshot we cannot drop is revalidated anyway.\n }\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport { useCallback, useEffect, useLayoutEffect, useMemo } from 'react'\nimport { fetchAppConfig, invalidateAppConfig, toTenantPluginBindings, type AppConfig } from '@fayz-ai/core'\nimport { getSupabaseClientOptional } from '../lib/supabase'\nimport { useOrganizationStore } from '../stores/organization.store'\nimport { useAppConfigStore, activePluginIds, hasPlugin } from '../stores/app-config.store'\nimport { readAppConfigSnapshot, writeAppConfigSnapshot, clearAppConfigSnapshot } from '../app/app-config-cache'\n\n// ---------------------------------------------------------------------------\n// useAppConfig — the shell's single initial load (#280, ADR 0023).\n//\n// One call, one round trip: branding, which plugins and facets are on, the\n// tenant's menu composition, and the caller's permissions. Everything the frame\n// needs before it knows anything else.\n//\n// ── It never throws, and that is the requirement ────────────────────────────\n// A shell that will not render because a config call failed is worse than one\n// that renders defaults. `fetchAppConfig` already guarantees this; the hook\n// keeps the guarantee by treating a failure as \"an empty config, and a note in\n// the store\" rather than as an exception a boundary has to catch.\n//\n// ── Why a refresh does not blank the screen ─────────────────────────────────\n// This drives the frame. Re-reading it after an activation change must leave\n// the previous answer on screen until the new one lands, or every toggle is a\n// flash of empty application.\n// ---------------------------------------------------------------------------\n\nexport interface UseAppConfigResult {\n config: AppConfig\n /** True only until the first answer arrives. */\n initializing: boolean\n /**\n * A configuração em mãos é sobre a conta em que a sessão está.\n *\n * Falso na janela entre escolher outra conta e a resposta dela chegar — a\n * janela em que o shell pintava o rail do bundle e o guarda de rota negava\n * por não ter perfil ainda. Quem renderiza a moldura espera por isto.\n */\n ready: boolean\n stale: boolean\n error: string | null\n /** Active plugin ids, facets folded in. */\n activePlugins: string[]\n /** `has('financial')` for the plugin, `has('financial', 'reconciliation')` for a part. */\n has: (plugin: string, facet?: string) => boolean\n /** What `resolvePluginRuntime` takes — the bridge from config to the runtime. */\n bindings: ReturnType<typeof toTenantPluginBindings>\n /** Re-reads after an activation change. Keeps the current config visible. */\n refresh: () => Promise<void>\n}\n\n/** How often to ask whether the tenant's entitlements moved. One timestamp. */\nconst CONFIG_POLL_MS = 60_000\n\nconst EMPTY = { tenant_id: null, plugins: [], apps: [], nav: [], permissions: [] } as AppConfig\n\nasync function loadFor(tenantId: string | null, force = false): Promise<AppConfig> {\n const supabase = getSupabaseClientOptional()\n // No client is not an error — a storybook, a test, a page rendered before\n // sign-in. An empty config renders the defaults, which is the point.\n if (!supabase) return { ...EMPTY, tenant_id: tenantId }\n return fetchAppConfig(supabase, { tenantId: tenantId ?? undefined, force })\n}\n\nexport function useAppConfig(options?: { enabled?: boolean }): UseAppConfigResult {\n const enabled = options?.enabled !== false\n const currentOrg = useOrganizationStore((state) => state.currentOrg)\n const tenantId = currentOrg?.id ?? null\n\n const config = useAppConfigStore((state) => state.config)\n const configTenantId = useAppConfigStore((state) => state.tenantId)\n const beginTenant = useAppConfigStore((state) => state.beginTenant)\n const initializing = useAppConfigStore((state) => state.initializing)\n const stale = useAppConfigStore((state) => state.stale)\n const error = useAppConfigStore((state) => state.error)\n const setConfig = useAppConfigStore((state) => state.setConfig)\n const setStale = useAppConfigStore((state) => state.setStale)\n const setError = useAppConfigStore((state) => state.setError)\n const reset = useAppConfigStore((state) => state.reset)\n\n const refresh = useCallback(async () => {\n setStale(true)\n try {\n if (tenantId) {\n invalidateAppConfig(tenantId)\n clearAppConfigSnapshot(tenantId)\n }\n const next = await loadFor(tenantId, true)\n if (tenantId) writeAppConfigSnapshot(tenantId, next)\n setConfig(next, tenantId)\n } catch (err) {\n setError(errorMessage(err))\n } finally {\n setStale(false)\n }\n }, [tenantId, setConfig, setError, setStale])\n\n // A conta mudou: o que está em tela não é sobre ela.\n //\n // Antes desta marca o shell seguia com a configuração anterior (ou o padrão\n // do bundle) até a resposta nova chegar, e então trocava tudo de uma vez —\n // o rail curto e o \"acesso restrito\" que piscavam na troca de conta.\n useLayoutEffect(() => {\n if (!enabled) return\n if (configTenantId !== tenantId) beginTenant(tenantId)\n }, [enabled, tenantId, configTenantId, beginTenant])\n\n // Paint the tenant's own shell before the network answers.\n //\n // In a layout effect, not a plain one: the rail is composed during render, so\n // an effect that lands after paint shows the app's DEFAULT menu for a frame\n // and corrects it — which is exactly the flash a tenant with modules turned\n // off notices, because the ones they removed appear and then leave.\n useLayoutEffect(() => {\n if (!enabled || !tenantId) return\n const snap = readAppConfigSnapshot(tenantId)\n if (!snap) return\n setConfig(snap.config, tenantId)\n if (snap.stale) setStale(true)\n }, [enabled, tenantId, setConfig, setStale])\n\n useEffect(() => {\n if (!enabled) {\n reset()\n return\n }\n let cancelled = false\n void (async () => {\n try {\n const next = await loadFor(tenantId)\n if (cancelled) return\n if (tenantId) writeAppConfigSnapshot(tenantId, next)\n setConfig(next, tenantId)\n setStale(false)\n } catch (err) {\n // fetchAppConfig does not throw; this catches a client that does.\n if (!cancelled) setError(errorMessage(err))\n }\n })()\n return () => {\n cancelled = true\n }\n }, [enabled, tenantId, setConfig, setError, setStale, reset])\n\n // A plan change has to reach the screen without a reload (#281, ADR 0025).\n //\n // Polling `app_config()` would work and would be wasteful — it returns\n // branding, every activation, the whole menu. `tenant_config_version()`\n // returns one timestamp, so the common case (nothing changed) costs a number,\n // and the config is re-read only when it actually moved. An upgrade taken on\n // the billing page lights up the module on this one within a minute, and a\n // downgrade takes it away just as quickly.\n useEffect(() => {\n if (!enabled || !tenantId) return\n const supabase = getSupabaseClientOptional()\n if (!supabase) return\n let cancelled = false\n let seen: string | null = null\n\n const poll = async () => {\n try {\n const { data, error } = await supabase.rpc('tenant_config_version')\n if (cancelled || error || !data) return\n const stamp = String(data)\n if (seen === null) {\n seen = stamp\n return\n }\n if (stamp !== seen) {\n seen = stamp\n invalidateAppConfig(tenantId)\n const next = await loadFor(tenantId, true)\n writeAppConfigSnapshot(tenantId, next)\n setConfig(next, tenantId)\n }\n } catch {\n // A poll that fails changes nothing on screen, which is the correct\n // outcome: the config already rendered is still the last good answer.\n }\n }\n\n const timer = setInterval(() => void poll(), CONFIG_POLL_MS)\n void poll()\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [enabled, tenantId, setConfig])\n\n // Derived per config, not per render. `bindings` feeds the dependency array of\n // the plugin runtime: a fresh array on every render would re-resolve the whole\n // runtime on every render and remount every plugin page under it.\n const activePlugins = useMemo(() => activePluginIds(config), [config])\n const bindings = useMemo(() => toTenantPluginBindings(config), [config])\n const has = useCallback(\n (plugin: string, facet?: string) => hasPlugin(config, plugin, facet),\n [config],\n )\n\n // Sem conta escolhida não há o que esperar: a tela de escolha é a própria\n // resposta. Com conta, `ready` só é verdade quando a configuração em mãos é a\n // dela.\n const ready = !tenantId || (configTenantId === tenantId && !initializing)\n\n return { config, initializing, ready, stale, error, activePlugins, has, bindings, refresh }\n}\n\n","import * as React from 'react'\nimport { Crown, Check, Minus } from 'lucide-react'\nimport { parsePlanFeature } from './plan-feature'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable, toast } from '@fayz-ai/ui'\nimport { invalidateAppConfig } from '@fayz-ai/core'\nimport type { Plan } from '@fayz-ai/core'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useBillingStore } from '../../billing/store'\nimport { useOrgAdapterOptional } from '../../org/context'\nimport { useOrganizationStore } from '../../org/store'\nimport { usePermissionsStore } from '../../permissions'\nimport { formatPlanPrice } from '../../lib/currency'\nimport { getPlanEntitlements } from './access-contract'\nimport { PricingOverview } from './PricingOverview'\nimport type { ModuleChange } from './PlanCheckoutSheet'\nimport { getSupabaseClientOptional } from '../../lib/supabase'\nimport { clearAppConfigSnapshot } from '../../app/app-config-cache'\nimport { useAppConfig } from '../../hooks/useAppConfig'\n\n// ---------------------------------------------------------------------------\n// SubscriptionPage — the shell's self-serve subscription surface. Present as the\n// /settings/subscription tab whenever `config.billing` is configured. Reads the\n// plans seeded into the billing store from config, resolves the current plan\n// from `currentOrg.plan`, and changes plan via the checkout seam (Stripe/Pix) or,\n// when no seam is configured, an optimistic `adapter.updateOrg(orgId, { plan })`.\n// ---------------------------------------------------------------------------\n\ninterface MatrixRow {\n id: string\n label: string\n cell: (plan: Plan) => React.ReactNode\n odd: boolean\n}\n\nexport function SubscriptionPage({ className }: { className?: string }) {\n const { t } = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n const plans = useBillingStore((s) => s.plans)\n const checkout = useBillingStore((s) => s.checkout)\n const adapter = useOrgAdapterOptional()\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n\n const currentPlanId = currentOrg?.plan || 'free'\n\n const { refresh: refreshAppConfig } = useAppConfig()\n\n // Feature matrix — union of every plan's features, order-preserved.\n const allFeatures = React.useMemo(() => {\n const seen = new Set<string>()\n const out: string[] = []\n for (const plan of plans) {\n for (const f of plan.features) {\n if (!seen.has(f)) {\n seen.add(f)\n out.push(f)\n }\n }\n }\n return out\n }, [plans])\n\n // Real entitlements matrix — derived from plan.entitlements when any plan\n // declares them. Feature rows show ✓/— per plan; limit rows show \"Up to N\" /\n // \"Unlimited\". Falls back to the marketing-bullet matrix (allFeatures) below\n // when no plan carries entitlements.\n const featureCatalog = usePermissionsStore((s) => s.features)\n const entitlementsMatrix = React.useMemo(() => {\n const hasAny = plans.some((p) => getPlanEntitlements(p))\n if (!hasAny) return null\n\n const featureIds: string[] = []\n const featureSeen = new Set<string>()\n const limitKeys: string[] = []\n const limitSeen = new Set<string>()\n for (const plan of plans) {\n const ent = getPlanEntitlements(plan)\n for (const id of Object.keys(ent?.features ?? {})) {\n if (!featureSeen.has(id)) { featureSeen.add(id); featureIds.push(id) }\n }\n for (const key of Object.keys(ent?.limits ?? {})) {\n if (!limitSeen.has(key)) { limitSeen.add(key); limitKeys.push(key) }\n }\n }\n if (featureIds.length === 0 && limitKeys.length === 0) return null\n\n const labelForFeature = (id: string) => featureCatalog.find((f) => f.id === id)?.label ?? id\n const labelForLimit = (key: string) => {\n const v = t(`limit.label.${key}`)\n return !v || v === `limit.label.${key}` ? key : v\n }\n return { featureIds, limitKeys, labelForFeature, labelForLimit }\n }, [plans, featureCatalog, t])\n\n async function applyChange(plan: Plan): Promise<boolean> {\n try {\n // Seam: a configured gateway (Stripe/Pix) owns the transition; the webhook\n // is the source of truth for the persisted plan, so we don't mutate here.\n if (checkout) {\n await checkout(plan.id)\n return true\n }\n // No gateway: optimistic org update. Persist + swap the store so the plan\n // badge and CTAs re-render immediately.\n if (adapter && currentOrg) {\n const updated = await adapter.updateOrg(currentOrg.id, { plan: plan.id })\n setCurrentOrg(updated)\n } else if (currentOrg) {\n setCurrentOrg({ ...currentOrg, plan: plan.id })\n }\n toast.success(\n tr('billing.planChanged', 'Plan updated').replace('{{plan}}', plan.name),\n )\n return true\n } catch {\n toast.error(tr('billing.planChangeFailed', \"Couldn't change your plan. Please try again.\"))\n return false\n }\n }\n\n const featureMark = (on: boolean) =>\n on ? <Check className=\"mx-auto h-4 w-4 text-primary\" /> : <Minus className=\"mx-auto h-4 w-4 text-muted-foreground/40\" />\n const limitText = (cap: number | undefined) =>\n cap === undefined\n ? '—'\n : cap < 0\n ? tr('billing.unlimited', 'Unlimited')\n : tr('billing.upTo', 'Up to {count}').replace('{count}', String(cap)).replace('{{count}}', String(cap))\n const matrixRows: MatrixRow[] = (\n entitlementsMatrix\n ? [\n ...entitlementsMatrix.featureIds.map((id) => ({\n id: `f:${id}`,\n label: entitlementsMatrix.labelForFeature(id),\n cell: (plan: Plan) => featureMark(getPlanEntitlements(plan)?.features?.[id] !== false),\n })),\n ...entitlementsMatrix.limitKeys.map((key) => ({\n id: `l:${key}`,\n label: entitlementsMatrix.labelForLimit(key),\n cell: (plan: Plan) => <span className=\"text-muted-foreground\">{limitText(getPlanEntitlements(plan)?.limits?.[key])}</span>,\n })),\n ]\n : allFeatures.map((feature) => ({\n id: feature,\n label: parsePlanFeature(feature).label,\n cell: (plan: Plan) => featureMark(plan.features.includes(feature)),\n }))\n ).map((row, i) => ({ ...row, odd: i % 2 === 1 }))\n const matrixColumns: ColumnDef<MatrixRow>[] = [\n { id: 'feature', header: tr('billing.features', 'Features'), cell: ({ row }) => row.original.label },\n ...plans.map((plan): ColumnDef<MatrixRow> => ({\n id: plan.id,\n header: () => (\n <span className=\"inline-flex items-center gap-1\">\n {plan.price > 0 && <Crown className=\"h-3.5 w-3.5 text-amber-500\" />}\n {plan.name}\n </span>\n ),\n meta: { className: 'text-center' },\n cell: ({ row }) => row.original.cell(plan),\n })),\n ]\n\n const compare = entitlementsMatrix || allFeatures.length > 0 ? (\n <div className=\"space-y-3\">\n <DataTable variant=\"flat\" columns={matrixColumns} data={matrixRows} rowClassName={(r) => (r.odd ? 'bg-muted/20' : undefined)} />\n </div>\n ) : null\n\n if (plans.length === 0) {\n return (\n <div className={className ?? 'mx-auto max-w-5xl'}>\n <PricingOverview />\n </div>\n )\n }\n\n // The plan and the modules it will run, in one confirmation. With a payment\n // gateway the plan is the webhook's to persist, so modules go first; without\n // one the plan changes first, so its ceiling lets the new modules in.\n async function applyPlanWithModules(plan: Plan, changes: ModuleChange[]) {\n const supabase = getSupabaseClientOptional()\n const failed: string[] = []\n const setModules = async () => {\n if (!supabase) return\n for (const c of changes) {\n const { error } = await supabase.rpc('tenant_plugin_set', { p_plugin: c.plugin, p_status: c.status, p_facet: c.facet })\n if (error) failed.push(c.facet ? `${c.plugin}.${c.facet}` : c.plugin)\n }\n }\n if (checkout) await setModules()\n // A plan that did not change leaves the modules as they were.\n if (plan.id !== currentPlanId && !(await applyChange(plan))) return\n if (!checkout) await setModules()\n if (currentOrg?.id) {\n invalidateAppConfig(currentOrg.id)\n clearAppConfigSnapshot(currentOrg.id)\n }\n await refreshAppConfig()\n if (failed.length) {\n toast.error(tr('billing.modulesNotChanged', 'Some modules were not changed'), { description: failed.join(', ') })\n } else if (changes.length) {\n toast.success(tr('billing.modulesChanged', 'Modules updated'))\n }\n }\n\n return (\n <div className={className ?? 'mx-auto max-w-5xl space-y-8'}>\n {/* Sem título nem descrição: a barra já escreve \"Assinatura\", e a frase\n embaixo custava uma linha para repetir o que os planos mostram. */}\n\n <PricingOverview\n plans={plans}\n currentPlanId={currentPlanId}\n onConfirm={applyPlanWithModules}\n compare={compare}\n />\n\n </div>\n )\n}\n"]}
|