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

Prazos Médios e Ciclo Financeiro

PMR, PMP e ciclo financeiro: o prazo concedido, o realizado e o atraso médio das baixas do período, ponderados pelo valor, e o prazo pelo saldo em aberto. De onde vem cada número, as recusas com a mensagem exata e casos de teste com a SQL de conferência.

Opção: 316B 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 › B

Desenho novo (27/09/2026), sem equivalente no legado nem no ceif. Duas medidas que respondem perguntas diferentes: o prazo que aconteceu (nas baixas do período) e o prazo que o saldo em aberto sugere.

ItemValor
TelaPrazos Médios e Ciclo Financeiro (316B) — RelatorioPrazosMedios.vue; botões XLS e Gerar PDF
EndpointPOST /lancamento/relatorios/relatorioPrazosMedios — RelatorioPrazosMediosService
Reaproveitado porO painel Capital de Giro (38H) usa realizadoPorMes (a mesma consulta, sem grade) e a permissão da 316B
Por mês (padrão)Uma linha por mês da baixa: a receber (Recebido, Prazo concedido, PMR, Atraso médio, % no prazo) e a pagar (Pago, Prazo concedido, PMP, Atraso médio, % no prazo) lado a lado, mais o Ciclo (PMR−PMP); linha “Período”; e a seção Pelo saldo
Por cliente/fornecedorUma linha por emitente (um lado só: R ou P), do maior valor para o menor, com % do total e Baixas; linha Total
Não existePrazo médio de estoque (PME): o ciclo é o financeiro, não o operacional
B

Filtros e opções

Moeda e agrupamento ficam no painel de Opções

O período é o das baixas (data do pagamento/recebimento), no máximo dois anos.

CampoOndePadrãoO que faz
Baixas de / atéFiltro1º de janeiro do ano · hojePeríodo das baixas, b.data_baixa >= de AND < até + 1 dia. Obrigatórios
FilialFiltrotodas as do usuárioUma filial (pela filial do título, fe.idfilial)
EmitenteFiltrotodosfe.idemitente
VendedorFiltrotodosCOALESCE(NULLIF(fe.idvendedor,0), e.idvendedor, 0)
Agrupar porOpçõesMêsMês (receber e pagar com ciclo) ou Cliente/fornecedor
Tipo (por cliente/fornecedor)OpçõesA receberSó vale no agrupamento por emitente; no por mês saem os dois lados
Moeda filtroOpçõesTodasLimita à moeda de origem do título (fe.idmoeda). Os valores saem sempre em moeda local, pelo câmbio gravado no título
Só títulos de compra e vendaOpçõesligadoExige fe.idfaturamento > 0 pareado com fe.idtipo_faturamento > 0 de um tipo que existe (tf.id IS NOT NULL) e que não é empréstimo (IFNULL(tf.emprestimo,'N') <> 'S'). Desligado, entram também empréstimos e lançamentos avulsos
Paisagem (PDF)OpçõesligadoOrientação do PDF
Filtros salvos ★ / Exibir filtrosComuns—Código de salvamento 316B
C

De onde vem cada número

Tabelas, colunas e filtros SQL
Regra

As três medidas do realizado (das baixas do período)

PesoCada baixa pesa o seu valor amortizado em moeda local: (b.valor − b.valor_acrescimo − b.valor_juros + b.valor_desconto + b.valor_devolucao + b.valor_retencao) × IF(fe.valor_cambio > 0, fe.valor_cambio, 1) (a conta do 221). Baixa com amortização ≤ 0 não entra.

Prazo concedidoDATEDIFF(fe.data_vencimento, fe.data_emissao), média ponderada.

PMR / PMP (prazo realizado)DATEDIFF(b.data_baixa, fe.data_emissao), média ponderada — PMR no lado R, PMP no lado P.

Atraso médioDATEDIFF(b.data_baixa, fe.data_vencimento), ponderado; negativo quando pago antes do vencimento.

% no prazoParte do valor baixado com DATE(b.data_baixa) <= DATE(fe.data_vencimento) — pagar no próprio dia do vencimento conta como no prazo.

ArredondamentoPrazos em 1 casa decimal; % em 2.

Todos
Regra

Quais baixas e títulos entram

Baixab.excluido <> 'T' e data no período. O título: fe.excluido <> 'T', data_emissao e data_vencimento preenchidas, tipo_emissao IN ('R','P').

DescontadoA receber com descontado = 'T' fica fora.

Só faturamento (padrão)Evita que o PMP misture fornecedor com banco e imposto. O corte é “tem idfaturamento pareado com um tipo de faturamento que existe e não é empréstimo” — a regra do projeto (idfaturamento é compartilhado entre módulos). Até 04/10/2026 bastava idfaturamento > 0, e título com idfaturamento sem tipo passava pelo IFNULL do LEFT JOIN. Medido em 04/10/2026 (baixas de jan–set/2026): no central e no fjfrigo_concepcion todo título com idfaturamento > 0 já tem tipo existente — os números não mudam.

CicloPMR − PMP do mês; só sai se os dois lados têm baixa no mês.

