/** * Форматтеры биллинга — BillingView + TransactionsTable + InvoicesTable. * * Sprint 2 Plan C: status/format-функции (statusChipColor/statusLabel/ * formatLabel/formatIcon) удалены — real-API транзакции не имеют статуса * (append-only ledger), счета — отдельный формат. txAmountClass * перетипизирован под знак суммы. */ /** «5000» → «5 000 ₽» (без знака). */ export function formatPlain(cost: number): string { return new Intl.NumberFormat('ru-RU').format(cost) + ' ₽'; } /** Знаковый формат: «+ 5 000 ₽» / «− 6 600 ₽» / «0 ₽». */ export function formatCost(cost: number): string { const sign = cost > 0 ? '+ ' : cost < 0 ? '− ' : ''; return sign + new Intl.NumberFormat('ru-RU').format(Math.abs(cost)) + ' ₽'; } /** CSS-класс суммы транзакции по знаку. */ export function txAmountClass(amount: number): string { if (amount > 0) return 'tx-amount-up'; if (amount < 0) return 'tx-amount-down'; return 'tx-amount-neutral'; } /** Человекочитаемые лейблы для feature-слагов tariff_plans.features. */ export const FEATURE_LABELS: Record = { webhook: 'Webhook', kanban: 'Канбан', basic_analytics: 'Базовая аналитика', advanced_analytics: 'Расширенная аналитика', api: 'API', '2fa': 'Двухфакторная аутентификация', custom_domain: 'Свой домен', }; /** Лейбл feature-слага; неизвестный слаг возвращается как есть. */ export function featureLabel(slug: string): string { return FEATURE_LABELS[slug] ?? slug; }