feat(frontend): Platform > Clientes > Assinaturas/Quotas + achado real no dashboard
GET /billing/subscriptions e POST /billing/plan-versions já existiam desde a fase Billing (PHASE 22) sem tela nenhuma — Assinaturas agora deixa escolher um tenant, ver o histórico de versões de preço assinadas, e criar uma nova assinatura reaproveitando uma versão existente ou versionando um preço novo na mesma ação (preço nunca é sobrescrito, sempre uma linha nova). GET /platform/quotas (novo) agrega uso vs. limite do plano em todos os tenants de uma vez (ramais/agentes/troncos/filas/campanhas/chamadas-mês/armazenamento), com a tela destacando quem está em 80%+ (amarelo) ou 100%+ (vermelho) do limite. Achado real ao revisar o dashboard "Visão Geral" antes de escrever a agregação cross-tenant de Quotas: aiUsageThisMonth/recordingStorageBytes sempre devolviam zero/vazio, porque a query rodava direto no Prisma sem nenhum app.current_tenant_id setado — ai_usage_records/recordings têm FORCE RLS, então a policy nega a leitura silenciosamente (0 linhas, sem erro), não importa quanto uso real existisse. Mesma classe de bug já corrigida 2x antes nesta sessão; corrigido com o mesmo padrão (loop withTenantContext por tenant). Confirmado inserindo um AIUsageRecord de teste no Postgres, vendo o número aparecer, e removendo o teste depois. Testado ponta a ponta: fluxo completo de criar assinatura via UI pro tenant Beta Corp (nova versão de preço + assinatura, confirmado na tela e no banco), Quotas mostrando os números reais dos dois tenants de teste. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
35
TODO.md
35
TODO.md
@@ -1556,6 +1556,41 @@ Usuários (agente.md secao 169)
|
||||
Acme (2 dias-tronco já ledgerados, resto zerado — nenhuma chamada
|
||||
rodou ainda neste tenant), tela renderizando os mesmos números
|
||||
|
||||
## PHASE 43 — Platform > Clientes > Assinaturas/Quotas (agente.md secao
|
||||
126-127, 169) + achado real no dashboard de plataforma
|
||||
- [x] achado real (não relacionado às telas novas, achado revisando
|
||||
`PlatformOverviewController` antes de escrever a versão platform-wide
|
||||
de `/reports/consumo`): `aiUsageThisMonth` e `recordingStorageBytes`
|
||||
no dashboard "Visão Geral" SEMPRE devolviam zero/vazio, não importa
|
||||
quanto uso real existisse — `ai_usage_records`/`recordings` têm
|
||||
FORCE RLS (secao 32) e o código rodava `prisma.aIUsageRecord.groupBy`/
|
||||
`prisma.recording.aggregate` direto, sem nenhum `app.current_tenant_id`
|
||||
setado, então a policy nega tudo silenciosamente (0 linhas, sem
|
||||
erro). Mesma classe de bug já corrigida 2x antes nesta sessão
|
||||
(`TenantsController.list`, `UsersController.remove`). Corrigido com
|
||||
o mesmo padrão (loop `withTenantContext` por tenant, soma no
|
||||
código) — confirmado inserindo um `AIUsageRecord` de teste direto no
|
||||
Postgres, vendo o número aparecer no endpoint, e removendo o teste
|
||||
depois
|
||||
- [x] `GET /billing/subscriptions` e `POST /billing/plan-versions` já
|
||||
existiam desde a fase Billing (PHASE 22) sem nenhuma tela — só
|
||||
faltava o frontend. Tela `/platform/clientes/assinaturas`: escolher
|
||||
tenant, ver histórico de assinaturas (versão/preço/vigência/ciclo/
|
||||
status), criar uma nova assinatura reaproveitando uma versão de
|
||||
preço existente OU criando uma nova na mesma ação (dois preços
|
||||
nunca sobrescritos, sempre uma versão nova)
|
||||
- [x] `GET /platform/quotas` (novo) — uso vs. limite do plano em TODOS os
|
||||
tenants (ramais/agentes/troncos/filas/campanhas/chamadas-mês/
|
||||
armazenamento), pra achar quem está perto de estourar sem abrir
|
||||
tenant por tenant. Tela `/platform/clientes/quotas` destaca em
|
||||
amarelo (>=80%) e vermelho (>=100%), nunca conta "sem limite" como
|
||||
estourado
|
||||
- [x] Testado ponta a ponta: fluxo completo de criar assinatura via UI
|
||||
pro tenant Beta Corp (nova versão de preço R$499,90 + assinatura
|
||||
com ciclo dia 15, confirmado na tela e no banco), Quotas mostrando
|
||||
os números reais e corretos dos dois tenants de teste (Acme com
|
||||
50% de troncos usados, Beta Corp com zero)
|
||||
|
||||
---
|
||||
|
||||
## Riscos conhecidos
|
||||
|
||||
Reference in New Issue
Block a user