Files
SeConectai_Vendas/Etapas/03-painel-master-tenants.md
T
2026-08-14 17:35:24 -03:00

4.7 KiB

Etapa 3/8 — Painel Master: Tenants, Planos e Faturas

Contexto do projeto

Continuação do SeConectai Vendas. Etapas anteriores entregaram: setup do projeto (Docker/Prisma/schema) e autenticação completa (login master/tenant, JWT, RLS, guards MasterGuard/TenantGuard/RolesGuard).

Esta etapa implementa a parte do painel master relacionada à gestão comercial da própria plataforma: cadastro dos tenants (seus clientes), planos vendidos, e cobrança da mensalidade deles.

Todos os endpoints desta etapa são protegidos por MasterGuard.

Objetivo desta etapa

CRUD completo de planos e tenants, geração e controle de tenant_faturas (mensalidades), e endpoints de consulta para o dashboard do master (quantos tenants ativos, inadimplentes, faturamento previsto etc).

Tarefas

  1. Módulo planos (src/modules/planos/)

    • CRUD completo (GET/POST/PUT/DELETE /master/planos).
    • Validação: valor_mensal > 0; limites (limite_customers, limite_usuarios, limite_instancias_whatsapp) opcionais, mas se informados devem ser > 0.
    • Não permitir excluir plano em uso por algum tenant ativo — apenas desativar (ativo = false).
  2. Módulo tenants (src/modules/tenants/)

    • POST /master/tenants — cria tenant com status inicial trial, associa a um plano, define trial_expira_em (ex: hoje + 14 dias, configurável), e cria automaticamente o primeiro usuário tenant_admin desse tenant (nome, e-mail e senha provisória informados no payload, ou senha gerada e enviada por e-mail — por ora, retornar a senha provisória na resposta, o envio de e-mail é de etapa futura).
    • GET /master/tenants — listagem com filtros por status, busca por nome/documento, paginação.
    • GET /master/tenants/:id — detalhe do tenant, incluindo plano, últimas faturas, quantidade de usuários/customers/vendas (agregados).
    • PUT /master/tenants/:id — atualizar dados cadastrais, plano, status.
    • PATCH /master/tenants/:id/status — transição explícita de status (ativo, suspenso, cancelado, inadimplente), registrando em audit_logs. Regra: mudar para suspenso ou cancelado deve também bloquear login dos tenant_users daquele tenant (checar status do tenant no login e no TenantGuard).
  3. Módulo tenant_faturas (dentro de tenants ou módulo próprio)

    • Geração automática mensal: um job (pode ser um endpoint manual por enquanto, POST /master/faturas/gerar-mes, já preparando estrutura para virar cron na Etapa 7) que cria, para cada tenant ativo, uma linha em tenant_faturas referente ao mês corrente, com vencimento calculado a partir de dia_vencimento_mensalidade, evitando duplicar (respeitar o UNIQUE(tenant_id, referencia)).
    • GET /master/faturas — listagem com filtros por status, tenant, período.
    • PATCH /master/faturas/:id/marcar-pago — marca fatura como paga (pago_em = now()), e se o tenant estava inadimplente, volta para ativo.
    • Regra: se uma fatura passa do vencimento sem pagamento, marcar como atrasado (pode ser endpoint manual por ora, POST /master/faturas/atualizar-atrasadas, que também vira job na Etapa 7) e mudar tenants.status para inadimplente.
  4. Dashboard do master

    • GET /master/dashboard retornando: total de tenants por status, MRR (soma de valor_mensal dos planos dos tenants ativos), total recebido no mês corrente, total em aberto (tenant_faturas com status pendente ou atrasado).
  5. Auditoria

    • Toda criação/alteração de tenant, plano ou fatura grava uma linha em audit_logs (usuario_tipo='master', acao, entidade, entidade_id, detalhes em JSON com o diff relevante).

Critérios de aceite

  • CRUD de planos funcional e validado
  • Criar tenant também cria o primeiro tenant_admin funcional (login testado)
  • Listagem de tenants com filtro por status e busca funciona
  • Mudar status do tenant para suspenso/cancelado bloqueia login dos usuários daquele tenant (testar tentativa de login após suspensão)
  • Geração de faturas do mês não duplica fatura já existente para o mesmo tenant/referência
  • Marcar fatura como paga reverte tenant inadimplente → ativo
  • Marcar fatura como atrasada muda tenant para inadimplente
  • Dashboard retorna números corretos (conferir manualmente com dados de teste)
  • Todas as ações relevantes aparecem em audit_logs
  • Todos os endpoints desta etapa são inacessíveis com token de tenant_user (testar)