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) → permiteavgcorreto por gruposoma_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.