Pular para o conteúdo principal

Monitor F&I — campos que faltam no mart (fandi_kpi_contrato_dia)

Contexto: as abas Fabricantes/Bancos/Lojas do Monitor F&I (apps/web/app/[locale]/belite/home/[account]/relatorios/monitor-fi/) são desenhadas pra consultar o mart dw_concessionarias_mart.fandi_kpi_contrato_dia (pré-agregado por dia/dimensão, bem mais barato que a fato em escala — ver comentário em fi-queries.ts:392-397). O backfill desse mart está em andamento (TEC-452/NIM-29).

O problema

Duas colunas usadas nas colunas "Retorno médio" e "Taxa média" não existem no mart hoje, só na fato (dw_concessionarias_gold.fandi_fat_contrato):

  • retorno_pct (double precision)
  • taxa_mes (double precision)

Confirmado via introspecção direta do schema (information_schema.columns) em 2026-07-23 — as 19 colunas de fandi_kpi_contrato_dia são: grupo_sk, fabricante_sk, loja_sk, id_origem, banco_sk, departamento, tipo_departamento, data_faturamento, valor_vendido, valor_financiado, valor_retorno, valor_plus, valor_bonus, valor_meta, valor_prod_banco, valor_prod_loja, qtd_contratos, ano, mes. Nenhuma delas é retorno_pct ou taxa_mes.

Workaround atual

fi-queries.ts tem uma função dedicada, queryRetornoTaxaByGroup(), que roda em paralelo (Promise.all) com a query principal do mart, direto contra a fato fandi_fat_contrato:

SELECT
<groupCol> AS key,
(grouping(<groupCol>) = 1) AS is_total,
avg(e.retorno_pct) AS retorno_medio,
avg(e.taxa_mes) AS taxa_media
FROM dw_concessionarias_gold.fandi_fat_contrato e
...
GROUP BY ROLLUP (<groupCol>)

Isso funciona e os valores batem com os KPIs do topo da página, mas tem um custo: é uma segunda query rodando contra a fato (dado bruto, linha a linha) exatamente na escala que o mart existe pra evitar. Hoje o volume ainda é pequeno o suficiente pra não doer, mas escala pior que o resto da tabela (que é 100% mart).

O que deveria mudar

Adicionar ao mart fandi_kpi_contrato_dia (ou a uma extensão dele) uma forma agregável de calcular a média por grupo/dia — como é uma média (avg), não dá pra simplesmente somar como as outras colunas do mart; precisa vir como soma(retorno_pct * peso) / soma(peso) ou equivalente, ou como sum + count separados pra recompor a média corretamente no agregador final (evita o erro de "média das médias").

Sugestão de colunas novas no mart:

  • soma_retorno_pct (ou similar) + qtd_contratos (já existe) → permite avg correto por grupo
  • soma_taxa_mes (ou similar) + qtd_contratos (já existe) → idem

Depois que isso existir no mart, queryRetornoTaxaByGroup() pode ser eliminada e as duas métricas passam a vir da query principal do mart, sem round-trip extra.