feat(frontend): Relatórios > Consumo (tenant)

GET /reports/consumo agrega os 2 ledgers imutáveis de uso (UsageEvent +
AIUsageRecord — os mesmos que o RatingEngine usa pra faturar) por meter/tipo no mês
corrente: chamadas, minutos, dias ativos, armazenamento de gravação, tokens de IA.
Nunca calcula valor em dinheiro (isso é billing/RatingEngine, platform-only) —
decisão deliberada pra não duplicar essa lógica fora dele. Devolve também os limites
do plano (maxMonthlyCalls/maxRecordingStorageGb) pra comparação.

Tela /app/relatorios/consumo reaproveita o InstrumentTile do dashboard, zeros
honestos em vez de esconder seção. Testado ponta a ponta contra o tenant Acme real
(2 dias-tronco já ledgerados aparecem certos, resto zerado por não ter chamada
rodada ainda).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
2026-08-30 08:22:34 -03:00
parent 2fb5010283
commit de0b632fc9
7 changed files with 196 additions and 1 deletions

View File

@@ -77,3 +77,27 @@ export interface AIDashboardReport {
topAgents: { agentId: string; name: string; avgScore: number; calls: number }[];
bottomAgents: { agentId: string; name: string; avgScore: number; calls: number }[];
}
export interface ConsumoReport {
period: { from: string; to: string };
usage: {
callCount: number;
callSeconds: number;
extensionActiveDays: number;
agentActiveDays: number;
trunkActiveDays: number;
recordingBytes: number;
};
aiUsage: {
transcriptionSeconds: number;
analysisRequests: number;
inputTokens: number;
outputTokens: number;
};
limits: {
maxMonthlyCalls: number | null;
maxRecordingStorageGb: number | null;
callCountUsedRatio: number | null;
recordingStorageUsedRatio: number | null;
} | null;
}