FJFrigo · Indicadores · menu 3-8 Indicadores

Exposição Cambial

A posição em moeda estrangeira da empresa inteira numa data — contas, a receber, a pagar e empréstimos —, valorizada pelas cotações de compra e venda, com a variação do dia, a sensibilidade ao câmbio e a antecipação do fechamento 25E. De onde vem cada número e como conferir no banco.

Opção: 3176 Origem: desenho novo (sem legado) Saída: tela (a antecipação imprime) Base de teste: fjfrigo_concepcion (Paraguai 001)

Regra

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

Aviso

A tela funciona, mas com um comportamento que surpreende.

Bloqueia

A chamada é recusada: 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 › 8-Indicadores › K-Exposição Cambial (3176)

Desenho novo (27/09/2026), sem equivalente no legado nem no ceif, pensado para Paraguai e Bolívia, onde a empresa carrega posição em dólar, real e euro. É uma tela (não gera arquivo): a posição em moeda estrangeira da empresa inteira, numa data, com valorização, sensibilidade ao câmbio e a antecipação do fechamento 25E.

ItemValor
TelaExposição Cambial (3176) — ExposicaoCambial.vue; botão Atualizar; imprime a antecipação do 25E por BotaoImprimirGrade
EndpointsGET /lancamento/exposicao-cambial/ cotacoes, contas, titulos, titulos/lista, fechamento — ExposicaoCambialService (pacote cadastro.exposicaocambial)
Código da opção3176 só existe no web (livre em opcao_sistema; o 31996 do legado é outra coisa). Saiu de 3-1-7 Banco para 8-Indicadores em 03/10/2026 mantendo o mesmo idOpcao: as permissões do 444 continuam valendo
QuadroPosição líquida em moeda local, Variação pela última cotação, e uma linha por moeda estrangeira: Cotação (compra / venda), Contas bancárias, A receber, A pagar, Empréstimos, Posição líquida, Em moeda local, Variação do dia, Juros/IVA a vencer (fora)
CliqueCada valor abre a lista que o compõe: as contas da moeda, ou os títulos (até 3.000, maiores primeiro) do grupo
SensibilidadeChoques −10%, −5%, +5%, +10% e um “choque livre” ±N% (padrão 20), por moeda e no total, mais dois gráficos (composição por moeda e ganho/perda por cenário). Conta feita na tela, sem backend novo
Antecipação do 25EO que o fechamento cambial (25E) lançaria se o mês fechasse nesta data, conta a conta, sem gravar (FechamentoCambialService.simular)
B

Filtros e opções

Não há filtros de relatório

A tela tem um só filtro. Não há moeda nem ordenação no painel de Opções porque a posição já é por moeda estrangeira.

CampoPadrãoO que faz
Data de referênciahoje (máximo hoje)Tudo é calculado até esta data: saldo das contas, baixas dos títulos e as cotações. Trocar a data recarrega e limpa a antecipação do 25E
Atualizar—Recalcula ignorando a leitura guardada (recalcular=true). Sem ele, contas, títulos e fechamento ficam 5 minutos em memória por banco e data
Choque livre ±N %20Acrescenta −N% e +N% aos cenários fixos (−10, −5, +5, +10); só afeta a tabela e o gráfico de cenários
Sem os vencidos há mais de 1 anodesligadoNa sensibilidade, tira do a receber e do a pagar o que vence há mais de 365 dias (valorAntigos). Não altera a posição do quadro
Calcular / Recalcular (25E)—Roda a antecipação do fechamento; só carrega quando clicado
C

De onde vem cada número

Tabelas, colunas e filtros SQL
Regra

Escopo: a empresa inteira, todas as filiais

EfeitoContas, títulos e antecipação não passam por FiliaisDoUsuario: somam o banco todo, qualquer que seja o usuário. É por desenho (“empresa inteira”). O único dado da sessão que entra é a filial atual, para saber a moeda local (filial.idmoeda_local) e, na antecipação, os parâmetros contábeis.

Moeda estrangeiraTudo o que tem idmoeda <> moeda local: fe.idmoeda nos títulos e conta_bancaria.idmoeda nas contas.

Todos
Regra

Contas bancárias da moeda

SaldoSoma do movimento só na moeda da própria conta (a regra do Boletim 3172): lançamentos financeiro_lancamento_banco (IF(tipo_lancamento_bancario.operacao='E', valor, −valor), com flb.idmoeda = conta.idmoeda) mais baixas financeiro_baixas (R soma, P subtrai, com fe.idmoeda = conta.idmoeda), todos vivos e com data < referência + 1 dia.

Quais contascb.idmoeda <> local, ativas na data (data_desativacao nula ou ≥ referência + 1 dia) e saldo com |saldo| > 0,004. Mostra grupo, banco, filial e o último movimento.

