import { useState } from 'react' import { useNavigate } from 'react-router-dom' import { formatINR } from '@sims/domain' import { DataTable, EmptyState, ErrorState, Field, FilterChips, Skeleton, PageHeader } from '@sims/ui' import { getDuesAging, getModuleRevenue, getProfitability, getAwsRanking } from '../api' import { useData } from './Clients' const inr = (p: number) => formatINR(p, { symbol: false }) const prevMonth = (): string => { const d = new Date() return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() - 1, 1)).toISOString().slice(0, 7) } /** Reports — dues aging, module revenue, client profitability, and the AWS cost chart (spec §5–§6). */ export function Reports() { const nav = useNavigate() const [month, setMonth] = useState(prevMonth()) const [report, setReport] = useState<'dues' | 'revenue' | 'profit' | 'aws'>('dues') const dues = useData(getDuesAging, []) const revenue = useData(() => getModuleRevenue(), []) const profit = useData(() => getProfitability(), []) const ranking = useData(() => getAwsRanking(month), [month]) return (
setReport(k as typeof report)} chips={[ { key: 'dues', label: 'Dues aging' }, { key: 'revenue', label: 'Module revenue' }, { key: 'profit', label: 'Profitability' }, { key: 'aws', label: 'AWS costs' }, ]} /> {report === 'dues' && ( dues.error !== undefined ? : dues.data === undefined ? : dues.data.length === 0 ? No outstanding dues. : ( nav(`/clients/${dues.data![i]!.clientId}`)} rowTone={(i) => ((dues.data![i]!.b90p > 0) ? 'err' : dues.data![i]!.b61_90 > 0 ? 'warn' : undefined)} rows={dues.data.map((d) => ({ client: d.clientName, b1: inr(d.b0_30), b2: inr(d.b31_60), b3: inr(d.b61_90), b4: inr(d.b90p), total: inr(d.totalPaise), }))} /> ) )} {report === 'revenue' && ( revenue.error !== undefined ? : revenue.data === undefined ? : revenue.data.length === 0 ? No invoiced revenue yet. : ( ({ module: `${m.moduleName} (${m.moduleCode})`, billed: inr(m.billedPaise), settled: inr(m.settledPaise) }))} /> ) )} {report === 'profit' && ( profit.error !== undefined ? : profit.data === undefined ? : profit.data.length === 0 ? No client activity yet. : ( nav(`/clients/${profit.data![i]!.clientId}`)} rows={profit.data.map((p) => ({ client: p.clientName, billed: inr(p.billedPaise), settled: inr(p.settledPaise), aws: inr(p.awsCostPaise), margin: inr(p.marginPaise), }))} /> ) )} {report === 'aws' && ( <> setMonth(e.target.value)} /> {ranking.error !== undefined ? : ranking.data === undefined ? : ranking.data.rows.length === 0 ? No AWS cost recorded for {month}. : (
{ranking.data.rows.map((row) => (
nav(`/clients/${row.clientId}`)}>{row.clientName}
{inr(row.costPaise)}
{(row.sharePctBp / 100).toFixed(1)}%
))}
)} )}
) }