@burdenoff/microfe-brainyrich 2026.716.1 → 2026.730.1
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/brainyrich/hooks/useBrainyRichApi.d.ts +34 -5
- package/dist/brainyrich/hooks/useBrainyRichApi.d.ts.map +1 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.js +317 -224
- package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -1
- package/dist/brainyrich/pages/ReportsPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/ReportsPage.js +306 -318
- package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
- package/dist/brainyrich/pages/RiskPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/RiskPage.js +433 -213
- package/dist/brainyrich/pages/RiskPage.js.map +1 -1
- package/dist/brainyrich/types/bra.d.ts +27 -0
- package/dist/brainyrich/types/bra.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../src/brainyrich/pages/ReportsPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport {\n FileText,\n Printer,\n Download,\n Wallet,\n Layers,\n Receipt,\n ChevronDown,\n Users,\n Target,\n TrendingUp,\n} from 'lucide-react';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useBrainyRich } from '../providers/BrainyRichProvider';\nimport {\n useNetWorthSummary,\n useAllTransactions,\n fetchAllAccounts,\n useHouseholds,\n useAccounts,\n useGoals,\n useGoalFundings,\n} from '../hooks/useBrainyRichApi';\nimport type {\n BraHolding,\n BraTransaction,\n BraHousehold,\n BraAccount,\n BraGoal,\n BraGoalProjection,\n BraTransactionType,\n} from '../types/bra';\nimport {\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatCompact,\n formatDate,\n deltaToneClass,\n statusBadgeVariant,\n} from './_shared';\nimport {\n DonutChart,\n StatTile,\n TrendBars,\n Sparkline,\n ProgressRing,\n GlassCard,\n FadeIn,\n type VizTone,\n} from '../components/viz';\n\ntype Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\ntype StatementView = 'networth' | 'holdings' | 'transactions' | 'statement';\n\n/** Minimal read-query surface the statement sub-cards need for their states. */\ninterface QueryStatus {\n isLoading: boolean;\n isError: boolean;\n refetch: () => void;\n}\n\n// ============================================================================\n// Asset-class presentation (labels + semantic tones) — display only\n// ============================================================================\n\nconst ASSET_CLASS_LABEL: Record<string, string> = {\n EQUITY: 'Equity',\n FIXED_INCOME: 'Fixed Income',\n CASH: 'Cash',\n REAL_ESTATE: 'Real Estate',\n COMMODITY: 'Commodity',\n CRYPTO: 'Crypto',\n ALTERNATIVE: 'Alternatives',\n};\n\nconst ASSET_CLASS_TONE: Record<string, VizTone> = {\n EQUITY: 'brand',\n FIXED_INCOME: 'blue',\n CASH: 'teal',\n REAL_ESTATE: 'warning',\n COMMODITY: 'indigo',\n CRYPTO: 'purple',\n ALTERNATIVE: 'info',\n};\n\nfunction assetClassLabel(ac: string): string {\n return ASSET_CLASS_LABEL[ac] ?? ac.replace(/_/g, ' ');\n}\n\n// ============================================================================\n// Cash-flow derivation — REAL ledger rows bucketed by month\n// ----------------------------------------------------------------------------\n// Inflow = money arriving (deposits, dividends, interest, sale proceeds).\n// Outflow = money leaving (withdrawals, fees, buys). TRANSFER is treated as\n// balance-neutral. Every value comes straight from recorded transactions.\n// ============================================================================\n\nconst INFLOW_TYPES: BraTransactionType[] = ['DEPOSIT', 'DIVIDEND', 'INTEREST', 'SELL'];\nconst OUTFLOW_TYPES: BraTransactionType[] = ['WITHDRAWAL', 'FEE', 'BUY'];\n\nfunction monthKey(iso: string): string | null {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return null;\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;\n}\n\nfunction monthLabel(key: string): string {\n const [y, m] = key.split('-').map(Number);\n return new Intl.DateTimeFormat('en-US', { month: 'short' }).format(new Date(y, m - 1, 1));\n}\n\ninterface CashflowDatum {\n label: string;\n inflow: number;\n outflow: number;\n}\n\nfunction buildCashflow(\n txns: BraTransaction[],\n months = 6\n): { bars: CashflowDatum[]; netSeries: number[] } {\n const map = new Map<string, { inflow: number; outflow: number }>();\n for (const t of txns) {\n const k = monthKey(t.tradeDate);\n if (!k) continue;\n const bucket = map.get(k) ?? { inflow: 0, outflow: 0 };\n const amt = Math.abs(t.amount);\n if (INFLOW_TYPES.includes(t.type)) bucket.inflow += amt;\n else if (OUTFLOW_TYPES.includes(t.type)) bucket.outflow += amt;\n map.set(k, bucket);\n }\n const recent = Array.from(map.keys()).sort().slice(-months);\n const bars = recent.map((k) => {\n const b = map.get(k)!;\n return { label: monthLabel(k), inflow: b.inflow, outflow: b.outflow };\n });\n let run = 0;\n const netSeries = recent.map((k) => {\n const b = map.get(k)!;\n run += b.inflow - b.outflow;\n return run;\n });\n return { bars, netSeries };\n}\n\nfunction cashflowTotals(txns: BraTransaction[]): { inflow: number; outflow: number; net: number } {\n let inflow = 0;\n let outflow = 0;\n for (const t of txns) {\n const a = Math.abs(t.amount);\n if (INFLOW_TYPES.includes(t.type)) inflow += a;\n else if (OUTFLOW_TYPES.includes(t.type)) outflow += a;\n }\n return { inflow, outflow, net: inflow - outflow };\n}\n\n// ============================================================================\n// Statement math — net worth composition for a set of accounts + their holdings\n// ============================================================================\n\ninterface StatementData {\n netWorth: number;\n invested: number;\n cash: number;\n allocation: { label: string; value: number; tone?: VizTone }[];\n /** Per-account total value (cash + holdings) — used to resolve goal funding %. */\n accountValues: Map<string, number>;\n}\n\nfunction computeStatement(accounts: BraAccount[], holdings: BraHolding[]): StatementData {\n const accountValues = new Map<string, number>();\n let cash = 0;\n for (const a of accounts) {\n accountValues.set(a.id, a.cashBalance);\n cash += a.cashBalance;\n }\n let invested = 0;\n const byClass = new Map<string, number>();\n for (const h of holdings) {\n invested += h.marketValue;\n byClass.set(h.assetClass, (byClass.get(h.assetClass) ?? 0) + h.marketValue);\n accountValues.set(h.accountId, (accountValues.get(h.accountId) ?? 0) + h.marketValue);\n }\n const allocation = Array.from(byClass.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([ac, v]) => ({ label: assetClassLabel(ac), value: v, tone: ASSET_CLASS_TONE[ac] }));\n return { netWorth: cash + invested, invested, cash, allocation, accountValues };\n}\n\nfunction projectionTone(p: BraGoalProjection): VizTone {\n switch (p) {\n case 'AHEAD':\n return 'success';\n case 'BEHIND':\n return 'warning';\n case 'AT_RISK':\n return 'error';\n default:\n return 'brand';\n }\n}\n\n// ============================================================================\n// CSV helpers — client-side export built from REAL rows only\n// ============================================================================\n\nfunction toCsv(headers: string[], rows: (string | number)[][]): string {\n const escape = (cell: string | number) => {\n const s = String(cell ?? '');\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n return [headers, ...rows].map((row) => row.map(escape).join(',')).join('\\n');\n}\n\nfunction downloadCsv(filename: string, csv: string) {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'household'\n );\n}\n\n// ============================================================================\n// Full holdings schedule\n// ----------------------------------------------------------------------------\n// `braListPortfolios`/`braListAccounts` never inline `holdings`, and\n// `braListHoldings` is scoped to a single account/portfolio. To build a\n// COMPLETE holdings schedule (every position, not a truncated first page) we\n// enumerate the full account set via the foundation `fetchAllAccounts` pager,\n// then read each account's holdings (which `braListHoldings` returns in full,\n// un-paginated) and flatten. Real server rows only — no fabrication.\n// ============================================================================\n\nconst HOLDINGS_BY_ACCOUNT_QUERY = `query BraReportHoldings($accountId: ID) {\n braListHoldings(accountId: $accountId) {\n id workspaceId accountId portfolioId symbol name assetClass quantity lastPrice\n costBasis marketValue currency asOf createdAt updatedAt\n }\n}`;\n\nfunction useAllHoldings() {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: ['brainyrich', 'holdings', 'report-all'],\n queryFn: async () => {\n const accounts = await fetchAllAccounts(apiGatewayUrl);\n const perAccount = await Promise.all(\n accounts.map(async (account) => {\n const response = await graphqlFetch<{ braListHoldings: BraHolding[] }>({\n gateway: 'workspace',\n baseUrl: apiGatewayUrl,\n query: HOLDINGS_BY_ACCOUNT_QUERY,\n variables: { accountId: account.id },\n workspaceToken: true,\n });\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'Failed to load holdings');\n }\n return response.data?.braListHoldings ?? [];\n })\n );\n return perAccount.flat();\n },\n });\n return { ...query, data: query.data ?? [] };\n}\n\n// ============================================================================\n// Reports page — real, generatable statement views\n// (net worth / holdings / ledger / client statement)\n// ============================================================================\n\nexport function ReportsPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const [view, setView] = useState<StatementView>('networth');\n const [selectedHouseholdId, setSelectedHouseholdId] = useState<string | undefined>();\n\n const summaryQuery = useNetWorthSummary();\n // Aggregation sources: page through the FULL set so statements + CSV cover\n // every holding and every ledger entry, not a truncated first page.\n const holdingsQuery = useAllHoldings();\n const transactionsQuery = useAllTransactions();\n const householdsQuery = useHouseholds();\n\n const summary = summaryQuery.data;\n const currency = summary?.currency ?? 'USD';\n const households = householdsQuery.data;\n\n // Active household for the Client Statement (defaults to the first one).\n const activeHouseholdId = selectedHouseholdId ?? households[0]?.id;\n const activeHousehold = households.find((h) => h.id === activeHouseholdId);\n\n // Household-scoped sources. React-Query dedupes these against the statement\n // sub-tree, so passing an id here does not double-fetch.\n const householdAccountsQuery = useAccounts({ householdId: activeHouseholdId });\n const householdGoalsQuery = useGoals({ householdId: activeHouseholdId });\n const householdAccounts = householdAccountsQuery.data;\n const householdGoals = householdGoalsQuery.data;\n\n // Holdings schedule: every holding across every account, richest first.\n const holdings: BraHolding[] = useMemo(\n () => holdingsQuery.data.slice().sort((a, b) => b.marketValue - a.marketValue),\n [holdingsQuery.data]\n );\n\n const transactions: BraTransaction[] = useMemo(\n () =>\n transactionsQuery.data\n .slice()\n .sort((a, b) => new Date(b.tradeDate).getTime() - new Date(a.tradeDate).getTime()),\n [transactionsQuery.data]\n );\n\n const cashflow = useMemo(() => buildCashflow(transactions), [transactions]);\n\n // Household slices for the statement (built from already-loaded page data).\n const householdAccountIds = useMemo(\n () => new Set(householdAccounts.map((a) => a.id)),\n [householdAccounts]\n );\n const householdHoldings = useMemo(\n () =>\n holdings\n .filter((h) => householdAccountIds.has(h.accountId))\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue),\n [holdings, householdAccountIds]\n );\n const householdTxns = useMemo(\n () => transactions.filter((tx) => householdAccountIds.has(tx.accountId)),\n [transactions, householdAccountIds]\n );\n const statementData = useMemo(\n () => computeStatement(householdAccounts, householdHoldings),\n [householdAccounts, householdHoldings]\n );\n\n // Header KPIs — premium tiles, net worth carrying an emerald glow + a real\n // cumulative net-cash-flow spark (decorative, aria-hidden inside StatTile).\n const holdingsUnrealized = useMemo(\n () => holdings.reduce((sum, h) => sum + (h.marketValue - h.costBasis), 0),\n [holdings]\n );\n\n // Primary \"Print / Export\" action for the currently selected statement.\n // Each branch emits the COMPLETE dataset (full holdings / full ledger).\n const exportCurrent = () => {\n if (view === 'networth') {\n if (!summary) return;\n const headers = ['Metric', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Total Net Worth', summary.totalNetWorth, currency],\n ['Total Market Value', summary.totalMarketValue, currency],\n ['Total Cash', summary.totalCash, currency],\n ['Account Count', summary.accountCount, ''],\n ...summary.byAssetClass.map((row) => [\n `Asset Class: ${assetClassLabel(row.assetClass)}`,\n row.marketValue,\n currency,\n ]),\n ];\n downloadCsv('brainyrich-net-worth-statement.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'holdings') {\n const headers = [\n 'Symbol',\n 'Name',\n 'Asset Class',\n 'Quantity',\n 'Cost Basis',\n 'Market Value',\n 'Currency',\n ];\n const rows = holdings.map((h) => [\n h.symbol,\n h.name ?? '',\n assetClassLabel(h.assetClass),\n h.quantity,\n h.costBasis,\n h.marketValue,\n h.currency,\n ]);\n downloadCsv('brainyrich-holdings-schedule.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'statement') {\n if (!activeHousehold) return;\n const cur = activeHousehold.currency ?? currency;\n const headers = ['Section', 'Label', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Summary', 'Net Worth', statementData.netWorth, cur],\n ['Summary', 'Invested Value', statementData.invested, cur],\n ['Summary', 'Cash & Liquidity', statementData.cash, cur],\n ...statementData.allocation.map((a) => ['Allocation', a.label, a.value, cur]),\n ...householdHoldings.map((h) => [\n 'Holding',\n `${h.symbol}${h.name ? ` — ${h.name}` : ''}`,\n h.marketValue,\n h.currency,\n ]),\n ...householdGoals.map((g) => ['Goal', g.name, g.targetAmount, g.currency]),\n ];\n downloadCsv(\n `brainyrich-${slugify(activeHousehold.name)}-statement.csv`,\n toCsv(headers, rows)\n );\n return;\n }\n const headers = [\n 'Trade Date',\n 'Type',\n 'Symbol',\n 'Quantity',\n 'Price',\n 'Amount',\n 'Fee',\n 'Currency',\n ];\n const rows = transactions.map((tx) => [\n formatDate(tx.tradeDate),\n tx.type,\n tx.symbol ?? '',\n tx.quantity,\n tx.price,\n tx.amount,\n tx.fee,\n tx.currency,\n ]);\n downloadCsv('brainyrich-transaction-ledger.csv', toCsv(headers, rows));\n };\n\n // The export action only produces a file for a statement that actually has\n // rows; disable it while the active statement is still loading / empty.\n const exportDisabled =\n (view === 'networth' && (summaryQuery.isLoading || !summary)) ||\n (view === 'holdings' && (holdingsQuery.isLoading || holdings.length === 0)) ||\n (view === 'transactions' && (transactionsQuery.isLoading || transactions.length === 0)) ||\n (view === 'statement' && (!activeHousehold || householdAccountsQuery.isLoading));\n\n return (\n <SectionShell\n title={translate('brainyrich.reports.title', 'Reports & Statements')}\n description={translate(\n 'brainyrich.reports.description',\n 'Generate statements directly from your live portfolio data — no fabricated schedules.'\n )}\n actions={\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"sm\"\n disabled={exportDisabled}\n aria-label={translate('brainyrich.reports.actions.export', 'Print / Export')}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.export', 'Print / Export')}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={exportCurrent}>\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.downloadCsv', 'Download CSV')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => window.print()}>\n <Printer className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.print', 'Print statement')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n }\n >\n <FadeIn>\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label={translate('brainyrich.reports.kpis.netWorth', 'Net Worth')}\n value={summary ? formatMoney(summary.totalNetWorth, currency) : '—'}\n spark={cashflow.netSeries}\n glow\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.marketValue', 'Invested Value')}\n value={summary ? formatMoney(summary.totalMarketValue, currency) : '—'}\n icon={<TrendingUp className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.holdings', 'Holdings on Schedule')}\n value={String(holdings.length)}\n icon={<Layers className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.transactions', 'Ledger Entries')}\n value={String(transactions.length)}\n icon={<Receipt className=\"size-4\" aria-hidden=\"true\" />}\n />\n </div>\n </FadeIn>\n\n <Tabs value={view} onValueChange={(value) => setView(value as StatementView)}>\n <TabsList>\n <TabsTrigger value=\"networth\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.netWorth', 'Net Worth')}\n </TabsTrigger>\n <TabsTrigger value=\"holdings\">\n <Layers className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.holdings', 'Holdings')}\n </TabsTrigger>\n <TabsTrigger value=\"transactions\">\n <Receipt className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.ledger', 'Ledger')}\n </TabsTrigger>\n <TabsTrigger value=\"statement\">\n <Users className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.statement', 'Client Statement')}\n </TabsTrigger>\n </TabsList>\n </Tabs>\n\n {view === 'networth' ? (\n <NetWorthStatement\n query={summaryQuery}\n cashflow={cashflow.bars}\n netSeries={cashflow.netSeries}\n translate={translate}\n />\n ) : view === 'holdings' ? (\n <HoldingsSchedule\n query={holdingsQuery}\n holdings={holdings}\n unrealized={holdingsUnrealized}\n translate={translate}\n />\n ) : view === 'transactions' ? (\n <TransactionLedger\n query={transactionsQuery}\n transactions={transactions}\n cashflow={cashflow.bars}\n currency={currency}\n translate={translate}\n />\n ) : (\n <ClientStatementPanel\n householdsQuery={householdsQuery}\n households={households}\n activeHousehold={activeHousehold}\n onSelect={setSelectedHouseholdId}\n accountsQuery={householdAccountsQuery}\n goals={householdGoals}\n holdings={householdHoldings}\n transactions={householdTxns}\n statement={statementData}\n translate={translate}\n />\n )}\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Net-worth statement — hero figure + allocation donut + asset-class schedule\n// ============================================================================\n\nfunction NetWorthStatement({\n query,\n cashflow,\n netSeries,\n translate,\n}: {\n query: ReturnType<typeof useNetWorthSummary>;\n cashflow: CashflowDatum[];\n netSeries: number[];\n translate: Translate;\n}) {\n const summary = query.data;\n const currency = summary?.currency ?? 'USD';\n\n const allocation = useMemo(() => {\n if (!summary) return [];\n return summary.byAssetClass\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue)\n .map((row) => ({\n label: assetClassLabel(row.assetClass),\n value: row.marketValue,\n tone: ASSET_CLASS_TONE[row.assetClass],\n }));\n }, [summary]);\n\n if (query.isLoading) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <LoadingState rows={3} />\n </CardContent>\n </Card>\n );\n }\n if (query.isError) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => query.refetch()} />\n </CardContent>\n </Card>\n );\n }\n if (!summary) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <EmptyState\n icon={<Wallet className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.netWorth.emptyTitle', 'No net-worth data yet')}\n description={translate(\n 'brainyrich.reports.netWorth.emptyDesc',\n 'Link an account and add holdings to generate a net-worth statement.'\n )}\n />\n </CardContent>\n </Card>\n );\n }\n\n const asOf = translate('brainyrich.reports.netWorth.asOf', 'as of {date}', {\n date: formatDate(new Date().toISOString()),\n });\n\n return (\n <div className=\"space-y-6\">\n <div className=\"grid gap-6 lg:grid-cols-[1.1fr_1fr]\">\n {/* Hero net-worth figure with emerald glow + real cumulative-flow spark */}\n <FadeIn>\n <GlassCard glow className=\"h-full\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.netWorth.title', 'Net Worth Statement')} — {asOf}\n </p>\n <p className=\"mt-2 text-4xl font-semibold tracking-tight text-text-primary\">\n {formatMoney(summary.totalNetWorth, currency)}\n </p>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.invested', 'Invested')}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(summary.totalMarketValue, currency)}\n </span>\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.cash', 'Cash')}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(summary.totalCash, currency)}\n </span>\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.accounts', 'Accounts')}\n <span className=\"font-medium text-text-primary\">{summary.accountCount}</span>\n </span>\n </div>\n {netSeries.length > 1 ? (\n <div className=\"mt-5\">\n <p className=\"mb-1 text-[11px] text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.netFlow',\n 'Cumulative net cash flow (recent months)'\n )}\n </p>\n <Sparkline data={netSeries} height={48} />\n </div>\n ) : null}\n </GlassCard>\n </FadeIn>\n\n {/* Allocation donut */}\n <FadeIn index={1}>\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle className=\"text-base\">\n {translate('brainyrich.reports.netWorth.allocation', 'Allocation by Asset Class')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {allocation.length > 0 ? (\n <DonutChart\n data={allocation}\n centerLabel={translate('brainyrich.reports.netWorth.invested', 'Invested')}\n centerValue={formatCompact(summary.totalMarketValue, currency)}\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n\n {/* Asset-class schedule (statement table) */}\n <FadeIn index={2}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.netWorth.schedule', 'By Asset Class')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {allocation.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.netWorth.assetClass', 'Asset class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.netWorth.total', 'Total')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {allocation.map((row) => (\n <TableRow\n key={row.label}\n className=\"transition-colors hover:bg-bg-elevated/60\"\n >\n <TableCell className=\"font-medium text-text-primary\">{row.label}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(row.value, currency)}\n </TableCell>\n </TableRow>\n ))}\n <TableRow>\n <TableCell className=\"font-semibold text-text-primary\">\n {translate('brainyrich.reports.netWorth.totals', 'Totals')}\n </TableCell>\n <TableCell className=\"text-right font-semibold tabular-nums text-status-success-text\">\n {formatMoney(summary.totalMarketValue, currency)}\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n\n {/* Cash flow */}\n {cashflow.length > 0 ? (\n <FadeIn index={3}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.cashflow.title', 'Cash Flow')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.cashflow.description',\n 'Inflows and outflows recorded on your ledger, by month.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <TrendBars data={cashflow} valueFormatter={(v) => formatCompact(v, currency)} />\n </CardContent>\n </Card>\n </FadeIn>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// Holdings schedule\n// ============================================================================\n\nfunction HoldingsSchedule({\n query,\n holdings,\n unrealized,\n translate,\n}: {\n query: QueryStatus;\n holdings: BraHolding[];\n unrealized: number;\n translate: Translate;\n}) {\n const marketValue = holdings.reduce((sum, h) => sum + h.marketValue, 0);\n const costBasis = holdings.reduce((sum, h) => sum + h.costBasis, 0);\n const currency = holdings[0]?.currency ?? 'USD';\n\n return (\n <div className=\"space-y-6\">\n {!query.isLoading && !query.isError && holdings.length > 0 ? (\n <FadeIn>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatTile\n label={translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n value={formatMoney(marketValue, currency)}\n glow\n />\n <StatTile\n label={translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n value={formatMoney(costBasis, currency)}\n />\n <StatTile\n label={translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n value={formatMoney(unrealized, currency)}\n delta={costBasis > 0 ? (unrealized / costBasis) * 100 : undefined}\n sparkTone={unrealized >= 0 ? 'success' : 'error'}\n />\n </div>\n </FadeIn>\n ) : null}\n\n <FadeIn index={1}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Layers className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.holdings.title', 'Holdings Schedule')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.holdings.description',\n 'Every position across your portfolios with cost basis and market value.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : holdings.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.holdings.symbol', 'Symbol')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((holding) => {\n const gain = holding.marketValue - holding.costBasis;\n return (\n <TableRow\n key={holding.id}\n className=\"transition-colors hover:bg-bg-elevated/60\"\n >\n <TableCell>\n <div className=\"font-medium text-text-primary\">{holding.symbol}</div>\n {holding.name ? (\n <div className=\"text-xs text-text-secondary\">{holding.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{assetClassLabel(holding.assetClass)}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {holding.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.costBasis, holding.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.marketValue, holding.currency)}\n </TableCell>\n <TableCell\n className={`text-right tabular-nums font-medium ${deltaToneClass(gain)}`}\n >\n {gain > 0 ? '+' : ''}\n {formatMoney(gain, holding.currency)}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<Layers className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.holdings.emptyTitle', 'No holdings on file')}\n description={translate(\n 'brainyrich.reports.holdings.emptyDesc',\n 'Add holdings to your portfolios to generate a holdings schedule.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n );\n}\n\n// ============================================================================\n// Transaction ledger\n// ============================================================================\n\nfunction TransactionLedger({\n query,\n transactions,\n cashflow,\n currency,\n translate,\n}: {\n query: QueryStatus;\n transactions: BraTransaction[];\n cashflow: CashflowDatum[];\n currency: string;\n translate: Translate;\n}) {\n const totals = useMemo(() => cashflowTotals(transactions), [transactions]);\n const showSummary = !query.isLoading && !query.isError && transactions.length > 0;\n\n return (\n <div className=\"space-y-6\">\n {showSummary ? (\n <FadeIn>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatTile\n label={translate('brainyrich.reports.ledger.inflow', 'Total Inflow')}\n value={formatMoney(totals.inflow, currency)}\n sparkTone=\"success\"\n />\n <StatTile\n label={translate('brainyrich.reports.ledger.outflow', 'Total Outflow')}\n value={formatMoney(totals.outflow, currency)}\n sparkTone=\"error\"\n />\n <StatTile\n label={translate('brainyrich.reports.ledger.net', 'Net Flow')}\n value={formatMoney(totals.net, currency)}\n glow={totals.net >= 0}\n delta={totals.inflow > 0 ? (totals.net / totals.inflow) * 100 : undefined}\n />\n </div>\n </FadeIn>\n ) : null}\n\n {showSummary && cashflow.length > 0 ? (\n <FadeIn index={1}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.cashflow.title', 'Cash Flow')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <TrendBars data={cashflow} valueFormatter={(v) => formatCompact(v, currency)} />\n </CardContent>\n </Card>\n </FadeIn>\n ) : null}\n\n <FadeIn index={2}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Receipt className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.ledger.title', 'Transaction Ledger')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.ledger.description',\n 'Every recorded transaction across your accounts, newest first.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : transactions.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.ledger.date', 'Trade Date')}\n </TableHead>\n <TableHead>{translate('brainyrich.reports.ledger.type', 'Type')}</TableHead>\n <TableHead>\n {translate('brainyrich.reports.ledger.symbol', 'Symbol')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.price', 'Price')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.amount', 'Amount')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {transactions.map((tx) => (\n <TableRow key={tx.id} className=\"transition-colors hover:bg-bg-elevated/60\">\n <TableCell className=\"text-text-primary\">\n {formatDate(tx.tradeDate)}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{tx.type}</Badge>\n </TableCell>\n <TableCell className=\"text-text-primary\">{tx.symbol ?? '—'}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {tx.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.price, tx.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.amount, tx.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<FileText className=\"size-6\" aria-hidden=\"true\" />}\n title={translate(\n 'brainyrich.reports.ledger.emptyTitle',\n 'No transactions recorded'\n )}\n description={translate(\n 'brainyrich.reports.ledger.emptyDesc',\n 'Record transactions on your accounts to build a ledger statement.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n );\n}\n\n// ============================================================================\n// Client statement — branded, per-household wealth statement (real data)\n// ============================================================================\n\nfunction ClientStatementPanel({\n householdsQuery,\n households,\n activeHousehold,\n onSelect,\n accountsQuery,\n goals,\n holdings,\n transactions,\n statement,\n translate,\n}: {\n householdsQuery: QueryStatus;\n households: BraHousehold[];\n activeHousehold: BraHousehold | undefined;\n onSelect: (id: string) => void;\n accountsQuery: QueryStatus;\n goals: BraGoal[];\n holdings: BraHolding[];\n transactions: BraTransaction[];\n statement: StatementData;\n translate: Translate;\n}) {\n if (householdsQuery.isLoading) {\n return (\n <Card>\n <CardContent className=\"space-y-3 p-6\">\n <Skeleton className=\"h-8 w-64\" />\n <Skeleton className=\"h-40 w-full\" />\n </CardContent>\n </Card>\n );\n }\n if (householdsQuery.isError) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => householdsQuery.refetch()} />\n </CardContent>\n </Card>\n );\n }\n if (households.length === 0 || !activeHousehold) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <EmptyState\n icon={<Users className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.statement.emptyTitle', 'No households yet')}\n description={translate(\n 'brainyrich.reports.statement.emptyDesc',\n 'Create a household to generate a branded client wealth statement.'\n )}\n />\n </CardContent>\n </Card>\n );\n }\n\n const currency = activeHousehold.currency ?? 'USD';\n const netSeries = buildCashflow(transactions).netSeries;\n const asOf = formatDate(new Date().toISOString());\n\n return (\n <div className=\"space-y-4\">\n {/* Household picker */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-sm text-text-secondary\">\n {translate('brainyrich.reports.statement.for', 'Statement for')}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Users className=\"size-4\" aria-hidden=\"true\" />\n {activeHousehold.name}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-h-72 overflow-y-auto\">\n {households.map((h) => (\n <DropdownMenuItem key={h.id} onSelect={() => onSelect(h.id)}>\n {h.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {accountsQuery.isLoading ? (\n <Card>\n <CardContent className=\"p-6\">\n <LoadingState rows={3} />\n </CardContent>\n </Card>\n ) : accountsQuery.isError ? (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => accountsQuery.refetch()} />\n </CardContent>\n </Card>\n ) : (\n <FadeIn>\n <GlassCard glow className=\"space-y-6\">\n {/* Branded header */}\n <div className=\"flex items-start justify-between gap-4 border-b border-border-subtle pb-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-xl bg-[var(--color-action-primary-bg)] text-sm font-bold text-[var(--color-action-primary-text)]\">\n BR\n </div>\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {activeHousehold.name}\n </h2>\n <p className=\"text-xs text-text-secondary\">\n {translate('brainyrich.reports.statement.subtitle', 'Wealth Statement')} ·{' '}\n {asOf}\n </p>\n </div>\n </div>\n <Badge variant={statusBadgeVariant(activeHousehold.status)}>\n {activeHousehold.status}\n </Badge>\n </div>\n\n {/* Net worth + allocation */}\n <div className=\"grid gap-6 md:grid-cols-2\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.netWorth', 'Net Worth')}\n </p>\n <p className=\"mt-1 text-3xl font-semibold tracking-tight text-text-primary\">\n {formatMoney(statement.netWorth, currency)}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-2 text-xs text-text-secondary\">\n <span>\n {translate('brainyrich.reports.netWorth.invested', 'Invested')}{' '}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(statement.invested, currency)}\n </span>\n </span>\n <span>·</span>\n <span>\n {translate('brainyrich.reports.netWorth.cash', 'Cash')}{' '}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(statement.cash, currency)}\n </span>\n </span>\n </div>\n {netSeries.length > 1 ? (\n <Sparkline data={netSeries} height={44} className=\"mt-4\" />\n ) : null}\n </div>\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.allocation', 'Asset Allocation')}\n </p>\n {statement.allocation.length > 0 ? (\n <DonutChart\n data={statement.allocation}\n height={200}\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </div>\n </div>\n\n {/* Holdings schedule */}\n {holdings.length > 0 ? (\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.holdings', 'Holdings Schedule')}\n </p>\n <div className=\"overflow-x-auto rounded-lg border border-border-subtle\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.holdings.symbol', 'Symbol')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((h) => (\n <TableRow key={h.id} className=\"transition-colors hover:bg-bg-elevated/60\">\n <TableCell>\n <div className=\"font-medium text-text-primary\">{h.symbol}</div>\n {h.name ? (\n <div className=\"text-xs text-text-secondary\">{h.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{assetClassLabel(h.assetClass)}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {h.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(h.marketValue, h.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n ) : null}\n\n {/* Progress to goals */}\n {goals.length > 0 ? (\n <div>\n <p className=\"mb-3 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.goals', 'Progress-to-Goals')}\n </p>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {goals.map((g) => (\n <GoalProgressCard\n key={g.id}\n goal={g}\n accountValues={statement.accountValues}\n translate={translate}\n />\n ))}\n </div>\n </div>\n ) : null}\n\n {/* Footer */}\n <p className=\"border-t border-border-subtle pt-4 text-center text-xs text-text-secondary\">\n {translate('brainyrich.reports.statement.footer', 'BrainyRich · Confidential')}\n </p>\n </GlassCard>\n </FadeIn>\n )}\n </div>\n );\n}\n\n/**\n * One goal's progress ring. Funded amount is derived from the goal's REAL\n * fundings: a fixed amount when set, otherwise the funding's allocation\n * percentage applied to that account's total value (cash + holdings).\n */\nfunction GoalProgressCard({\n goal,\n accountValues,\n translate,\n}: {\n goal: BraGoal;\n accountValues: Map<string, number>;\n translate: Translate;\n}) {\n const fundings = useGoalFundings(goal.id);\n const funded = useMemo(\n () =>\n fundings.data.reduce((sum, f) => {\n if (f.fixedAmount != null) return sum + f.fixedAmount;\n const value = accountValues.get(f.accountId) ?? 0;\n return sum + (f.allocationPct / 100) * value;\n }, 0),\n [fundings.data, accountValues]\n );\n const pct = goal.targetAmount > 0 ? Math.min(100, (funded / goal.targetAmount) * 100) : 0;\n\n return (\n <div className=\"flex flex-col items-center gap-2 rounded-xl border border-border-subtle bg-bg-surface p-4 text-center transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <ProgressRing value={pct} tone={projectionTone(goal.projection)} size={104} />\n <div className=\"flex items-center gap-1.5\">\n <Target className=\"size-3.5 text-text-secondary\" aria-hidden=\"true\" />\n <span className=\"text-sm font-medium text-text-primary\">{goal.name}</span>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {formatMoney(funded, goal.currency)} / {formatMoney(goal.targetAmount, goal.currency)}\n </p>\n <Badge variant={statusBadgeVariant(goal.projection)}>\n {translate(\n `brainyrich.goals.projection.${goal.projection}`,\n goal.projection.replace(/_/g, ' ')\n )}\n </Badge>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../src/brainyrich/pages/ReportsPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport {\n FileText,\n Printer,\n Download,\n Wallet,\n Layers,\n Receipt,\n ChevronDown,\n Users,\n Target,\n TrendingUp,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useBrainyRich } from '../providers/BrainyRichProvider';\nimport {\n useNetWorthSummary,\n useAllTransactions,\n fetchAllAccounts,\n fetchAllHoldings,\n useHouseholds,\n useAccounts,\n useGoals,\n useGoalFundings,\n} from '../hooks/useBrainyRichApi';\nimport type {\n BraHolding,\n BraTransaction,\n BraHousehold,\n BraAccount,\n BraGoal,\n BraGoalProjection,\n BraTransactionType,\n} from '../types/bra';\nimport {\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatCompact,\n formatDate,\n deltaToneClass,\n statusBadgeVariant,\n} from './_shared';\nimport {\n DonutChart,\n StatTile,\n TrendBars,\n Sparkline,\n ProgressRing,\n GlassCard,\n FadeIn,\n type VizTone,\n} from '../components/viz';\n\ntype Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\ntype StatementView = 'networth' | 'holdings' | 'transactions' | 'statement';\n\n/** Minimal read-query surface the statement sub-cards need for their states. */\ninterface QueryStatus {\n isLoading: boolean;\n isError: boolean;\n refetch: () => void;\n}\n\n// ============================================================================\n// Asset-class presentation (labels + semantic tones) — display only\n// ============================================================================\n\nconst ASSET_CLASS_LABEL: Record<string, string> = {\n EQUITY: 'Equity',\n FIXED_INCOME: 'Fixed Income',\n CASH: 'Cash',\n REAL_ESTATE: 'Real Estate',\n COMMODITY: 'Commodity',\n CRYPTO: 'Crypto',\n ALTERNATIVE: 'Alternatives',\n};\n\nconst ASSET_CLASS_TONE: Record<string, VizTone> = {\n EQUITY: 'brand',\n FIXED_INCOME: 'blue',\n CASH: 'teal',\n REAL_ESTATE: 'warning',\n COMMODITY: 'indigo',\n CRYPTO: 'purple',\n ALTERNATIVE: 'info',\n};\n\nfunction assetClassLabel(ac: string): string {\n return ASSET_CLASS_LABEL[ac] ?? ac.replace(/_/g, ' ');\n}\n\n// ============================================================================\n// Cash-flow derivation — REAL ledger rows bucketed by month\n// ----------------------------------------------------------------------------\n// Inflow = money arriving (deposits, dividends, interest, sale proceeds).\n// Outflow = money leaving (withdrawals, fees, buys). TRANSFER is treated as\n// balance-neutral. Every value comes straight from recorded transactions.\n// ============================================================================\n\nconst INFLOW_TYPES: BraTransactionType[] = ['DEPOSIT', 'DIVIDEND', 'INTEREST', 'SELL'];\nconst OUTFLOW_TYPES: BraTransactionType[] = ['WITHDRAWAL', 'FEE', 'BUY'];\n\nfunction monthKey(iso: string): string | null {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return null;\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;\n}\n\nfunction monthLabel(key: string): string {\n const [y, m] = key.split('-').map(Number);\n return new Intl.DateTimeFormat('en-US', { month: 'short' }).format(new Date(y, m - 1, 1));\n}\n\ninterface CashflowDatum {\n label: string;\n inflow: number;\n outflow: number;\n}\n\nfunction buildCashflow(\n txns: BraTransaction[],\n months = 6\n): { bars: CashflowDatum[]; netSeries: number[] } {\n const map = new Map<string, { inflow: number; outflow: number }>();\n for (const t of txns) {\n const k = monthKey(t.tradeDate);\n if (!k) continue;\n const bucket = map.get(k) ?? { inflow: 0, outflow: 0 };\n const amt = Math.abs(t.amount);\n if (INFLOW_TYPES.includes(t.type)) bucket.inflow += amt;\n else if (OUTFLOW_TYPES.includes(t.type)) bucket.outflow += amt;\n map.set(k, bucket);\n }\n const recent = Array.from(map.keys()).sort().slice(-months);\n const bars = recent.map((k) => {\n const b = map.get(k)!;\n return { label: monthLabel(k), inflow: b.inflow, outflow: b.outflow };\n });\n let run = 0;\n const netSeries = recent.map((k) => {\n const b = map.get(k)!;\n run += b.inflow - b.outflow;\n return run;\n });\n return { bars, netSeries };\n}\n\nfunction cashflowTotals(txns: BraTransaction[]): { inflow: number; outflow: number; net: number } {\n let inflow = 0;\n let outflow = 0;\n for (const t of txns) {\n const a = Math.abs(t.amount);\n if (INFLOW_TYPES.includes(t.type)) inflow += a;\n else if (OUTFLOW_TYPES.includes(t.type)) outflow += a;\n }\n return { inflow, outflow, net: inflow - outflow };\n}\n\n// ============================================================================\n// Statement math — net worth composition for a set of accounts + their holdings\n// ============================================================================\n\ninterface StatementData {\n netWorth: number;\n invested: number;\n cash: number;\n allocation: { label: string; value: number; tone?: VizTone }[];\n /** Per-account total value (cash + holdings) — used to resolve goal funding %. */\n accountValues: Map<string, number>;\n}\n\nfunction computeStatement(accounts: BraAccount[], holdings: BraHolding[]): StatementData {\n const accountValues = new Map<string, number>();\n let cash = 0;\n for (const a of accounts) {\n accountValues.set(a.id, a.cashBalance);\n cash += a.cashBalance;\n }\n let invested = 0;\n const byClass = new Map<string, number>();\n for (const h of holdings) {\n invested += h.marketValue;\n byClass.set(h.assetClass, (byClass.get(h.assetClass) ?? 0) + h.marketValue);\n accountValues.set(h.accountId, (accountValues.get(h.accountId) ?? 0) + h.marketValue);\n }\n const allocation = Array.from(byClass.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([ac, v]) => ({ label: assetClassLabel(ac), value: v, tone: ASSET_CLASS_TONE[ac] }));\n return { netWorth: cash + invested, invested, cash, allocation, accountValues };\n}\n\nfunction projectionTone(p: BraGoalProjection): VizTone {\n switch (p) {\n case 'AHEAD':\n return 'success';\n case 'BEHIND':\n return 'warning';\n case 'AT_RISK':\n return 'error';\n default:\n return 'brand';\n }\n}\n\n// ============================================================================\n// CSV helpers — client-side export built from REAL rows only\n// ============================================================================\n\nfunction toCsv(headers: string[], rows: (string | number)[][]): string {\n const escape = (cell: string | number) => {\n const s = String(cell ?? '');\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n return [headers, ...rows].map((row) => row.map(escape).join(',')).join('\\n');\n}\n\nfunction downloadCsv(filename: string, csv: string) {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'household'\n );\n}\n\n// ============================================================================\n// Full holdings schedule\n// ----------------------------------------------------------------------------\n// `braListPortfolios`/`braListAccounts` never inline `holdings`, and\n// `braListHoldings` is scoped to a single account/portfolio AND paginated\n// (default page size 50). To build a COMPLETE holdings schedule (every\n// position, not a truncated first page) we enumerate the full account set via\n// the foundation `fetchAllAccounts` pager, then page through each account's\n// holdings via `fetchAllHoldings` and flatten. Real server rows only — no\n// fabrication.\n// ============================================================================\n\nfunction useAllHoldings() {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: ['brainyrich', 'holdings', 'report-all'],\n queryFn: async () => {\n const accounts = await fetchAllAccounts(apiGatewayUrl);\n const perAccount = await Promise.all(\n accounts.map((account) => fetchAllHoldings(apiGatewayUrl, { accountId: account.id }))\n );\n return perAccount.flat();\n },\n });\n return { ...query, data: query.data ?? [] };\n}\n\n// ============================================================================\n// Reports page — real, generatable statement views\n// (net worth / holdings / ledger / client statement)\n// ============================================================================\n\nexport function ReportsPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const [view, setView] = useState<StatementView>('networth');\n const [selectedHouseholdId, setSelectedHouseholdId] = useState<string | undefined>();\n\n const summaryQuery = useNetWorthSummary();\n // Aggregation sources: page through the FULL set so statements + CSV cover\n // every holding and every ledger entry, not a truncated first page.\n const holdingsQuery = useAllHoldings();\n const transactionsQuery = useAllTransactions();\n const householdsQuery = useHouseholds();\n\n const summary = summaryQuery.data;\n const currency = summary?.currency ?? 'USD';\n const households = householdsQuery.data;\n\n // Active household for the Client Statement (defaults to the first one).\n const activeHouseholdId = selectedHouseholdId ?? households[0]?.id;\n const activeHousehold = households.find((h) => h.id === activeHouseholdId);\n\n // Household-scoped sources. React-Query dedupes these against the statement\n // sub-tree, so passing an id here does not double-fetch.\n const householdAccountsQuery = useAccounts({ householdId: activeHouseholdId });\n const householdGoalsQuery = useGoals({ householdId: activeHouseholdId });\n const householdAccounts = householdAccountsQuery.data;\n const householdGoals = householdGoalsQuery.data;\n\n // Holdings schedule: every holding across every account, richest first.\n const holdings: BraHolding[] = useMemo(\n () => holdingsQuery.data.slice().sort((a, b) => b.marketValue - a.marketValue),\n [holdingsQuery.data]\n );\n\n const transactions: BraTransaction[] = useMemo(\n () =>\n transactionsQuery.data\n .slice()\n .sort((a, b) => new Date(b.tradeDate).getTime() - new Date(a.tradeDate).getTime()),\n [transactionsQuery.data]\n );\n\n const cashflow = useMemo(() => buildCashflow(transactions), [transactions]);\n\n // Household slices for the statement (built from already-loaded page data).\n const householdAccountIds = useMemo(\n () => new Set(householdAccounts.map((a) => a.id)),\n [householdAccounts]\n );\n const householdHoldings = useMemo(\n () =>\n holdings\n .filter((h) => householdAccountIds.has(h.accountId))\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue),\n [holdings, householdAccountIds]\n );\n const householdTxns = useMemo(\n () => transactions.filter((tx) => householdAccountIds.has(tx.accountId)),\n [transactions, householdAccountIds]\n );\n const statementData = useMemo(\n () => computeStatement(householdAccounts, householdHoldings),\n [householdAccounts, householdHoldings]\n );\n\n // Header KPIs — premium tiles, net worth carrying an emerald glow + a real\n // cumulative net-cash-flow spark (decorative, aria-hidden inside StatTile).\n const holdingsUnrealized = useMemo(\n () => holdings.reduce((sum, h) => sum + (h.marketValue - h.costBasis), 0),\n [holdings]\n );\n\n // Primary \"Print / Export\" action for the currently selected statement.\n // Each branch emits the COMPLETE dataset (full holdings / full ledger).\n const exportCurrent = () => {\n if (view === 'networth') {\n if (!summary) return;\n const headers = ['Metric', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Total Net Worth', summary.totalNetWorth, currency],\n ['Total Market Value', summary.totalMarketValue, currency],\n ['Total Cash', summary.totalCash, currency],\n ['Account Count', summary.accountCount, ''],\n ...summary.byAssetClass.map((row) => [\n `Asset Class: ${assetClassLabel(row.assetClass)}`,\n row.marketValue,\n currency,\n ]),\n ];\n downloadCsv('brainyrich-net-worth-statement.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'holdings') {\n const headers = [\n 'Symbol',\n 'Name',\n 'Asset Class',\n 'Quantity',\n 'Cost Basis',\n 'Market Value',\n 'Currency',\n ];\n const rows = holdings.map((h) => [\n h.symbol,\n h.name ?? '',\n assetClassLabel(h.assetClass),\n h.quantity,\n h.costBasis,\n h.marketValue,\n h.currency,\n ]);\n downloadCsv('brainyrich-holdings-schedule.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'statement') {\n if (!activeHousehold) return;\n const cur = activeHousehold.currency ?? currency;\n const headers = ['Section', 'Label', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Summary', 'Net Worth', statementData.netWorth, cur],\n ['Summary', 'Invested Value', statementData.invested, cur],\n ['Summary', 'Cash & Liquidity', statementData.cash, cur],\n ...statementData.allocation.map((a) => ['Allocation', a.label, a.value, cur]),\n ...householdHoldings.map((h) => [\n 'Holding',\n `${h.symbol}${h.name ? ` — ${h.name}` : ''}`,\n h.marketValue,\n h.currency,\n ]),\n ...householdGoals.map((g) => ['Goal', g.name, g.targetAmount, g.currency]),\n ];\n downloadCsv(\n `brainyrich-${slugify(activeHousehold.name)}-statement.csv`,\n toCsv(headers, rows)\n );\n return;\n }\n const headers = [\n 'Trade Date',\n 'Type',\n 'Symbol',\n 'Quantity',\n 'Price',\n 'Amount',\n 'Fee',\n 'Currency',\n ];\n const rows = transactions.map((tx) => [\n formatDate(tx.tradeDate),\n tx.type,\n tx.symbol ?? '',\n tx.quantity,\n tx.price,\n tx.amount,\n tx.fee,\n tx.currency,\n ]);\n downloadCsv('brainyrich-transaction-ledger.csv', toCsv(headers, rows));\n };\n\n // The export action only produces a file for a statement that actually has\n // rows; disable it while the active statement is still loading / empty.\n const exportDisabled =\n (view === 'networth' && (summaryQuery.isLoading || !summary)) ||\n (view === 'holdings' && (holdingsQuery.isLoading || holdings.length === 0)) ||\n (view === 'transactions' && (transactionsQuery.isLoading || transactions.length === 0)) ||\n (view === 'statement' && (!activeHousehold || householdAccountsQuery.isLoading));\n\n return (\n <SectionShell\n title={translate('brainyrich.reports.title', 'Reports & Statements')}\n description={translate(\n 'brainyrich.reports.description',\n 'Generate statements directly from your live portfolio data — no fabricated schedules.'\n )}\n actions={\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"sm\"\n disabled={exportDisabled}\n aria-label={translate('brainyrich.reports.actions.export', 'Print / Export')}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.export', 'Print / Export')}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={exportCurrent}>\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.downloadCsv', 'Download CSV')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => window.print()}>\n <Printer className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.print', 'Print statement')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n }\n >\n <FadeIn>\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label={translate('brainyrich.reports.kpis.netWorth', 'Net Worth')}\n value={summary ? formatMoney(summary.totalNetWorth, currency) : '—'}\n spark={cashflow.netSeries}\n glow\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.marketValue', 'Invested Value')}\n value={summary ? formatMoney(summary.totalMarketValue, currency) : '—'}\n icon={<TrendingUp className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.holdings', 'Holdings on Schedule')}\n value={String(holdings.length)}\n icon={<Layers className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.transactions', 'Ledger Entries')}\n value={String(transactions.length)}\n icon={<Receipt className=\"size-4\" aria-hidden=\"true\" />}\n />\n </div>\n </FadeIn>\n\n <Tabs value={view} onValueChange={(value) => setView(value as StatementView)}>\n <TabsList>\n <TabsTrigger value=\"networth\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.netWorth', 'Net Worth')}\n </TabsTrigger>\n <TabsTrigger value=\"holdings\">\n <Layers className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.holdings', 'Holdings')}\n </TabsTrigger>\n <TabsTrigger value=\"transactions\">\n <Receipt className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.ledger', 'Ledger')}\n </TabsTrigger>\n <TabsTrigger value=\"statement\">\n <Users className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.statement', 'Client Statement')}\n </TabsTrigger>\n </TabsList>\n </Tabs>\n\n {view === 'networth' ? (\n <NetWorthStatement\n query={summaryQuery}\n cashflow={cashflow.bars}\n netSeries={cashflow.netSeries}\n translate={translate}\n />\n ) : view === 'holdings' ? (\n <HoldingsSchedule\n query={holdingsQuery}\n holdings={holdings}\n unrealized={holdingsUnrealized}\n translate={translate}\n />\n ) : view === 'transactions' ? (\n <TransactionLedger\n query={transactionsQuery}\n transactions={transactions}\n cashflow={cashflow.bars}\n currency={currency}\n translate={translate}\n />\n ) : (\n <ClientStatementPanel\n householdsQuery={householdsQuery}\n households={households}\n activeHousehold={activeHousehold}\n onSelect={setSelectedHouseholdId}\n accountsQuery={householdAccountsQuery}\n goals={householdGoals}\n holdings={householdHoldings}\n transactions={householdTxns}\n statement={statementData}\n translate={translate}\n />\n )}\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Net-worth statement — hero figure + allocation donut + asset-class schedule\n// ============================================================================\n\nfunction NetWorthStatement({\n query,\n cashflow,\n netSeries,\n translate,\n}: {\n query: ReturnType<typeof useNetWorthSummary>;\n cashflow: CashflowDatum[];\n netSeries: number[];\n translate: Translate;\n}) {\n const summary = query.data;\n const currency = summary?.currency ?? 'USD';\n\n const allocation = useMemo(() => {\n if (!summary) return [];\n return summary.byAssetClass\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue)\n .map((row) => ({\n label: assetClassLabel(row.assetClass),\n value: row.marketValue,\n tone: ASSET_CLASS_TONE[row.assetClass],\n }));\n }, [summary]);\n\n if (query.isLoading) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <LoadingState rows={3} />\n </CardContent>\n </Card>\n );\n }\n if (query.isError) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => query.refetch()} />\n </CardContent>\n </Card>\n );\n }\n if (!summary) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <EmptyState\n icon={<Wallet className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.netWorth.emptyTitle', 'No net-worth data yet')}\n description={translate(\n 'brainyrich.reports.netWorth.emptyDesc',\n 'Link an account and add holdings to generate a net-worth statement.'\n )}\n />\n </CardContent>\n </Card>\n );\n }\n\n const asOf = translate('brainyrich.reports.netWorth.asOf', 'as of {date}', {\n date: formatDate(new Date().toISOString()),\n });\n\n return (\n <div className=\"space-y-6\">\n <div className=\"grid gap-6 lg:grid-cols-[1.1fr_1fr]\">\n {/* Hero net-worth figure with emerald glow + real cumulative-flow spark */}\n <FadeIn>\n <GlassCard glow className=\"h-full\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.netWorth.title', 'Net Worth Statement')} — {asOf}\n </p>\n <p className=\"mt-2 text-4xl font-semibold tracking-tight text-text-primary\">\n {formatMoney(summary.totalNetWorth, currency)}\n </p>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.invested', 'Invested')}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(summary.totalMarketValue, currency)}\n </span>\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.cash', 'Cash')}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(summary.totalCash, currency)}\n </span>\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.accounts', 'Accounts')}\n <span className=\"font-medium text-text-primary\">{summary.accountCount}</span>\n </span>\n </div>\n {netSeries.length > 1 ? (\n <div className=\"mt-5\">\n <p className=\"mb-1 text-[11px] text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.netFlow',\n 'Cumulative net cash flow (recent months)'\n )}\n </p>\n <Sparkline data={netSeries} height={48} />\n </div>\n ) : null}\n </GlassCard>\n </FadeIn>\n\n {/* Allocation donut */}\n <FadeIn index={1}>\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle className=\"text-base\">\n {translate('brainyrich.reports.netWorth.allocation', 'Allocation by Asset Class')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {allocation.length > 0 ? (\n <DonutChart\n data={allocation}\n centerLabel={translate('brainyrich.reports.netWorth.invested', 'Invested')}\n centerValue={formatCompact(summary.totalMarketValue, currency)}\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n\n {/* Asset-class schedule (statement table) */}\n <FadeIn index={2}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.netWorth.schedule', 'By Asset Class')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {allocation.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.netWorth.assetClass', 'Asset class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.netWorth.total', 'Total')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {allocation.map((row) => (\n <TableRow\n key={row.label}\n className=\"transition-colors hover:bg-bg-elevated/60\"\n >\n <TableCell className=\"font-medium text-text-primary\">{row.label}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(row.value, currency)}\n </TableCell>\n </TableRow>\n ))}\n <TableRow>\n <TableCell className=\"font-semibold text-text-primary\">\n {translate('brainyrich.reports.netWorth.totals', 'Totals')}\n </TableCell>\n <TableCell className=\"text-right font-semibold tabular-nums text-status-success-text\">\n {formatMoney(summary.totalMarketValue, currency)}\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n\n {/* Cash flow */}\n {cashflow.length > 0 ? (\n <FadeIn index={3}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.cashflow.title', 'Cash Flow')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.cashflow.description',\n 'Inflows and outflows recorded on your ledger, by month.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <TrendBars data={cashflow} valueFormatter={(v) => formatCompact(v, currency)} />\n </CardContent>\n </Card>\n </FadeIn>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// Holdings schedule\n// ============================================================================\n\nfunction HoldingsSchedule({\n query,\n holdings,\n unrealized,\n translate,\n}: {\n query: QueryStatus;\n holdings: BraHolding[];\n unrealized: number;\n translate: Translate;\n}) {\n const marketValue = holdings.reduce((sum, h) => sum + h.marketValue, 0);\n const costBasis = holdings.reduce((sum, h) => sum + h.costBasis, 0);\n const currency = holdings[0]?.currency ?? 'USD';\n\n return (\n <div className=\"space-y-6\">\n {!query.isLoading && !query.isError && holdings.length > 0 ? (\n <FadeIn>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatTile\n label={translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n value={formatMoney(marketValue, currency)}\n glow\n />\n <StatTile\n label={translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n value={formatMoney(costBasis, currency)}\n />\n <StatTile\n label={translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n value={formatMoney(unrealized, currency)}\n delta={costBasis > 0 ? (unrealized / costBasis) * 100 : undefined}\n sparkTone={unrealized >= 0 ? 'success' : 'error'}\n />\n </div>\n </FadeIn>\n ) : null}\n\n <FadeIn index={1}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Layers className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.holdings.title', 'Holdings Schedule')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.holdings.description',\n 'Every position across your portfolios with cost basis and market value.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : holdings.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.holdings.symbol', 'Symbol')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((holding) => {\n const gain = holding.marketValue - holding.costBasis;\n return (\n <TableRow\n key={holding.id}\n className=\"transition-colors hover:bg-bg-elevated/60\"\n >\n <TableCell>\n <div className=\"font-medium text-text-primary\">{holding.symbol}</div>\n {holding.name ? (\n <div className=\"text-xs text-text-secondary\">{holding.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{assetClassLabel(holding.assetClass)}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {holding.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.costBasis, holding.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.marketValue, holding.currency)}\n </TableCell>\n <TableCell\n className={`text-right tabular-nums font-medium ${deltaToneClass(gain)}`}\n >\n {gain > 0 ? '+' : ''}\n {formatMoney(gain, holding.currency)}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<Layers className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.holdings.emptyTitle', 'No holdings on file')}\n description={translate(\n 'brainyrich.reports.holdings.emptyDesc',\n 'Add holdings to your portfolios to generate a holdings schedule.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n );\n}\n\n// ============================================================================\n// Transaction ledger\n// ============================================================================\n\nfunction TransactionLedger({\n query,\n transactions,\n cashflow,\n currency,\n translate,\n}: {\n query: QueryStatus;\n transactions: BraTransaction[];\n cashflow: CashflowDatum[];\n currency: string;\n translate: Translate;\n}) {\n const totals = useMemo(() => cashflowTotals(transactions), [transactions]);\n const showSummary = !query.isLoading && !query.isError && transactions.length > 0;\n\n return (\n <div className=\"space-y-6\">\n {showSummary ? (\n <FadeIn>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatTile\n label={translate('brainyrich.reports.ledger.inflow', 'Total Inflow')}\n value={formatMoney(totals.inflow, currency)}\n sparkTone=\"success\"\n />\n <StatTile\n label={translate('brainyrich.reports.ledger.outflow', 'Total Outflow')}\n value={formatMoney(totals.outflow, currency)}\n sparkTone=\"error\"\n />\n <StatTile\n label={translate('brainyrich.reports.ledger.net', 'Net Flow')}\n value={formatMoney(totals.net, currency)}\n glow={totals.net >= 0}\n delta={totals.inflow > 0 ? (totals.net / totals.inflow) * 100 : undefined}\n />\n </div>\n </FadeIn>\n ) : null}\n\n {showSummary && cashflow.length > 0 ? (\n <FadeIn index={1}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.cashflow.title', 'Cash Flow')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <TrendBars data={cashflow} valueFormatter={(v) => formatCompact(v, currency)} />\n </CardContent>\n </Card>\n </FadeIn>\n ) : null}\n\n <FadeIn index={2}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Receipt className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.ledger.title', 'Transaction Ledger')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.ledger.description',\n 'Every recorded transaction across your accounts, newest first.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : transactions.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.ledger.date', 'Trade Date')}\n </TableHead>\n <TableHead>{translate('brainyrich.reports.ledger.type', 'Type')}</TableHead>\n <TableHead>\n {translate('brainyrich.reports.ledger.symbol', 'Symbol')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.price', 'Price')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.amount', 'Amount')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {transactions.map((tx) => (\n <TableRow key={tx.id} className=\"transition-colors hover:bg-bg-elevated/60\">\n <TableCell className=\"text-text-primary\">\n {formatDate(tx.tradeDate)}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{tx.type}</Badge>\n </TableCell>\n <TableCell className=\"text-text-primary\">{tx.symbol ?? '—'}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {tx.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.price, tx.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.amount, tx.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<FileText className=\"size-6\" aria-hidden=\"true\" />}\n title={translate(\n 'brainyrich.reports.ledger.emptyTitle',\n 'No transactions recorded'\n )}\n description={translate(\n 'brainyrich.reports.ledger.emptyDesc',\n 'Record transactions on your accounts to build a ledger statement.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n );\n}\n\n// ============================================================================\n// Client statement — branded, per-household wealth statement (real data)\n// ============================================================================\n\nfunction ClientStatementPanel({\n householdsQuery,\n households,\n activeHousehold,\n onSelect,\n accountsQuery,\n goals,\n holdings,\n transactions,\n statement,\n translate,\n}: {\n householdsQuery: QueryStatus;\n households: BraHousehold[];\n activeHousehold: BraHousehold | undefined;\n onSelect: (id: string) => void;\n accountsQuery: QueryStatus;\n goals: BraGoal[];\n holdings: BraHolding[];\n transactions: BraTransaction[];\n statement: StatementData;\n translate: Translate;\n}) {\n if (householdsQuery.isLoading) {\n return (\n <Card>\n <CardContent className=\"space-y-3 p-6\">\n <Skeleton className=\"h-8 w-64\" />\n <Skeleton className=\"h-40 w-full\" />\n </CardContent>\n </Card>\n );\n }\n if (householdsQuery.isError) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => householdsQuery.refetch()} />\n </CardContent>\n </Card>\n );\n }\n if (households.length === 0 || !activeHousehold) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <EmptyState\n icon={<Users className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.statement.emptyTitle', 'No households yet')}\n description={translate(\n 'brainyrich.reports.statement.emptyDesc',\n 'Create a household to generate a branded client wealth statement.'\n )}\n />\n </CardContent>\n </Card>\n );\n }\n\n const currency = activeHousehold.currency ?? 'USD';\n const netSeries = buildCashflow(transactions).netSeries;\n const asOf = formatDate(new Date().toISOString());\n\n return (\n <div className=\"space-y-4\">\n {/* Household picker */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-sm text-text-secondary\">\n {translate('brainyrich.reports.statement.for', 'Statement for')}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Users className=\"size-4\" aria-hidden=\"true\" />\n {activeHousehold.name}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-h-72 overflow-y-auto\">\n {households.map((h) => (\n <DropdownMenuItem key={h.id} onSelect={() => onSelect(h.id)}>\n {h.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {accountsQuery.isLoading ? (\n <Card>\n <CardContent className=\"p-6\">\n <LoadingState rows={3} />\n </CardContent>\n </Card>\n ) : accountsQuery.isError ? (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => accountsQuery.refetch()} />\n </CardContent>\n </Card>\n ) : (\n <FadeIn>\n <GlassCard glow className=\"space-y-6\">\n {/* Branded header */}\n <div className=\"flex items-start justify-between gap-4 border-b border-border-subtle pb-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-xl bg-[var(--color-action-primary-bg)] text-sm font-bold text-[var(--color-action-primary-text)]\">\n BR\n </div>\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {activeHousehold.name}\n </h2>\n <p className=\"text-xs text-text-secondary\">\n {translate('brainyrich.reports.statement.subtitle', 'Wealth Statement')} ·{' '}\n {asOf}\n </p>\n </div>\n </div>\n <Badge variant={statusBadgeVariant(activeHousehold.status)}>\n {activeHousehold.status}\n </Badge>\n </div>\n\n {/* Net worth + allocation */}\n <div className=\"grid gap-6 md:grid-cols-2\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.netWorth', 'Net Worth')}\n </p>\n <p className=\"mt-1 text-3xl font-semibold tracking-tight text-text-primary\">\n {formatMoney(statement.netWorth, currency)}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-2 text-xs text-text-secondary\">\n <span>\n {translate('brainyrich.reports.netWorth.invested', 'Invested')}{' '}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(statement.invested, currency)}\n </span>\n </span>\n <span>·</span>\n <span>\n {translate('brainyrich.reports.netWorth.cash', 'Cash')}{' '}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(statement.cash, currency)}\n </span>\n </span>\n </div>\n {netSeries.length > 1 ? (\n <Sparkline data={netSeries} height={44} className=\"mt-4\" />\n ) : null}\n </div>\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.allocation', 'Asset Allocation')}\n </p>\n {statement.allocation.length > 0 ? (\n <DonutChart\n data={statement.allocation}\n height={200}\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </div>\n </div>\n\n {/* Holdings schedule */}\n {holdings.length > 0 ? (\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.holdings', 'Holdings Schedule')}\n </p>\n <div className=\"overflow-x-auto rounded-lg border border-border-subtle\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.holdings.symbol', 'Symbol')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((h) => (\n <TableRow key={h.id} className=\"transition-colors hover:bg-bg-elevated/60\">\n <TableCell>\n <div className=\"font-medium text-text-primary\">{h.symbol}</div>\n {h.name ? (\n <div className=\"text-xs text-text-secondary\">{h.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{assetClassLabel(h.assetClass)}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {h.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(h.marketValue, h.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n ) : null}\n\n {/* Progress to goals */}\n {goals.length > 0 ? (\n <div>\n <p className=\"mb-3 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.goals', 'Progress-to-Goals')}\n </p>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {goals.map((g) => (\n <GoalProgressCard\n key={g.id}\n goal={g}\n accountValues={statement.accountValues}\n translate={translate}\n />\n ))}\n </div>\n </div>\n ) : null}\n\n {/* Footer */}\n <p className=\"border-t border-border-subtle pt-4 text-center text-xs text-text-secondary\">\n {translate('brainyrich.reports.statement.footer', 'BrainyRich · Confidential')}\n </p>\n </GlassCard>\n </FadeIn>\n )}\n </div>\n );\n}\n\n/**\n * One goal's progress ring. Funded amount is derived from the goal's REAL\n * fundings: a fixed amount when set, otherwise the funding's allocation\n * percentage applied to that account's total value (cash + holdings).\n */\nfunction GoalProgressCard({\n goal,\n accountValues,\n translate,\n}: {\n goal: BraGoal;\n accountValues: Map<string, number>;\n translate: Translate;\n}) {\n const fundings = useGoalFundings(goal.id);\n const funded = useMemo(\n () =>\n fundings.data.reduce((sum, f) => {\n if (f.fixedAmount != null) return sum + f.fixedAmount;\n const value = accountValues.get(f.accountId) ?? 0;\n return sum + (f.allocationPct / 100) * value;\n }, 0),\n [fundings.data, accountValues]\n );\n const pct = goal.targetAmount > 0 ? Math.min(100, (funded / goal.targetAmount) * 100) : 0;\n\n return (\n <div className=\"flex flex-col items-center gap-2 rounded-xl border border-border-subtle bg-bg-surface p-4 text-center transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <ProgressRing value={pct} tone={projectionTone(goal.projection)} size={104} />\n <div className=\"flex items-center gap-1.5\">\n <Target className=\"size-3.5 text-text-secondary\" aria-hidden=\"true\" />\n <span className=\"text-sm font-medium text-text-primary\">{goal.name}</span>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {formatMoney(funded, goal.currency)} / {formatMoney(goal.targetAmount, goal.currency)}\n </p>\n <Badge variant={statusBadgeVariant(goal.projection)}>\n {translate(\n `brainyrich.goals.projection.${goal.projection}`,\n goal.projection.replace(/_/g, ' ')\n )}\n </Badge>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiskPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/RiskPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RiskPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/RiskPage.tsx"],"names":[],"mappings":"AA8QA,wBAAgB,QAAQ,4CA0wBvB"}
|