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 `
` — 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) ---