feat: Administração > Configurações, remover usuário do tenant, Discador > Callbacks
Fecha os últimos gaps do módulo Administração (agente.md secao 169): tela de Configurações self-service do próprio tenant (GET/PATCH /tenant-settings, nunca aceita tenantId arbitrário — só user.tenantId das claims), e DELETE /users/:id pra remover alguém do tenant, com duas proteções que não existiam antes (não deixa remover a si mesmo, não deixa remover/rebaixar o último Tenant Admin). Corrige um bug real achado testando a remoção: o delete de TenantMembership (FORCE RLS) rodava dentro de um prisma.$transaction([...]) em forma de array, que nunca seta app.current_tenant_id — Prisma devolvia P2025 "not found" com a linha existindo (500 pro cliente). Mesma classe de bug já corrigida antes em TenantsController.create; corrigido com $transaction(async (tx) => ...) + set_config explícito. Adiciona Discador > Callbacks (GET/PATCH /leads/callbacks, tenant-wide): reagendar, tentar de novo sem esperar, ou desistir de um lead que pediu retorno em outro horário. Remove "Importações" do menu — decisão já registrada na PHASE 39 de não duplicar uma tela pro que já existe (CSV em lote no wizard/detalhe da campanha). Testado ponta a ponta via curl e Puppeteer contra o tenant Acme real: tenant-settings GET/PATCH, proteção de último-admin nos dois endpoints que a usam, convite+remoção de um admin temporário, e o fluxo completo de callback (lead forçado pra CALLBACK via SQL, reagendar rejeitado pro passado/aceito pro futuro, requeue confirmado). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
@@ -42,8 +42,11 @@ export const TENANT_NAV: NavSection[] = [
|
||||
href: "/app/discador/leads",
|
||||
description: "Leads de uma campanha — buscar, adicionar, remover",
|
||||
},
|
||||
{ label: "Importações" },
|
||||
{ label: "Callbacks" },
|
||||
{
|
||||
label: "Callbacks",
|
||||
href: "/app/discador/callbacks",
|
||||
description: "Leads que pediram retorno em outro horário — remarcar, tentar agora ou cancelar",
|
||||
},
|
||||
{
|
||||
label: "Lista de Bloqueio",
|
||||
href: "/app/discador/bloqueio",
|
||||
@@ -177,7 +180,11 @@ export const TENANT_NAV: NavSection[] = [
|
||||
href: "/app/administracao/perfis",
|
||||
description: "O que cada papel pode fazer neste tenant",
|
||||
},
|
||||
{ label: "Configurações" },
|
||||
{
|
||||
label: "Configurações",
|
||||
href: "/app/administracao/configuracoes",
|
||||
description: "Dados do tenant — nome fantasia, fuso, idioma, privacidade de IA",
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user