FJFrigo · Relatórios · menu 3-1-6 Outros Relatórios Gerenciais

Aging de Títulos

Saldo em aberto a pagar ou a receber numa data, em cinco faixas de atraso, por cliente, vendedor ou região — com score de crédito e curva ABC. O que a tela mostra, de onde vem cada número, as recusas com a mensagem exata e casos de teste com a SQL de conferência.

Opção: 316A Origem: desenho novo (sem legado) Saída: PDF e planilha (XLS) Base conferida: central (Brasil 004)

Regra

Como o número é calculado: tabela, coluna, filtro.

Aviso

O relatório sai, mas com um comportamento que surpreende.

Bloqueia

O relatório não é gerado: statuscode 400 com a frase indicada.

Teste

Roteiro de QA com o resultado esperado e a forma de conferir no banco.

A

O que a tela mostra

3-Relatórios › 1-Financeiros › 6-Outros Relatórios Gerenciais › A

Desenho novo (27/09/2026), sem equivalente no sistema antigo nem no ceif. É uma foto do saldo em aberto dos títulos numa data, repartida pelos dias de atraso.

ItemValor
TelaAging de Títulos (316A) — RelatorioAging.vue; janela com filtros, painel de Opções e botões XLS e Gerar PDF (o arquivo abre em outra aba)
EndpointPOST /lancamento/relatorios/relatorioAging — RelatorioAgingService (pacote relatorio)
AcessoA opção 316A controla o menu. O endpoint só exige sessão válida (JWT); não há regra de acesso nomeada. O alcance de dados é o das filiais do usuário (usuario_filial)
SaídasSintético (uma linha por grupo), Analítico (um título por linha, com subtotal por grupo) ou Curva ABC (sintético ordenado pelo maior saldo, com folha “Concentração”)
FaixasA vencer · 1 a 30 · 31 a 60 · 61 a 90 · Mais de 90 dias de atraso
Agrupa porCliente (fornecedor, no a pagar) · Vendedor · Região
ScoreColuna Score (ex.: 72 B) só quando agrupa por Cliente e o tipo é A receber
Reaproveitado portitulosEmAberto é público: o score de crédito (2332/15) e o painel 38C usam a mesma consulta
B

Filtros e opções

Moeda e ordem de apresentação ficam no painel de Opções

Os campos obrigatórios são só a data de referência. Filial, emitente, vendedor e região aceitam um item (a tela envia só o primeiro marcado).

CampoOndePadrãoO que faz
Posição emFiltrohojeData de referência. Baixas e dias de atraso são contados até ela (a de hoje mostra a situação de hoje; uma passada mostra a posição daquele dia)
FilialFiltrotodas as do usuárioUma filial. Se não for do usuário: recusa
EmitenteFiltrotodosCliente (a receber) ou fornecedor (a pagar), fe.idemitente
VendedorFiltrotodosO vendedor do título, ou — se o título não tem — o do cadastro do cliente
RegiãoFiltrotodasRegião da cidade do cliente (cidade.idregiao, cadastro 1D)
TipoOpçõesA receberR a receber / P a pagar
Agrupar porOpçõesClienteCliente · Vendedor · Região
Moeda filtroOpçõesTodasSó os títulos daquela moeda. Sem filtro, os totais saem separados por moeda (não há conversão)
AnalíticoOpçõesdesligadoUm título por linha; subtotal por grupo
Curva ABC e concentraçãoOpçõesdesligadoSó vale sem o Analítico (a tela envia curvaAbc && !analitico). Ordena os grupos do maior saldo para o menor, em moeda local
Paisagem (PDF)OpçõesligadoOrientação do PDF
Exibir filtros no finalOpções (comum a todo relatório)ligadoFolha “Filtros utilizados” no fim do PDF
Filtros salvos ★Topo do seletor—Salva o conjunto de filtros e opções por usuário (tabela relatorio_filtro_salvo); o marcado ★ é aplicado ao abrir. Código de salvamento: 316A
C

De onde vem cada número

Tabelas, colunas e filtros SQL
Regra

Saldo do título = a conta do 221, até a data de referência

Contafe.valor_parcela − Σ(b.valor − b.valor_acrescimo − b.valor_juros + b.valor_desconto + b.valor_devolucao + b.valor_retencao) sobre as baixas vivas (b.excluido <> 'T') com b.data_baixa < referência + 1 dia.

Não usafinanceiro_emissao.valor_pendente — está zerada no central.

