FJFrigo · Financeiro · menu38C / 38H / 38J — Indicadores

Validações do BI Financeiro: Crédito, Capital de Giro e Endividamento

Três painéis de BI do financeiro, sem legado: crédito e inadimplência da carteira, capital de giro e endividamento. De onde sai cada número, o que o recorte esconde, e como conferir no banco.

Telas: Crédito e Inadimplência (38C), Capital de Giro (38H), Endividamento (38J)Tipo: Desenho novo, sem legadoGravação: nenhumaCache: 15 minutos por usuário
A

O que são e o que têm em comum

Para quem atende

Três painéis de BI do financeiro, desenho novo, sem legado (03/10/2026): não há .prg para comparar. Todos só leem: nada é gravado, travado ou contabilizado. Cada um é uma apuração em memória de 15 minutos.

OpçãoPainelPergunta que respondePermissão do menuEndpoint
38CCrédito e InadimplênciaQuanto da carteira a receber está vencido, quem concentra, quem passou do limite, quem comprou estando em atraso.316A (Aging)POST /lancamento/relatorios/painelCredito/dados
38HCapital de GiroEm quantos dias recebemos e pagamos, quanto dinheiro fica preso no giro e quanto vale 1 dia de prazo.316B (Prazos Médios)POST /lancamento/relatorios/painelCapitalGiro/dados
38JEndividamentoQuanto se deve em empréstimos e FIDC, quanto venceu sem pagar, o cronograma, o custo e a dívida líquida.316C (Custo dos Empréstimos)POST /lancamento/relatorios/painelEndividamento/dados

