# Tela Consultas (CAMT): widget de saldo duplo + histórico por aba

Data: 2026-07-15. Pedido do dono: cada aba da tela é um tipo de consulta camt.060
diferente, então o histórico não pode ser um só para todas; e a tela precisa de um
widget de saldo com DUAS fontes — o saldo em tempo real conforme entradas e saídas
do PIX, e o saldo proveniente da consulta camt.060.

## Widget de saldo duplo

Duas fontes que já existem no modelo (`monetarie_spi.balances`), agora expostas
lado a lado:

1. **Espelho PIX (tempo real)** = `available + blocked` da posição da instituição.
   É o espelho local: PIX recebido credita, envio debita na confirmação do hold,
   devolução recebida credita (caminhos corrigidos em 15/07), e a camt.053 re-ancora
   a posição. O widget re-busca a cada 10 segundos e após cada consulta.
2. **Confirmado BACEN (camt.060)** = `confirmed`/`confirmed_at`, gravados apenas
   quando uma camt.053 do BACEN chega. Botão "Consultar BACEN" dispara a saldo-atual
   (mesma máquina da aba, sem bloquear a tela) e re-busca quando a resposta chega.

Entre os dois, a faixa "movimento local desde a confirmação" (= espelho − confirmado):
zero significa conciliado; diferente de zero é o valor líquido dos movimentos
liquidados depois da última confirmação — divergência aparece na cara, sem inventar
métrica (o "+0.00% intraday" do Painel era um campo ausente, não um cálculo).

Backend: `Balances.list_all_positions/1` passou a expor `confirmed`/`confirmed_at`
(endpoint `GET /api/v1/balance/positions`, já proxiado pelo gateway), e a posição da
instituição vem sempre primeiro (resolução de ISPB pela mesma cadeia do
InboundProcessor: config `:institution_ispb` → participante BACEN).

## Histórico por aba

O backend sempre filtrou por `action` (`GET /api/v1/camt060/requests?action=...`);
a tela é que não usava. Agora o histórico nasce filtrado pela aba ativa, recarrega
na troca de aba e tem o seletor "Esta consulta / Todas".

## Testes

`balances_positions_test.exs` (novo): posição expõe confirmed/confirmed_at e a
instituição vem primeiro mesmo com `as_of` mais velho que o de uma contraparte
(cenário real de PROD 15/07). Suíte spi_service 804/0.