Só entrasaldo > 0,005. Título quitado, ou com baixa maior que a parcela, some.

Todos
Regra

Quais títulos entram

Filtros fixosfe.excluido <> 'T', fe.tipo_emissao = R|P, fe.data_emissao < referência + 1 dia (faixa meio-aberta: o título emitido no próprio dia entra), fe.idfilial IN (filiais do usuário ou a escolhida).

A receber descontadoIFNULL(fe.descontado,'') = 'T' fica fora no tipo R (o risco foi para o banco). No tipo P não há esse corte.

Não filtraidtipo_faturamento: entram títulos de qualquer origem (venda, compra, empréstimo, avulso, adiantamento). O relatório não olha idfaturamento, então a regra de “idfaturamento junto com tipo” não se aplica aqui.

Todos
Regra

Faixas de atraso

Diasdias = referência − DATE(fe.data_vencimento). Título sem vencimento conta 0 dia (a vencer).

Limitesdias ≤ 0 → A vencer (inclui o que vence na própria data) · 1–30 · 31–60 · 61–90 · > 90.

% vencido(Total − A vencer) ÷ Total, 2 casas. Maior atraso = maior número de dias entre os títulos do grupo (nunca negativo).

Todos
Regra

Vendedor e região do grupo

VendedorCOALESCE(NULLIF(fe.idvendedor,0), e.idvendedor, 0) — o do título; sem ele o do cadastro do cliente; sem os dois: “(sem vendedor)”.

Regiãocidade.idregiao da cidade do cliente (emitente.idcidade); sem cidade ou região: “(sem região)”.

Sem nomeCliente sem razão social aparece como “(sem emitente)”.

Todos
Regra

Sintético: uma linha por grupo e por moeda

Chaveid do grupo + moeda: o mesmo cliente com títulos em duas moedas aparece em duas linhas.

Total geralSai por moeda (QuebrasDaGrade.totalGeral(...).separandoMoedaPela). Moedas diferentes nunca são somadas.

OrdemAlfabética pelo nome do grupo (sem opção de ordenar no painel).

Todos
Regra

Analítico: um título por linha

ColunasGrupo, Cliente/Fornecedor, Documento, Parc., Vencimento, Dias, Moeda (só no XLS), uma coluna por faixa (o valor cai só na faixa do título), Total, Id.

OrdemNome do grupo, emitente, vencimento, id. Subtotal por grupo, por moeda.

Todos
Regra

Curva ABC e concentração

ValorSaldo × IF(fe.valor_cambio > 0, fe.valor_cambio, 1) do título — moeda local pelo câmbio gravado no título, não pela cotação do dia.

ClasseA enquanto o acumulado antes do grupo é < 80%; B até 95%; C o resto (quem cruza a fronteira fica na classe de baixo do corte). Grupos com saldo ≤ 0 saem.

Folha ConcentraçãoQuantidade e valor por classe, participação do maior, dos 5, 10 e 20 maiores (só se houver grupos suficientes), Total, Vencido e o HHI (Σ participação² em %; > 2.500 concentrada, 1.500–2.500 moderada, < 1.500 pulverizada).

ScoreTambém sai na curva quando é Cliente + A receber.

Todos
Regra

Score de crédito (coluna Score)

Escala0 a 100, faixas A 80+, B 60–79, C 40–59, D < 40. Cinco componentes com os pesos de system_config.SCORE_CREDITO_PESOS (padrão 35,25,15,10,15): atraso, uso do limite, pontualidade dos últimos 12 meses, relacionamento (24 meses = 100) e parecer B2E de 12 meses.

Quando faltaCliente sem score calculado sai com a célula em branco.

Documentação própriaDetalhe do cálculo em docs/historico/292-… e na janela Score do 2332/15.

Todos
D

Recusas e avisos

Mensagens exatas
Bloqueia

Informe a data de referência.

QuandoPosição em branco (chamada direta; a tela já nasce com hoje).

Todos
Bloqueia

Data de referência inválida: 2026-13-01 (confira o ano).

QuandoData fora do padrão yyyy-MM-dd ou inexistente.

Todos
Bloqueia

A filial N não está entre as filiais do usuário.

QuandoFilial escolhida sem acesso em usuario_filial.

Todos
Bloqueia

Não foram encontrados dados nessas condições.

QuandoNenhum título com saldo na data e nos filtros — e também na Curva ABC quando todos os grupos ficam com saldo ≤ 0.