Menu: 3-Relatórios › 8-Indicadores › C-/H-/J- (sem linha em opcao_sistema, idOpcao: null). A permissão é a da tela que o painel reaproveita (coluna acima) e só é conferida no menu do front; no backend o endpoint é aberto a qualquer usuário logado (JWT, /lancamento/*).

Reaproveitam o que já existe: 38C usa o Aging (316A), a curva do 316D e o score do 2332; 38H usa os Prazos Médios (316B); 38J usa o CET do 316C e o saldo das contas do 388/382. Número diferente do relatório de origem quase sempre é recorte (365 dias, só faturamento, moeda local) — ver a seção de cada painel.

B

Opções, travas e comportamento comum

Os três painéis
Regra

Data-base

DefaultHoje. Posição daquele dia: pagamentos lançados depois dela não contam (baixas com data_baixa < data-base + 1).

FuturaRecusa: "A data-base não pode ser futura." (400). Data fora do formato aaaa-mm-dd: "Data-base inválida: ...".

O que não tem data-base38C: score e limite (sempre de hoje; aviso "Score e limite são os de hoje: o score não tem data-base."). 38J: o caixa das contas Banco (sempre de hoje; aviso "O caixa é o saldo de hoje das contas Banco, não o da data-base.").

Opção
Regra

Só a filial da sessão

DefaultDesmarcado: entram todas as filiais do acesso do usuário (FiliaisDoUsuario.permitidas). Marcado: só a filial da sessão.

Erros"A filial N não está entre as filiais do usuário."; "O usuário não tem filial liberada." (400).

MoedaTudo em moeda local. 38C e 38H pelo câmbio gravado no título (IF(valor_cambio > 0, valor_cambio, 1)); 38J pela cotação mais recente até a data-base.

ExceçãoO caixa do 38J é da empresa inteira (não respeita o recorte de filial).

Opção
Regra

Cache, apuração em paralelo e tempo

Resultado guardado 15 minutos em memória por banco + usuário + data-base + filial (+ N dias, no 38C). Atualizar refaz. A resposta traz tempos (ms de cada parte) para o suporte; 38C usa um pool fixo de 4 threads e 38H de 3 (compartilhado por todos os tenants do backend). A primeira abertura leva ~20-30 s em central (141 filiais); no harness, de conexão única, 56 s (38C), 32 s (38H) e 12-21 s do caixa (38J).

Desempenho
Regra

Saldo de título na data-base (a conta do 221)

Fórmulasaldo = valor_parcela − Σ(b.valor - b.valor_acrescimo - b.valor_juros + b.valor_desconto + b.valor_devolucao + b.valor_retencao) sobre baixas não excluídas até a data-base (nunca menor que 0 nem maior que a parcela, nos painéis 38C/38H).

Recorte comumfe.excluido <> 'T'; a receber descontado fora (descontado = 'T'); emitido até a data-base (data_emissao < base + 1).

Regra comum
C

38C — Crédito e Inadimplência

relatorio.PainelCreditoService

Opções: Data-base, Só a filial da sessão, Vendas dos últimos N dias (default 30; aceita de 1 a 365, senão "As vendas de 1 a 365 dias para trás.").

Regra

C1. Carteira a receber e faixas de atraso

OrigemRelatorioAgingService.titulosEmAberto (o 316A) com tipo R, na data-base; valor = pendente × câmbio do título. Faixas: A vencer, 1 a 30, 31 a 60, 61 a 90, Mais de 90 dias.

IndicadoresCarteira = soma; Vencido = carteira − a vencer, em % e valor; Vencido > 90 = faixa 5; Vencido > 1 ano = títulos com atraso > 365 dias; clientes com saldo e clientes com vencido.

ClienteAgrupado por emitente. "Mais antigo" = o vencimento mais antigo entre os vencidos do cliente.

Carteira
Regra

C2. Concentração: top 5/10, classes A/B/C e HHI

UniversoSó clientes com saldo > 0 (o total do indicador "Carteira" soma também saldos negativos).

ClassesOrdem por saldo decrescente; classe pelo acumulado anterior: < 80% = A, < 95% = B, resto = C (a regra da curva ABC do 316A, refeita aqui).

HHIΣ(participação em %)². Leitura: > 2.500 "concentrada"; de 1.500 a 2.500 "moderadamente concentrada"; abaixo, "pulverizada".

Concentração
Regra

C3. Vencido sobre a carteira — 12 meses (tendência)

PontosFim de cada um dos 11 meses anteriores + a data-base (12 pontos). Por título: LEAST(GREATEST(valor − baixas até a data, 0), valor) × câmbio; só entra título emitido até o ponto e com data_vencimento >= ponto − 365 dias.

Corte de 365 diasPor desempenho: sem ele eram 2,2 milhões de títulos e 63 s em central (e ~97% de vencido, títulos antigos nunca baixados); com ele, 1,08 milhão e ~17 s. Consequência: a carteira da tendência é menor que a do indicador "Carteira" (que não corta); os títulos vencidos há mais de 1 ano aparecem só em "Vencido > 1 ano". O % vencido do gráfico não é o % do cartão.

Conferência internaO último ponto (vencido do último ano) deve bater com os vencidos de 365 dias do 388 (em central: 785,3 mi × 784,9 mi) — a diferença é o filtro de filial e o câmbio.

Tendência
Regra

C4. Inadimplência por mês de emissão (curva do 316D)

RelatorioInadimplenciaEmissaoService.curva dos 12 meses de emissão (do 1º dia do mês de 11 meses atrás até a data-base), "só faturamento" (título com faturamento de origem e tipo que não é empréstimo), data de referência = data-base. Marcos de 30/60/90/180 dias após a emissão; marco que ainda não chegou fica vazio.

Curva
Regra

C5. Score, limite e "Acima do limite"

ScoreScoreCreditoService.avaliar dos clientes com saldo: faixa A (≥ 80), B (≥ 60), C (≥ 40), D. Pesos em system_config.SCORE_CREDITO_PESOS; o contexto (Brasil × Paraguai) vem do codicfj da filial da sessão. Sempre de hoje.

Usado × limiteusado = pendência + pedidos em aberto (a regra da autorização do pedido, 2332); acima do limite quando usado > limite e há limite > 0. Cliente sem limite (ou limite ≤ 0) vai para "sem limite" (clientes e saldo) e não entra em "acima".

FalhaSe o score falhar, o painel sai sem ele e com o aviso "Score e limite não calculados: ...".

Score
Regra

C6. Vendas a quem estava em atraso

VendasTítulos R com idfaturamento > 0, tipo que não é empréstimo (tipo_faturamento.emprestimo <> 'S'), emitidos de base − (N−1) até a data-base, nas filiais do recorte. Por cliente: última emissão, valor (× câmbio), nº de documentos e a maior emitente.tolerancia_atraso.

Entra na listaCliente com título vencido ainda em aberto na data-base cujo vencimento + tolerância < data da última venda. Premissa: título em aberto hoje já estava em aberto na venda.

MostraAtraso do cliente no dia da última venda (dias entre o vencimento mais antigo e a última venda), valor vendido, tolerância. Lista dos 30 maiores; a contagem e o total consideram todos.

Vendas
D

38H — Capital de Giro

relatorio.PainelCapitalGiroService

Opções: Data-base, Só a filial da sessão e Custo do dinheiro (% a.m.) (opcional; só no navegador, guardado no próprio navegador — não vai ao servidor). O painel mostra os 12 meses até a data-base. Com a data-base no meio do mês, os indicadores de prazo usam o último mês fechado (regra do front).

Regra

D1. PMR e PMP realizados, ciclo

OrigemRelatorioPrazosMediosService.realizadoPorMes (o 316B sem a grade), "só faturamento": das baixas do mês (data_baixa), os dias da emissão ao pagamento ponderados pelo amortizado em moeda local. Também o prazo concedido (emissão→vencimento), o atraso médio e o % pago/recebido no prazo.

CicloPMR − PMP, sem o prazo de estoque (como o 316B). Fica vazio se um dos dois lados não tem baixa no mês.

Só faturamentofe.idfaturamento > 0 AND tipo_faturamento.emprestimo <> 'S'. Empréstimos, impostos e títulos lançados à mão ficam fora (senão o PMP mistura fornecedor com banco).

Prazos
Regra

D2. Saldos no fim de cada mês e NCG

CálculoUma consulta com 12 datas (fim dos 11 meses anteriores + data-base): receber (R) e pagar (P) em aberto em cada data, "só faturamento", a receber descontado fora, em moeda local pelo câmbio do título.

Corte de 365 diasSó títulos com data_vencimento >= data − 365 dias (o mesmo corte do 38C e dos vencidos do 388): "o atraso mais antigo é perda, não giro". Os saldos não batem com o total em aberto do financeiro.

NCG operacionalreceber − pagar. Positiva = dinheiro preso no giro; negativa = fornecedores financiam. Não inclui estoque (a foto diária estoque_saldo_diario do 2392 nunca rodou gravando e guarda só 30 dias; PME e NCG com estoque ficam para quando houver histórico — a tela avisa).

Saldos
Regra

D3. Valor de 1 dia de prazo e simulador

Emitido no mêsVendas (R) e compras (P) a prazo, "só faturamento", por mês de data_emissao, de 3 meses antes do primeiro mês até a data-base.

1 diaSoma do emitido dos 3 meses que terminam na data ÷ nº de dias (do 1º dia de 2 meses antes até a data). "1 dia de PMR vale" = vendas/dia; "1 dia de PMP vale" = compras/dia.

Prazo pelo saldoSaldo ÷ valor de 1 dia (na resposta como pmrSaldo/pmpSaldo); a tela mostra o realizado. Nulo se o valor de 1 dia é 0.

SimuladorSó no navegador: N dias × valor de 1 dia; custo evitado = valor liberado × custo do dinheiro (% a.m.).

Simulador
E

38J — Endividamento

relatorio.PainelEndividamentoService

Opções: Data-base e Só a filial da sessão (recorta os contratos pela filial do contrato).

Regra

E1. Quais contratos entram

OrigemTabela emprestimo (captação 226 e FIDC 22R) com excluido <> 'T', fora idtipo_faturamento = 1140 (empréstimo a cliente) — o recorte do 316C. Os títulos a pagar do contrato: fe.idfaturamento = emprestimo.id AND fe.idtipo_faturamento = emprestimo.idtipo_faturamento AND fe.tipo_emissao = 'P', emitidos até a data-base.

Regra chumbadaFIDC = tipos 11173 e 11174; empréstimo a cliente = 1140; tipos de parcela da captação 2/3/4 (conforme EmprestimoFinanceiroService). Antes de mexer, conferir o .prg de hoje.

Saldo devedorParcela − baixas até a data-base (a conta do 221, com a retenção: o 3162 não soma a retenção, por isso os números podem diferir dele). Só parcela com saldo > 0,004.

Contratos
Regra

E2. Principal × encargos

Captaçãoidtipo_parcela 2 = principal; 3 = juros e 4 = IVA/renta dos juros (encargos); 1 (comissão e desconto) nasce baixado e fica fora; qualquer outro tipo é ignorado.

FIDCTudo vem como tipo 1 (sem separar o deságio): entra inteiro no principal, inclusive o deságio. Por isso "FIDC %" pode parecer alto.

CronogramaVencido (vencimento ≤ data-base), os 12 meses a partir do mês da data-base e Depois, em principal e encargos. "Vencida e não paga" = principal vencido. "Prazo médio" = dias médios ponderados pelo principal a vencer.

Principal
Regra

E3. Moeda

Dívida em outra moeda vale a cotação mais recente até a data-base (moeda_valores.valor, data < base + 1); a moeda local vale 1 (a moeda local vem da filial da sessão). Sem cotação: usa o câmbio do título e avisa "Moeda N sem cotação até aaaa-mm-dd: usado o câmbio gravado no título.". Cotação com mais de 7 dias avisa "A cotação da moeda N usada é de ...".

Moeda
Regra

E4. CET e taxa contratada

RelatorioCustoEmprestimosService.custos (o 316C), sem o IVA dos juros, em % a.a. (a classe devolve fração, a tela multiplica por 100); ponderado pelo saldo (por instituição e na carteira). Contrato sem CET traz o motivo em "Observação" (por exemplo, vencimento antes da entrada — ocorre em dados de homologação com vencimento em 2206, que caem em "Depois"). Falha: aviso "Custo efetivo não calculado: ...".

CET
Regra

E5. Dívida líquida

Cálculoprincipal − caixa. Caixa = saldo de hoje das contas de tipo Banco (FluxoCaixaService.contas, o mesmo do 388), empresa inteira, convertido para a moeda local da sessão.

ObservaçãoEncargos não entram na dívida líquida. Falha no saldo: aviso "Saldo das contas não calculado: ..." e caixa = 0 (a dívida líquida fica igual ao principal).

Caixa
Regra

E6. Por instituição, por moeda, maiores contratos

Instituição = emitente.razao_social do contrato (agrupamento pelo nome, não pelo id; "(sem instituição)" quando vazio). Maiores contratos: os 20 maiores por principal. Instituição só aparece se tem principal ou encargos > 0.

Quebras
F

Configurações que mudam o resultado

system_config e cadastros
OndeO quePainelEfeito
system_config.SCORE_CREDITO_PESOSPesos do score de crédito38CMuda score/faixa, "carteira por faixa de score".
emitente.tolerancia_atrasoDias de tolerância do cliente38CEntra no "vencimento + tolerância < última venda" das vendas a quem estava em atraso.
Limite de crédito do emitenteCadastro do emitente (15)38CDefine "acima do limite" e "sem limite".
tipo_faturamento.emprestimoMarca tipo que é empréstimo38C (vendas, curva), 38HTítulo desse tipo fica fora do "só faturamento".
moeda_valoresCotações38JConverte a dívida; faltando, usa o câmbio do título.
conta_bancaria.tipo_contaTipo da conta38JSó conta Banco entra no caixa.
parametros.codicfjPaís do tenant (004 Brasil, 001 Paraguai)38CDecide o contexto do score.

Os painéis não têm chave própria na Config. Globais. Não há e-mail nem rotina agendada nestes três.

G

Casos de teste sugeridos

QA

Use um banco com títulos a receber vencidos. Troque :base (aaaa-mm-dd), :filiais e os ids.

Teste

T1. Carteira × Aging (38C)

PassosAbrir o 38C com a data-base de hoje e todas as filiais; abrir o Aging 316A, tipo Receber, mesma data.

Esperado"Carteira" = total do 316A em moeda local; faixas iguais.

Conferir

SELECT SUM(LEAST(GREATEST(fe.valor_parcela - IFNULL(b.a, 0), 0), fe.valor_parcela) * IF(fe.valor_cambio > 0, fe.valor_cambio, 1)) carteira
FROM financeiro_emissao fe
LEFT JOIN (SELECT idfinanceiro_emissao, SUM(b.valor - b.valor_acrescimo - b.valor_juros + b.valor_desconto + b.valor_devolucao + b.valor_retencao) a FROM financeiro_baixas
            WHERE excluido <> 'T' AND data_baixa < :base + INTERVAL 1 DAY GROUP BY 1) b ON b.idfinanceiro_emissao = fe.id
WHERE fe.excluido <> 'T' AND fe.tipo_emissao = 'R' AND IFNULL(fe.descontado, '') <> 'T'
  AND fe.data_emissao < :base + INTERVAL 1 DAY AND fe.idfilial IN (:filiais);

Teste

T2. Data-base no passado

PassosRepetir com a data-base de um mês atrás. Depois com amanhã.

EsperadoValores mudam (baixas posteriores não contam). 38C mostra o aviso do score de hoje; 38J mostra o aviso do caixa de hoje. Data futura: erro "A data-base não pode ser futura."

Teste

T3. Corte de 365 dias

PassosNo 38C, comparar o último ponto da tendência com a carteira vencida; no 38H, o receber do fim do mês com o do 38C.

EsperadoTendência (e saldos do 38H) menores que a carteira do cartão quando há títulos vencidos há mais de 1 ano; a diferença é o "Vencido > 1 ano".

Teste

T4. Acima do limite e vendas em atraso (38C)

PassosEscolher um cliente da lista "Acima do limite" e abrir o emitente (15)/2332.

EsperadoPendência + pedidos em aberto > limite cadastrado. Cliente sem limite aparece só em "sem limite". Em "Vendas a quem estava em atraso": o cliente tem título vencido em aberto cujo vencimento + tolerância é anterior à última venda dos últimos N dias.

Conferir

SELECT fe.idemitente, MAX(DATE(fe.data_emissao)) ultima_venda, SUM(fe.valor_parcela * IF(fe.valor_cambio>0, fe.valor_cambio, 1)) vendido
FROM financeiro_emissao fe LEFT JOIN tipo_faturamento tf ON tf.id = fe.idtipo_faturamento
WHERE fe.excluido <> 'T' AND fe.tipo_emissao = 'R' AND fe.idfaturamento > 0 AND IFNULL(tf.emprestimo,'N') <> 'S'
  AND fe.data_emissao >= :base - INTERVAL 29 DAY AND fe.data_emissao < :base + INTERVAL 1 DAY AND fe.idemitente = :cliente
GROUP BY 1;

Teste

T5. Prazos e ciclo (38H)

PassosComparar PMR/PMP de um mês fechado com o 316B (mesmo mês, só faturamento) .

EsperadoPMR e PMP iguais; ciclo = PMR − PMP; NCG = receber − pagar do fim do mês. Mês sem baixa de um dos lados: ciclo vazio.

Conferir

SELECT DATE_FORMAT(fe.data_emissao,'%Y-%m') mes, fe.tipo_emissao, ROUND(SUM(fe.valor_parcela*IF(fe.valor_cambio>0,fe.valor_cambio,1)),2) emitido
FROM financeiro_emissao fe LEFT JOIN tipo_faturamento tf ON tf.id = fe.idtipo_faturamento
WHERE fe.excluido <> 'T' AND fe.tipo_emissao IN ('R','P') AND NOT (fe.tipo_emissao='R' AND IFNULL(fe.descontado,'')='T')
  AND fe.idfaturamento > 0 AND IFNULL(tf.emprestimo,'N') <> 'S' AND fe.data_emissao >= :mes_ini AND fe.data_emissao < :mes_fim
  AND fe.idfilial IN (:filiais) GROUP BY 1,2;

Teste

T6. Contrato de endividamento (38J)

PassosEscolher o maior contrato da tabela e conferir o principal com o saldo dos títulos idtipo_parcela = 2.

EsperadoPrincipal do contrato = Σ pendente das parcelas tipo 2 (captação) na data-base; encargos = parcelas 3 e 4; FIDC: tudo. Em central, 03/10/2026: contrato 1001632 (Caixa Econômica, CCE25/2313531) principal 35.555.555,52.

Conferir

SELECT fe.idtipo_parcela, SUM(fe.valor_parcela - IFNULL((SELECT SUM(b.valor - b.valor_acrescimo - b.valor_juros + b.valor_desconto + b.valor_devolucao + b.valor_retencao)
  FROM financeiro_baixas b WHERE b.idfinanceiro_emissao = fe.id AND b.excluido <> 'T' AND b.data_baixa < :base + INTERVAL 1 DAY), 0)) pend
FROM emprestimo e JOIN financeiro_emissao fe ON fe.idfaturamento = e.id AND fe.idtipo_faturamento = e.idtipo_faturamento
 AND fe.tipo_emissao = 'P' AND fe.excluido <> 'T' AND fe.data_emissao < :base + INTERVAL 1 DAY
WHERE e.id = :contrato GROUP BY 1;

Teste

T7. Moeda e dívida líquida (38J)

PassosAchar contrato em moeda estrangeira; comparar "original" × "convertido"; conferir a dívida líquida contra o saldo do 388.

EsperadoConvertido = original × última cotação até a data-base. Caixa do 38J = saldo agora do 388 (mesmas contas Banco, moeda local); dívida líquida = principal − caixa.

H

Limitações e pendências

Histórico 396, 398, 400
Aviso

Status

PARCIAL em docs/status-porte.csv (03/10/2026) para os três: falta teste na tela real (endpoints novos: reiniciar o backend). 38H também espera a foto do estoque (2392) ter histórico para o PME e a NCG com estoque.

Aviso

Números de referência em central (03/10/2026, usuário 100826, todas as filiais)

38C: carteira 2.017.712.677,75 (31.323 títulos, 1.185 clientes); vencido 97,2%; > 90 dias 1,84 bi; > 1 ano 1,18 bi; HHI 257 (pulverizada); 10 maiores 41,9%; 35 clientes acima do limite; 456 sem limite (293 mi); 14 clientes compraram em atraso em 30 dias (28,7 mi). 38H: set/2026 PMR 14,3 e PMP 10,2 dias (médias de 12 meses 65,7 e 68,1); NCG em 03/10 −142,6 mi (receber 730,0 mi, pagar 872,6 mi); 1 dia de PMR = 2,0 mi, de PMP = 1,9 mi. 38J: 151 contratos; principal 386,0 mi, vencido 287,5 mi (74,5%); 89,9 mi em 12 meses; encargos 19,1 mi; FIDC 37,8%; CET médio 21,1% a.a.; caixa 2,72 mi; dívida líquida 383,3 mi.

Aviso

Pontos a saber

O vencido do 38C é altíssimo em central (97%) porque a homologação tem títulos antigos nunca baixados; o corte de 365 dias existe por isso e por desempenho.

O score e o limite do 38C usam o codicfj e os pedidos em aberto da filial da sessão, mesmo com várias filiais no recorte.

38C "Vendas a quem estava em atraso" só considera clientes que estão na carteira da data-base; uma data-base muito antiga reduz a lista.

38J: o FIDC não separa o deságio; instituição é agrupada por nome; contrato com vencimento absurdo (2206, FIDC FOM.119881) aparece em "Depois".

38J: caixa e score não seguem a data-base (avisos na tela). O caixa vem do cache de 5 min do 382/388.

As partes correm em threads de um pool fixo compartilhado: com vários usuários abrindo ao mesmo tempo, a primeira abertura pode demorar mais.

Nada bate com essa busca. Tente um trecho menor, ou limpe o filtro.