docs(todo): registra PHASE 23 (frontend: shell, login, dashboard, tarifas)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWHKmcVJtstQFErbZ1AanY
This commit is contained in:
2026-08-29 00:55:18 -03:00
parent 673553975e
commit aad16d136e

69
TODO.md
View File

@@ -647,11 +647,72 @@ docs/BILLING.md
decisão documentada em docs/BILLING.md, não uma média ponderada 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 - [ ] Reajuste de preço no meio de um período aberto (2 vigências
sobrepostas de `PriceBookItem`/`RateDeckEntry`) nunca exercitado sobrepostas de `PriceBookItem`/`RateDeckEntry`) nunca exercitado
- [ ] Sem UI de platform admin pra criar tenant/price book/rate deck - [x] UI de platform admin pra price book/rate deck — PHASE 23. Ainda sem
ainda (fase Frontend) — testado só via API direto 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, ## PHASE 23 — Frontend: app shell, login, dashboard, Billing > Tarifas
Tests) (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 `<html>` +
`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 `<form action>` — precisa de arrays
dinâmicos), detalhe. Testado ponta a ponta contra a API real:
criar price book pela UI de verdade → redirect pro detalhe → volta
pra lista com o item novo, contagem e badge "Padrão" corretos
- [x] **Bug real, achado nesta fase**: a topbar tinha o título fixo
"Visão Geral da Plataforma" em toda página (Tarifas mostrava o
título errado). Corrigido com `getPageMeta(pathname)` resolvendo
título/descrição pelo item de menu ativo (casa pelo href mais
longo, então uma subrota tipo `/price-books/:id` ainda resolve pro
item de menu certo).
- [x] **Bug real, achado nesta fase**: a sidebar fixa de 256px não tinha
nenhuma versão mobile — abaixo de `lg` o conteúdo ficava espremido
em ~130px (secao 175: o próprio celular do agente precisa
funcionar). Corrigido com `MobileNavDrawer` (Radix Dialog, foco
preso + Escape + fecha ao navegar) reaproveitando a mesma
`NavList` da sidebar desktop — uma correção no shell compartilhado,
beneficia toda página existente e futura.
- [x] Testado em navegador de verdade (Puppeteer + Chrome headless,
instalado nesta sessão pra isso — sem extensão de browser
disponível): desktop 1440px + mobile 390px, light + dark, fluxo de
criação real ponta a ponta. Screenshots em
`apps/frontend/.impeccable/review/`.
- [ ] Consumo/Fechamentos/Relatórios (as outras 3 abas de Billing) e
Clientes/Infraestrutura/IA/Sistema inteiros ainda ficam "em breve"
— dependem de um seletor de tenant real, e não existe endpoint de
listagem de tenants ainda (nem tenant CRUD) pra construir um
- [ ] Sem paginação de servidor/coluna-visível/bulk-actions/export nas
tabelas de Tarifas (secao 173 pede em toda tabela) — decisão
deliberada pra um catálogo global de poucas dezenas de linhas,
documentada no rodapé da própria tela; reavaliar se isso deixar de
ser verdade
- [ ] TanStack Query/Table instalados, ainda não usados — Tarifas busca
tudo server-side (Server Component) e filtra/ordena no client com
`useState`/`useMemo` puro, sem cache de query; suficiente pro
tamanho de catálogo atual
## PHASE 24+ — ver `agente.md` seções 140 em diante (resto do Frontend,
Security, Tests)
--- ---