diff --git a/TODO.md b/TODO.md index d4f4a0e..91a1fca 100644 --- a/TODO.md +++ b/TODO.md @@ -647,11 +647,72 @@ docs/BILLING.md decisão documentada em docs/BILLING.md, não uma média ponderada - [ ] Reajuste de preço no meio de um período aberto (2 vigências sobrepostas de `PriceBookItem`/`RateDeckEntry`) nunca exercitado -- [ ] Sem UI de platform admin pra criar tenant/price book/rate deck - ainda (fase Frontend) — testado só via API direto +- [x] UI de platform admin pra price book/rate deck — PHASE 23. Ainda sem + UI pra criar tenant/plano/assinatura (não há nem endpoint de listagem + de tenants) — só via API/script direto. -## PHASE 23+ — ver `agente.md` seções 140 em diante (Frontend, Security, -Tests) +## PHASE 23 — Frontend: app shell, login, dashboard, Billing > Tarifas +(agente.md secao 161-176) +- [x] `apps/frontend` (Next.js 15 App Router, React 19, Tailwind, + TanStack Query/Table instalados mas não usados ainda, Recharts, + Lucide) — primeiro commit do frontend +- [x] Design tokens (secao 165) derivados do logo real: navy/azul/teal, + light+dark+system (`ThemeToggle`, classe em `` + + `localStorage`, lido antes do primeiro paint pra não piscar) +- [x] Login (secao 167): split brand/form, sessão em cookie httpOnly + (`/api/login`, `/api/logout`) — o access token nunca chega a + JS legível no browser (`apiFetch` só roda em Server + Component/Server Action, nunca no client) +- [x] Shell Platform (secao 166, 168): sidebar fixa colapsável + topbar + + conteúdo, IA completa dos 2 menus renderizada (itens sem página + viram "em breve", nunca link morto) — implementação de referência + do design system (Product Principle #5) +- [x] Dashboard "Visão Geral" (secao 163): `InstrumentTile` com leitura + tipo painel/instrumento (mono, tabular), `value === null` vira + traço fantasma com explicação (`pending`) em vez de fingir "0" — + nunca um número inventado (secao 138) +- [x] Billing > Tarifas (primeira tela CRUD real, contra a API de billing + da PHASE 22): price books + rate decks — listagem com busca/ + ordenação client-side, criação com itens/entradas dinâmicos via + Server Actions (`"use server"`, chamadas como função direto do + client component, não `