Todos
Regra

Agrupamento por mês

MêsMês da baixa (DATE_FORMAT(b.data_baixa, '%Y-%m')), não o da emissão.

Linha “Período”Soma dos meses; os prazos da linha são ponderados pelo total, não a média dos meses.

Todos
Regra

Seção “Pelo saldo” (só no agrupamento por mês)

Saldo em aberto na data finalTodos os títulos R/P emitidos até a data final (de qualquer época) menos as baixas até a data final, GREATEST(saldo, 0) × câmbio do título; descontado fora; mesmos filtros (inclusive “só faturamento”).

Emitido no períodovalor_parcela × câmbio dos títulos emitidos entre as duas datas, tenham sido baixados ou não.

Média diária emitidaEmitido ÷ (dias do período, contando os dois extremos).

Prazo médio pelo saldoSaldo ÷ média diária (dias). É a fórmula de balanço, a que o mercado usa.

Sem os vencidos há +1 anoO mesmo, mas só com o saldo cujo vencimento é ≥ data final − 365 dias (venc >= DATE_SUB(fim, INTERVAL 365 DAY)); título sem vencimento não entra nessa variante.

Linhas da seçãoSaldo, Emitido, Média diária, Prazo pelo saldo, Saldo sem os vencidos, Prazo sem os vencidos, Prazo realizado nas baixas (o PMR/PMP do período), Ciclo pelo saldo, Ciclo sem os vencidos.

Todos
Regra

Agrupamento por cliente/fornecedor

LinhasUm emitente por linha, no lado escolhido, ordenado pelo valor baixado (decrescente). Sem emitente: “(sem emitente)”.

ColunasCódigo, Cliente/Fornecedor, Recebido/Pago, % do total, Prazo concedido, PMR (ou PMP), Atraso médio, % no prazo, Baixas.

Todos
D

Recusas e avisos

Mensagens exatas
Bloqueia

Informe a data inicial. / Informe a data final.

QuandoPeríodo em branco (chamada direta; a tela nasce com o ano corrente).

Todos
Bloqueia

A data final não pode ser anterior à inicial.

QuandoPeríodo invertido.

Todos
Bloqueia

O período pode ter no máximo dois anos.

QuandoMais de 731 dias entre as duas datas.

Todos
Bloqueia

A filial N não está entre as filiais do usuário. / O usuário não tem filial de acesso.

QuandoFilial sem acesso, ou usuário sem nenhuma filial.

Todos
Bloqueia

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

QuandoNenhuma baixa no período e nos filtros (por mês ou por emitente).

PegadinhaCom “Só títulos de compra e venda” ligado, uma base cujas baixas vêm de títulos sem idfaturamento sai vazia.

Todos
Aviso

Sem cotação: não há aviso

EfeitoO relatório não consulta cotação de moeda; usa o valor_cambio do título e, se ele for 0 ou nulo, câmbio 1. Título em dólar com câmbio zerado entra pelo valor em dólar como se fosse local.

Todos
Aviso

Prazos “pelo saldo” saem enormes em base com histórico

Por quêO saldo inclui títulos antigos nunca baixados; em homologação isso dá prazos de milhares de dias. A variante “sem os vencidos há mais de 1 ano” existe para isso.

Todos
Aviso

O realizado só vê o que foi pago

EfeitoTítulo nunca pago não entra no PMR/PMP; um calote melhora o prazo médio. Leia junto com o Aging (316A) e a seção “Pelo saldo”.

Todos
Aviso

Tempo de geração

MedidoFilial 3 ~13 s; tenant inteiro 60–75 s (a seção “Pelo saldo” varre todo o histórico). A tela mostra Gerando… (Ns).

Todos
E

Configurações que mudam o resultado

O que o suporte confere antes de abrir chamado
ConfiguraçãoOndeEfeito
Tipo de faturamento = empréstimotipo_faturamento.emprestimo = 'S' (cadastro 18x)Com “Só compra e venda”, o tipo marcado sai. Tipo de empréstimo sem a marca entra no PMP
Câmbio do títulofinanceiro_emissao.valor_cambioConverte tudo para moeda local; 0/nulo = 1
Descontadofinanceiro_emissao.descontadoTira o título do lado R
Filiais do usuáriousuario_filialAlcance; a filial é a do título
Vendedor do cadastroemitente.idvendedorFiltro Vendedor herda quando o título não tem
Datas do títulodata_emissao, data_vencimentoSem uma das duas o título sai de todo o realizado
F

Casos de teste sugeridos

Resultado esperado e como conferir no banco
Teste

T1 — O mês bate com uma SQL independente

ComoGere Por mês, 01/08/2026 a 31/08/2026, filial 3, opções padrão. Compare a linha de agosto com a SQL abaixo.

EsperadoIgualdade nos valores e nos prazos (1 casa). Referência medida em 04/10/2026 no central: A receber 538 baixas, 2.473.623,91, prazo realizado 12,4, concedido 12,5, no prazo 77,52%; A pagar 26 baixas, 47.766,46, PMP 1,3, concedido 4,8, no prazo 97,06%. Ciclo = 12,4 − 1,3 = 11,1.