Por quêUma baixa em guarani lançada numa conta em dólar não é dólar.

Todos
Regra

Títulos em aberto: quatro grupos

SaldoA conta do 221: parcela − Σ(valor − acréscimo − juros + desconto + devolução + retenção) das baixas vivas com b.data_baixa < referência + 1 dia; só saldo > 0,004. Emissão < referência + 1 dia.

A receber descontadoNOT (tipo_emissao='R' AND descontado='T'): o descontado fica fora (o dinheiro já veio do banco).

RECEBERtipo_emissao = 'R'.

EMPRÉSTIMOtipo_faturamento.emprestimo = 'S' e o título é a pagar (principal).

ENCARGOSTítulo de empréstimo com idtipo_parcela 3 ou 4 (juros e IVA a vencer). Ficam fora da posição (ainda não incorreram e o 25E não os reavalia), só informados na última coluna.

PAGAROs demais a pagar.

+1 anoVencimento anterior a referência − 365 dias: mostrado à parte em cada total (quantidade e valor).

Todos
Regra

Cotações: atual e anterior

EscolhaPor moeda, as duas últimas datas com cotação lançada até a referência (moeda_valores, agrupado por dia com MAX de valor, valor_compra e valor_venda).

Ativo × passivoAtivo (contas e a receber) pela cotação de compra; passivo (a pagar e empréstimos) pela de venda — a convenção do 25E. Compra ou venda zerada: vale a cotação financeira (valor).

Sem cotaçãoA moeda aparece com “sem cotação”, sem valor em moeda local nem variação; fica fora da sensibilidade e a tela a lista.

Todos
Regra

Posição líquida, valor em moeda local e variação do dia

Posição líquida(contas + a receber) − (a pagar + empréstimos), na moeda estrangeira. Encargos fora.

Em moeda localAtivo × cotação de compra − passivo × cotação de venda.

Variação do diaAtivo × (compra atual − compra anterior) − passivo × (venda atual − venda anterior); em branco sem cotação anterior.

Cotação velhaCotação com data anterior à referência aparece destacada.

Todos
Regra

Sensibilidade

ContaImpacto = posição líquida em moeda local × choque ÷ 100, por moeda e no total. Posição positiva ganha quando a moeda sobe; negativa perde.

ComposiçãoContas e a receber × compra; a pagar e empréstimos × venda (negativos). Encargos fora; moeda sem cotação fora.

Todos
Regra

Antecipação do 25E

O que éA mesma consulta e o mesmo laço da segunda passada do fechamento cambial (25E), sem gravar: compara o saldo em moeda local já contabilizado com o saldo reavaliado, do 1º de janeiro até a referência, conta a conta.

CotaçãoA última cotação de cada moeda até a data (e não a do último dia do mês, como o fechamento real).

ResultadoGanho, Perda e Resultado líquido; contas com variação zero saem; conta sem cotação volta marcada (“sem cotação”) em vez de sumir.

Todos
D

Recusas e avisos

Mensagens exatas
Bloqueia

A data de referência não pode ser depois de hoje.

QuandoData futura (a tela limita o seletor a hoje).

Todos
Bloqueia

Data inválida: texto

QuandoData fora de yyyy-MM-dd (só por chamada direta).

Todos
Bloqueia

A filial está sem moeda local (filial.idmoeda_local).

QuandoA filial da sessão não tem moeda local cadastrada.

Todos
Bloqueia

A moeda local não tem exposição cambial. / Informe o grupo de títulos.

QuandoChamada direta da lista de títulos com a moeda local, ou sem o grupo.

Todos
Aviso

Nenhuma posição em moeda estrangeira na data.

QuandoBanco sem contas nem títulos fora da moeda local na data. No central tudo está na moeda local; teste num banco paraguaio (ex. fjfrigo_concepcion).

Todos
Aviso

Lista de títulos limitada a 3.000

EfeitoA lista dos títulos de um grupo traz os 3.000 maiores (a tela avisa “Mostrando os 3.000 maiores.”); o total do quadro continua completo.

Todos
Aviso

Valores guardados por 5 minutos

EfeitoDois usuários do mesmo banco veem a mesma leitura por até 5 minutos; um lançamento novo só aparece após Atualizar. A antecipação do 25E tem o mesmo cache, por data.

Todos
Aviso

Demora

MedidoNo fjfrigo_concepcion: contas ~6 s, títulos ~6 s (975 mil títulos em moeda estrangeira), antecipação 7–10 s.

Todos
Aviso

Cotação lançada, mas do dia anterior

EfeitoA cotação “atual” é a última até a referência; fim de semana e feriado usam a de dias antes e a coluna sai destacada. A variação do dia é, na verdade, “última × anterior lançada”.