PegadinhaPosição em data anterior à emissão dos títulos devolve vazio; confira a data antes de suspeitar do filtro.

Todos
Aviso

Formato desconhecido gera planilha

O que aconteceQualquer formato diferente de pdf vira XLS — não há mensagem de “formato inválido” nestes relatórios (o padrão do corpo é xls).

Todos
Aviso

Cliente em duas moedas, duas linhas; sem conversão

EfeitoQuem esperava um total único em moeda local não o encontra no sintético. Use Moeda filtro ou a Curva ABC (que converte pelo câmbio do título).

Todos
Aviso

Câmbio do título, não cotação do dia (só na Curva ABC)

EfeitoTítulo em moeda estrangeira com valor_cambio zerado vale câmbio 1 e subestima a curva. Não há aviso de “cotação faltando” neste relatório.

Todos
Aviso

Tempo de geração

MedidoNo central, ~31 mil títulos a receber em aberto no tenant inteiro: ~12 s; Curva ABC com score da filial 3 (191 clientes): ~35 s. A tela mostra Gerando… (Ns).

Todos
E

Configurações que mudam o resultado

O que o suporte confere antes de abrir chamado
ConfiguraçãoOndeEfeito
Filiais do usuáriousuario_filial (cadastro de usuário)Alcance do relatório. Usuário com poucas filiais vê menos títulos; sem linha, vale a filial do cadastro do usuário
Descontadofinanceiro_emissao.descontado = 'T'Tira o título do a receber (borderô descontado). Quem desconta duplicata não o vê no aging
Vendedor do cadastroemitente.idvendedor (cadastro 15)Vendedor “herdado” quando o título não tem o seu
Região da cidadecidade.idregiao (cadastro 1D)Sem região na cidade, o grupo cai em “(sem região)”
Pesos do scoresystem_config.SCORE_CREDITO_PESOS (Config. Globais)Muda só a coluna Score, não os valores
Tolerância de atrasoCadastro do cliente (usada pelo score)Muda o componente “atraso” do score
Baixasfinanceiro_baixasBaixa lançada depois da data de referência não reduz o saldo da posição passada; baixa excluída (excluido='T') volta o saldo
F

Casos de teste sugeridos

Resultado esperado e como conferir no banco
Teste

T1 — O total bate com uma SQL independente

ComoGere o sintético A receber, Cliente, filial 3, posição em 31/08/2026, sem Moeda filtro. Compare com a SQL abaixo.

EsperadoIgualdade ao centavo, por moeda. Referência medida em 04/10/2026 no central: moeda 111 — 2.827 títulos, total 165.422.416,44, A vencer 3.535.277,55, 1 a 30 680.559,78, mais de 90 147.971.304,91. Os números mudam se alguém lançar ou baixar com data retroativa.

SELECT t.idmoeda, COUNT(*) AS n, ROUND(SUM(t.pend),2) AS total,
       ROUND(SUM(IF(t.dias<=0,t.pend,0)),2) AS a_vencer,
       ROUND(SUM(IF(t.dias BETWEEN 1 AND 30,t.pend,0)),2) AS f_1_30,
       ROUND(SUM(IF(t.dias>90,t.pend,0)),2) AS mais_90
FROM (SELECT fe.idmoeda, DATEDIFF('2026-08-31', DATE(fe.data_vencimento)) AS dias,
             fe.valor_parcela - IFNULL((SELECT SUM(b.valor)-SUM(b.valor_acrescimo)-SUM(b.valor_juros)
                                              +SUM(b.valor_desconto)+SUM(b.valor_devolucao)+SUM(b.valor_retencao)
                                         FROM financeiro_baixas b
                                        WHERE b.idfinanceiro_emissao = fe.id AND b.excluido <> 'T'
                                          AND b.data_baixa < DATE_ADD('2026-08-31', INTERVAL 1 DAY)), 0) AS pend
        FROM financeiro_emissao fe
       WHERE fe.excluido <> 'T' AND fe.tipo_emissao = 'R' AND IFNULL(fe.descontado,'') <> 'T'
         AND fe.idfilial = 3 AND fe.data_emissao < DATE_ADD('2026-08-31', INTERVAL 1 DAY)) t
WHERE t.pend > 0.005
GROUP BY t.idmoeda
Todos
Teste

T2 — Posição passada não enxerga baixa futura

ComoAche um título com baixa depois da data (SQL abaixo). Gere com a referência anterior à baixa e depois com hoje.

