Fase 7: CDR/métricas/relatórios, reconciliação, dashboard e compliance

- Reconciliação de tentativas órfãs após restart (reconciliation.ts),
  rodando a cada 60s.
- Vínculo real agente<->chamada (agent-call-binding.ts): claim atômico de
  agente disponível via FOR UPDATE SKIP LOCKED, DialAttempt.agentId
  populado no connect, ciclo AVAILABLE -> IN_CALL -> WRAP_UP -> AVAILABLE.
- Corrige abandonRate (EWMA) nunca atualizado pelo campaign-worker real —
  agora o fluxo QUEUED -> connect-or-abandon atualiza as estatísticas de
  fato usadas pelo predictive engine.
- Novo módulo de relatórios: /api/reports/calls (+export CSV), /metrics
  (TME/TMA/abandono), /agents/:id.
- Novo módulo de dashboard: /api/dashboard, /calls-by-hour,
  /campaigns/:id (Postgres + snapshot EWMA do Redis).
- Novo módulo de compliance: ComplianceSettings configurável +
  /api/compliance/settings e /indicators com contadores reais.
- Validado end-to-end contra containers reais (campanha de teste em modo
  simulação): agentId no connect, ciclo de estado do agente e abandonRate
  todos confirmados corrigidos com dados reais, não só no harness isolado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QoVkLx1KsvtT1C88dRS3QW
This commit is contained in:
2026-08-27 16:09:22 -03:00
parent 66cc2058fd
commit 0a8b830e2c
22 changed files with 1072 additions and 34 deletions

View File

@@ -0,0 +1,11 @@
-- CreateTable
CREATE TABLE "compliance_settings" (
"id" TEXT NOT NULL,
"short_call_threshold_seconds" INTEGER NOT NULL DEFAULT 3,
"max_attempts_per_number_per_day" INTEGER NOT NULL DEFAULT 3,
"max_attempts_per_number_per_month" INTEGER NOT NULL DEFAULT 10,
"high_volume_monthly_threshold" INTEGER NOT NULL DEFAULT 1000000,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "compliance_settings_pkey" PRIMARY KEY ("id")
);

View File

@@ -635,3 +635,21 @@ model SuppressionEntry {
@@map("suppression_list")
}
// ===========================================================================
// Fase 7 — Compliance (agente.md seção 34). Parâmetros configuráveis, nunca
// hardcoded para uma legislação específica — o sistema AJUDA a cumprir
// regras, nunca burla mecanismos antispam/autenticação de operadora.
// ===========================================================================
// Linha única (singleton lógico) de parâmetros de compliance.
model ComplianceSettings {
id String @id @default(uuid())
shortCallThresholdSeconds Int @default(3) @map("short_call_threshold_seconds")
maxAttemptsPerNumberPerDay Int @default(3) @map("max_attempts_per_number_per_day")
maxAttemptsPerNumberPerMonth Int @default(10) @map("max_attempts_per_number_per_month")
highVolumeMonthlyThreshold Int @default(1000000) @map("high_volume_monthly_threshold")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("compliance_settings")
}