Todos
E

Configurações que mudam o resultado

O que o suporte confere antes de abrir chamado
ConfiguraçãoOndeEfeito
Moeda localfilial.idmoeda_local da filial da sessãoDefine o que é “estrangeiro”. Entrar em outra filial com outra moeda local muda toda a posição
Cotaçõesmoeda_valores (cadastro 21): valor, valor_compra, valor_vendaValorização e variação; sem lançamento a moeda fica “sem cotação”
Empréstimotipo_faturamento.emprestimo = 'S'Separa EMPRÉSTIMO/ENCARGOS dos demais a pagar
Tipo de parcelafinanceiro_emissao.idtipo_parcela (3 e 4)O que é “juros/IVA a vencer” (fora da posição)
Descontadofinanceiro_emissao.descontadoTira o título do a receber (conferido em 04/10/2026: financeiro_emissao.descontado é NOT NULL com padrão 'F' nos 12 bancos do servidor de homologação — a comparação sem IFNULL não perde linha; a coluna que aceita nulo é financeiro_baixas.descontado, que o 3176 não usa)
Contas desativadasconta_bancaria.data_desativacaoConta desativada até a data sai
Parâmetros contábeisfilial / parametros (U.D.F. contábil, conta de diferença cambial)Só a antecipação do 25E
F

Casos de teste sugeridos

Resultado esperado e como conferir no banco
Teste

T1 — Títulos por moeda e grupo contra SQL

ComoNo fjfrigo_concepcion (local 111), data de referência 31/08/2026, compare os totais A receber / A pagar / Empréstimos / Juros-IVA do quadro com a SQL.

EsperadoIgualdade nos valores e quantidade (a quantidade vem no “abrir lista”). Referência medida em 04/10/2026: moeda 112 — EMPRÉSTIMO 48 / 417.053.414,71; ENCARGOS 157 / 69.862.692,22; PAGAR 2.848 / 55.789.776,90; RECEBER 4.299 / 403.190.380,62. Moeda 113 — PAGAR 12 / 489.584,90, RECEBER 16 / 647.337,70. Moeda 114 — PAGAR 40 / 924.486,94, RECEBER 7 / 680.419,34. Os números mudam com baixas retroativas.

SELECT t.idmoeda, t.grupo, COUNT(*) AS n, ROUND(SUM(t.pend),2) AS valor FROM (
 SELECT fe.idmoeda,
        CASE WHEN fe.tipo_emissao='R' THEN 'RECEBER'
             WHEN tf.emprestimo='S' AND fe.idtipo_parcela IN (3,4) THEN 'ENCARGOS'
             WHEN tf.emprestimo='S' THEN 'EMPRESTIMO' ELSE 'PAGAR' END AS grupo,
        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 LEFT JOIN tipo_faturamento tf ON tf.id=fe.idtipo_faturamento
  WHERE fe.excluido<>'T' AND fe.idmoeda <> (SELECT idmoeda_local FROM filial WHERE id_filial = 1)
    AND fe.tipo_emissao IN ('P','R') AND NOT (fe.tipo_emissao='R' AND fe.descontado='T')
    AND fe.data_emissao < DATE_ADD('2026-08-31', INTERVAL 1 DAY)) t
WHERE t.pend > 0.004 GROUP BY 1,2 ORDER BY 1,2
Todos
Teste

T2 — Contas bancárias só com o movimento da moeda

ComoAbra “Contas bancárias” de uma moeda e compare as primeiras contas com a SQL.

EsperadoMesmo saldo e mesma data de último movimento. Referência (31/08/2026, fjfrigo_concepcion): ADTO ALL PAR CASINGS U$ 21.480.007,18 (último 18/08/2026); DISTRIBOI - ROLIM DE MOURA 10.195.892,94; DISTRIBOI - JI PARANA 8.767.166,24; CAJA BFC DOLARES 6.056.083,21; BANCO SUDAMERIS CCC USD 3.183.229,15.