SELECT fe.tipo_emissao, COUNT(*) AS baixas,
       ROUND(SUM(w.amort*IF(fe.valor_cambio>0,fe.valor_cambio,1)),2) AS valor_local,
       ROUND(SUM(w.amort*IF(fe.valor_cambio>0,fe.valor_cambio,1)*DATEDIFF(w.data_baixa,fe.data_emissao))
             /SUM(w.amort*IF(fe.valor_cambio>0,fe.valor_cambio,1)),1) AS prazo_realizado,
       ROUND(SUM(w.amort*IF(fe.valor_cambio>0,fe.valor_cambio,1)*DATEDIFF(fe.data_vencimento,fe.data_emissao))
             /SUM(w.amort*IF(fe.valor_cambio>0,fe.valor_cambio,1)),1) AS prazo_concedido,
       ROUND(100*SUM(IF(DATE(w.data_baixa)<=DATE(fe.data_vencimento),w.amort*IF(fe.valor_cambio>0,fe.valor_cambio,1),0))
             /SUM(w.amort*IF(fe.valor_cambio>0,fe.valor_cambio,1)),2) AS pct_no_prazo
FROM (SELECT b.idfinanceiro_emissao, b.data_baixa,
             (b.valor-b.valor_acrescimo-b.valor_juros+b.valor_desconto+b.valor_devolucao+b.valor_retencao) AS amort
        FROM financeiro_baixas b
       WHERE b.excluido <> 'T' AND b.data_baixa >= '2026-08-01'
         AND b.data_baixa < DATE_ADD('2026-08-31', INTERVAL 1 DAY)) w
JOIN financeiro_emissao fe ON fe.id = w.idfinanceiro_emissao
LEFT JOIN tipo_faturamento tf ON tf.id = fe.idtipo_faturamento
WHERE w.amort > 0 AND fe.excluido <> 'T' AND fe.data_emissao IS NOT NULL AND fe.data_vencimento IS NOT NULL
  AND NOT (fe.tipo_emissao = 'R' AND IFNULL(fe.descontado,'') = 'T')
  AND fe.tipo_emissao IN ('R','P') AND fe.idfilial = 3
  AND fe.idfaturamento > 0 AND fe.idtipo_faturamento > 0 AND tf.id IS NOT NULL AND IFNULL(tf.emprestimo,'N') <> 'S'
GROUP BY fe.tipo_emissao
Todos
Teste

T2 — Desligar “Só compra e venda”

ComoRepita o T1 sem a caixa.

EsperadoMais baixas e prazos diferentes (entram empréstimos e avulsos); a SQL do T1 sem a última linha do WHERE (a linha de idfaturamento e emprestimo) deve voltar a bater.

Todos
Teste

T3 — Ponderação pelo valor

ComoNum cliente com duas baixas de valores muito diferentes no mês (por emitente), calcule a mão (v1·d1 + v2·d2) ÷ (v1 + v2).

EsperadoO PMR da linha do cliente é a média ponderada, não a simples. Atraso negativo quando pagou antes.

Todos
Teste

T4 — % no prazo no limite

ComoBaixa feita exatamente na data de vencimento (mesmo dia, hora diferente).

EsperadoConta como no prazo (compara DATE() dos dois lados) e o atraso dela é 0.

Todos
Teste

T5 — Por cliente fecha com o mês

ComoGere Por cliente (A receber) para o mesmo mês do T1.

EsperadoA linha Total tem o mesmo valor, prazos e quantidade de baixas da coluna A receber do T1.

Todos
Teste

T6 — Seção Pelo saldo

ComoNo relatório por mês, confira Saldo em aberto e Emitido com SQL própria (títulos R, data_emissao <= data final, saldo = parcela − baixas até a data final).

EsperadoPrazo pelo saldo = Saldo ÷ (Emitido ÷ dias do período). A linha “Prazo médio realizado” repete o PMR/PMP do total do período.

Todos
Teste

T7 — Recusas

ComoPeríodo de 3 anos; datas invertidas; período sem baixas; filial sem acesso.

EsperadoAs mensagens da seção D.

Todos
G

Limitações e pendências

docs/status-porte.csv e docs/melhorias-relatorios-financeiros.md (3.2)

Status: REVISAR (02/10/2026). Feito em 27/09/2026, conferido no central por harness (os meses batem com SQL independente) mas sem teste de tela.

Sem PME: o ciclo é o financeiro (PMR − PMP). O prazo de estoque só entrará quando a foto do 2392 tiver histórico (painel 38H).

Moeda: sem conversão por cotação do dia e sem aviso de cotação faltando (diferente dos relatórios 311–315).

Só um item por filtro: a tela envia o primeiro marcado de Filial, Emitente e Vendedor.

Sem opção de ordenação: por mês sai cronológico; por emitente, do maior valor para o menor.

Painel 38H: reaproveita a mesma consulta mês a mês; divergência entre o painel e este relatório é, em geral, diferença de filtro.

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