EsperadoNa data anterior o saldo é a parcela inteira (ou menos as baixas anteriores); em hoje o saldo cai pelo valor amortizado. O título some quando quita.

SELECT fe.id, fe.documento, fe.parcela, fe.valor_parcela, b.data_baixa, b.valor
  FROM financeiro_baixas b JOIN financeiro_emissao fe ON fe.id = b.idfinanceiro_emissao
 WHERE b.excluido <> 'T' AND fe.excluido <> 'T' AND fe.tipo_emissao = 'R'
   AND b.data_baixa >= '2026-09-01' AND fe.data_emissao < '2026-08-01' AND fe.idfilial = 3
 LIMIT 5
Todos
Teste

T3 — Limites das faixas

ComoEscolha (ou crie) títulos vencidos 0, 1, 30, 31, 60, 61, 90 e 91 dias antes da referência.

Esperado0 → A vencer; 1 e 30 → “1 a 30”; 31 e 60 → “31 a 60”; 61 e 90 → “61 a 90”; 91 → “Mais de 90”. No analítico a coluna Dias mostra o número e o valor cai numa só coluna de faixa.

Todos
Teste

T4 — Descontado e tipo

ComoMarque um título a receber com descontado='T' (ou use um existente) e gere A receber; depois gere A pagar.

EsperadoO descontado não aparece no A receber. No A pagar o relatório usa tipo_emissao = 'P', rótulo “Fornecedor”, e não mostra a coluna Score.

Todos
Teste

T5 — Moeda

ComoCliente com títulos em duas moedas. Gere sem filtro e depois com Moeda filtro.

EsperadoSem filtro: duas linhas do cliente e total geral por moeda. Com filtro: só a moeda escolhida.

Todos
Teste

T6 — Vendedor e região

ComoAgrupe por Vendedor com um título sem idvendedor de cliente com vendedor no cadastro, e outro de cliente sem vendedor.

EsperadoO primeiro entra no vendedor do cadastro; o segundo em “(sem vendedor)”. Em Região, cidade sem região → “(sem região)”. O filtro Vendedor usa a mesma regra (título, senão cadastro).

Todos
Teste

T7 — Curva ABC

ComoMarque Curva ABC (sem Analítico) numa filial de uma moeda só.

EsperadoA soma de Saldo igual ao total do sintético (câmbio 1); % acumulado da última linha = 100; classe A termina quando o acumulado anterior chega a 80%; a folha Concentração fecha Total = soma das classes e traz o HHI. Referência de 27/09 no central, filial 3, 31/08: 191 clientes, A = 13 (82,2%), 5 maiores = 51,9%, HHI 839.

Todos
Teste

T8 — Recusas

ComoLimpe a data; escolha uma filial sem acesso (chamada direta); gere numa data anterior a todos os títulos.

EsperadoAs mensagens da seção D, sem arquivo gerado.

Todos
Teste

T9 — Score só no cliente a receber

ComoGere Cliente + A receber; depois Vendedor, Região e A pagar.

EsperadoColuna Score só no primeiro caso, no formato “número faixa” (ex.: 47 C).

Todos
G

Limitações e pendências

docs/status-porte.csv e docs/historico/292

Status: PARCIAL (02/10/2026). Falta teste de tela: o aging, a coluna Score do 2332, a janela Score e a sugestão de limite na autorização. Nada disso foi exercitado pela interface; o aging foi conferido no central por harness e SQL (filial 3: 2.827 títulos, total igual a SQL independente).

Fora de escopo por decisão (27/09/2026): o consolidado do grupo pela fjAPI — só o tenant da sessão.

Sem opção de ordenação no painel de Opções: sintético sai por nome; a Curva ABC sai do maior saldo para o menor.

Uma única seleção por filtro: a tela envia só o primeiro item marcado de Filial, Emitente, Vendedor e Região (o seletor é de escolha única).

Sem cotação: o aging não converte moeda; só a Curva ABC usa o câmbio gravado em cada título.

Comentário defasado no código: o RelatorioAgingRequest ainda cita “(31996)” no cabeçalho; a opção é a 316A.

Permissão de dados: o endpoint não consulta a opção do usuário (só o JWT e as filiais). Quem não tem a 316A no menu não abre a tela, mas uma chamada direta com token válido funciona.

Nenhuma regra bate com essa busca. Tente um trecho menor da mensagem, ou limpe os filtros.