SELECT cb.id, cb.descricao, cb.idmoeda, ROUND(SUM(x.valor),2) AS saldo, MAX(x.data) AS ultimo
  FROM conta_bancaria cb
  JOIN (SELECT flb.idconta_bancaria, IF(tlb.operacao='E', flb.valor, -flb.valor) AS valor, flb.data
          FROM financeiro_lancamento_banco flb
          JOIN conta_bancaria c1 ON c1.id = flb.idconta_bancaria AND flb.idmoeda = c1.idmoeda
          LEFT JOIN tipo_lancamento_bancario tlb ON tlb.id = flb.idtipo_lancamento_bancario
         WHERE flb.excluido <> 'T' AND flb.data < DATE_ADD('2026-08-31', INTERVAL 1 DAY)
        UNION ALL
        SELECT fb.idconta_bancaria, IF(fe.tipo_emissao='R', fb.valor, -fb.valor), fb.data_baixa
          FROM financeiro_baixas fb
          JOIN conta_bancaria c2 ON c2.id = fb.idconta_bancaria
          JOIN financeiro_emissao fe ON fe.id = fb.idfinanceiro_emissao AND fe.idmoeda = c2.idmoeda
         WHERE fb.excluido <> 'T' AND fb.data_baixa < DATE_ADD('2026-08-31', INTERVAL 1 DAY)) x
    ON x.idconta_bancaria = cb.id
 WHERE cb.idmoeda <> (SELECT idmoeda_local FROM filial WHERE id_filial = 1)
   AND (cb.data_desativacao IS NULL OR cb.data_desativacao >= DATE_ADD('2026-08-31', INTERVAL 1 DAY))
 GROUP BY cb.id, cb.descricao, cb.idmoeda
HAVING ABS(saldo) > 0.004
 ORDER BY cb.idmoeda, saldo DESC
 LIMIT 5
Todos
Teste

T3 — Valorização compra × venda

ComoEscolha uma moeda com cotação de compra e de venda diferentes. Calcule à mão: (contas + a receber) × compra − (a pagar + empréstimos) × venda.

EsperadoBate com “Em moeda local”. Se a compra (ou a venda) for zero, vale a cotação financeira nos dois lados.

Todos
Teste

T4 — Variação do dia

ComoCom a cotação atual de 31/08 e a anterior de 30/08 (ou a imediatamente anterior lançada), recalcule ativo × Δcompra − passivo × Δvenda.

EsperadoIgual à coluna “Variação do dia” e, somada, ao cartão “Variação pela última cotação”. Moeda sem cotação anterior: “—”.

Todos
Teste

T5 — Sensibilidade

ComoNote a Posição em moeda local de uma moeda e o choque +10%.

EsperadoO impacto é posição × 0,10; o Total soma as moedas com cotação. Mudar o “Choque livre” para 15 acrescenta as colunas −15% e +15%. Marcar “Sem os vencidos há mais de 1 ano” reduz receber e pagar (referência de 31/08/2026 em fjfrigo_concepcion: posição total −1.949.082.099.753 G$ com os antigos e −3.322.045.953.216 G$ sem os vencidos de +1 ano, conferido à mão em 03/10).

Todos
Teste

T6 — Antecipação do 25E igual ao fechamento gravado

ComoNum mês já fechado pelo 25E (ex.: 31/07/2026 em fjfrigo_concepcion), clique Calcular com essa data.

EsperadoA reavaliação sai igual à gravada (conta 1155: 340.497; conta 1162: 51.306.376 em 28/09). A diferença que sobra é de lançamentos incluídos depois do fechamento (262 linhas em 28–29/08, conta 1157). Mudar a data recalcula; a antecipação não grava nada (conferir contabilidade_analitico sem linhas novas).

Todos
Teste

T7 — Recusas e cache

ComoDigite data futura numa chamada direta; lance um título em dólar e reabra sem Atualizar; depois clique Atualizar.

Esperado“A data de referência não pode ser depois de hoje.”; sem Atualizar a leitura de até 5 minutos atrás; com Atualizar o título novo aparece.

Todos
Teste

T8 — Base sem moeda estrangeira

ComoAbra a tela no central (tudo na moeda local).

Esperado“Nenhuma posição em moeda estrangeira na data.” e sem gráficos.

Todos
G

Limitações e pendências

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

Status: REVISAR (03/10/2026). A sensibilidade e os gráficos de 03/10 só foram conferidos em prévia temporária (retorno real do fjfrigo_concepcion em 31/08/2026: posição total −1.949.082.099.753 G$, +10% = −194,9 bi G$). Sem teste na tela real.

Empresa inteira: sem o alcance por filial do usuário (diferente dos relatórios 316x). Usuário com poucas filiais vê o grupo todo.

Sem opção de salvar filtros e sem exportação do quadro principal (só a antecipação do 25E imprime).

Contas negativas (cheque especial) são valorizadas pela cotação de compra, como as positivas (a regra é “contas = ativo”).

Encargos (juros/IVA de empréstimo a vencer) ficam sempre fora da posição e da sensibilidade.

Moeda local única: o serviço usa a moeda local da filial da sessão; banco com filiais de moedas locais diferentes não é tratado.

Defeitos achados no caminho (já corrigidos em 27/09): o 25E e o 25G gravavam a variação com somente_conversao='F' (o legado grava 'T'); o fluxo de caixa somava na conta o movimento de outras moedas.

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