Files
B2BCall-dialer/apps/frontend/src/components/tenant-shell/nav-data.ts
Matheus f1cadddc91 feat: Call Center > Agentes + Telefonia > Dialplan (novo endpoint GET /users)
Fecha a lacuna de backend que travava Agentes: POST /agents exigia um
userId de um usuário já existente do tenant, mas não havia nenhum endpoint
pra listar usuários. Novo GET /users (gated por users.manage, não
agents.manage — listar identidade de login é administração de usuário)
via TenantMembership, mesmo padrão de RLS já usado em listUserTenants.

Duas telas novas: Call Center > Agentes (criar/listar/remover, seletor de
usuário só mostra quem ainda não é agente) e Telefonia > Dialplan (editor
estruturado do contexto default — regras com condição/ações dinâmicas,
painel de Versões com gerar/ativar, reativar versão antiga = rollback).

Testado ponta a ponta contra a API real do tenant Acme, incluindo o ciclo
completo de dialplan (criar regra -> gerar v1 -> ativar -> badge "Ativa").
Smoke test de regressão nas 13 telas anteriores do tenant + platform.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
2026-08-29 16:10:45 -03:00

146 lines
4.0 KiB
TypeScript

import {
LayoutDashboard,
PhoneOutgoing,
Headset,
Router,
Radar,
Mic,
Sparkles,
BarChart3,
ShieldCheck,
} from "lucide-react";
import type { NavSection } from "../shell/nav-types";
/** IA fixa do menu Tenant (agente.md secao 169). Páginas construídas até
* agora: Dashboard (PHASE 23), Telefonia > Ramais (PHASE 25), Discador >
* Campanhas (PHASE 26), Call Center > Filas/Pausas/Disposições, Telefonia
* > Troncos e Discador > Lista de Bloqueio (PHASE 27) — o resto existe pra
* provar a arquitetura completa (Product Principle #5 em PRODUCT.md),
* renderizado como indisponível em vez de virar link morto. "Itens sem
* permissão não aparecem" (secao 169) ainda não é aplicado aqui — este
* primeiro corte mostra a IA inteira pra qualquer usuário tenant
* autenticado; filtrar por permission real fica pra quando mais telas
* existirem pra testar contra. */
export const TENANT_NAV: NavSection[] = [
{
label: "Dashboard",
icon: LayoutDashboard,
href: "/app",
description: "Chamadas, agentes e filas agora",
},
{
label: "Discador",
icon: PhoneOutgoing,
children: [
{
label: "Campanhas",
href: "/app/discador/campanhas",
description: "Discador preditivo — campanhas deste tenant",
},
{ label: "Leads" },
{ label: "Importações" },
{ label: "Callbacks" },
{
label: "Lista de Bloqueio",
href: "/app/discador/bloqueio",
description: "Números que o discador nunca chama",
},
],
},
{
label: "Call Center",
icon: Headset,
children: [
{
label: "Agentes",
href: "/app/callcenter/agentes",
description: "Identidade de call center — liga um usuário a um agente e a um ramal",
},
{
label: "Filas",
href: "/app/callcenter/filas",
description: "Filas de atendimento deste tenant",
},
{
label: "Pausas",
href: "/app/callcenter/pausas",
description: "Motivos de pausa que o agente pode escolher",
},
{
label: "Disposições",
href: "/app/callcenter/disposicoes",
description: "Motivos de encerramento de chamada",
},
],
},
{
label: "Telefonia",
icon: Router,
children: [
{
label: "Ramais",
href: "/app/telefonia/ramais",
description: "Ramais SIP deste tenant — números, senha, caller ID",
},
{
label: "Troncos",
href: "/app/telefonia/troncos",
description: "Troncos SIP deste tenant",
},
{
label: "Dialplan",
href: "/app/telefonia/dialplan",
description: "Editor de regras do contexto default — condição, ações, versões",
},
],
},
{
label: "Monitoramento",
icon: Radar,
children: [{ label: "Campanhas" }, { label: "Filas" }, { label: "Agentes" }, { label: "Ramais" }, { label: "Troncos" }],
},
{ label: "Gravações", icon: Mic },
{
label: "IA",
icon: Sparkles,
children: [
{
label: "Análises",
href: "/app/relatorios/ia",
description: "Dashboard de IA — score, sentimento, assuntos, compliance",
},
{ label: "Scorecards" },
{ label: "Prompts" },
{ label: "Configurações" },
],
},
{
label: "Relatórios",
icon: BarChart3,
children: [
{ label: "Chamadas" },
{
label: "Agentes",
href: "/app/relatorios/agentes",
description: "Tempo logado/pausado/em chamada e TMA por agente",
},
{
label: "Filas",
href: "/app/relatorios/filas",
description: "Recebidas/atendidas/abandonadas, TME/TMA, Service Level",
},
{
label: "Campanhas",
href: "/app/relatorios/campanhas",
description: "Leads, tentativas, taxas de atendimento e contato",
},
{ label: "Consumo" },
],
},
{
label: "Administração",
icon: ShieldCheck,
children: [{ label: "Usuários" }, { label: "Perfis" }, { label: "Configurações" }],
},
];