# Dossie de paridade PROFUNDO — Front: Saldos + Contabil + DICT + Multiliquidacao

Auditoria read-only, zero inferencia. Legado = LegadoPIX CRK/Corner (.NET decompilado + SQL Server vivo + Angular).
Nosso = Monetarie PIX (Elixir/Phoenix umbrella `pix/backend` + Vue3 `pix/frontend/admin`).
Metodo: (1) legado com prova (arquivo:linha / tabela.coluna); (2) nosso com prova; (3) gap ou coberto.
Convencao de unidade: legado em REAIS decimais (`numeric(18,2)`); nosso em centavos/base_units.

Legenda gap_type: `ausente` (existe no legado, nao no nosso) | `divergencia` (existe nos dois com comportamento diferente) | `parcial` (existe parcialmente) | `coberto` (paridade real).

---

## 0. Inventario de telas (tela a tela)

### Legado Angular (app SPI unico, janelas Kendo; `Pix/SPI/angular/src/app/pages/`)

| Front | Tela legado | Componente/arquivo |
|---|---|---|
| Saldos | Detalhamento de Saldo | `spi/saldos/saldos.component.ts` |
| Saldos | Solicitar Credito / Debito / Aporte | `spi/saldos/solicitacao_saldo/` + `incluir_req_saldo/` |
| Saldos | Parametrizacao de Saldos | `spi/saldos/saldos-parametrizacao/create-edit/` |
| Contabil | Plano de Contas (Inclui/Altera/Exclui) | `spi/contabilizacao/cadastro/plano-contas/{incluir,alterar}` |
| Contabil | Historico Padrao (Inclui/Altera) | `spi/contabilizacao/cadastro/historico-padrao/{incluir,alterar}` |
| Contabil | Centro de Custo (Inclui/Altera) | `spi/contabilizacao/cadastro/centro-custo/{incluir,alterar}` |
| Contabil | Eventos Contabeis (Inclui/Altera) | `spi/contabilizacao/cadastro/eventos-contabeis/{incluir,alterar}` |
| Contabil | Monitor Contabil (+ BaixaArquivo) | `spi/contabilizacao/monitor/monitor-contabil/` |
| DICT | Chaves (consulta/inclui/altera/bloqueio/exclui/sincronismo) + detalhe + editar | `dict/monitoracao/chaves/{,detalhe,editar}` |
| DICT | Devolucoes (Dev Especial: incluir/consultar/fechar/cancelar) | `dict/monitoracao/devolucao/{incluir,detalhe,fechar}` |
| DICT | Reivindicacoes (posse/portabilidade ciclo completo) | `dict/monitoracao/reivindicacoes/` |
| DICT | Relatos de Infracao (incluir/consultar/fechar/cancelar) | `dict/monitoracao/infracao/` |
| DICT | Indicadores | `dict/monitoracao/indicadores/` + `dict/dashboard/indicadores` |
| DICT | Politica de Limitacao | `dict/monitoracao/politicas/` |
| DICT | Relatorios (chaves/dev/reivindicacao/infracao) | `dict/relatorios/` |
| DICT | Parametrizacoes DICT | `dict/parametrizacao/` |
| Multiliquidacao | Pix Saque e Troco (monitor) | `multiliquidacao/monitoracao/pixsaquepixtroco/` |
| Multiliquidacao | Operacoes (ListarPix + incluir/tratar/cancelar/devolver) | `multiliquidacao/monitoracao/operacoes/{incluir,detalhe,devolucao}` |
| Multiliquidacao | Parametros de Sistema | `multiliquidacao/parametrizacao/` |

### Nosso Vue (`pix/frontend/admin/src/views/`)

| Front | Tela nossa | Arquivo |
|---|---|---|
| Saldos | Dashboard / Requests list+detail / History / Parameters / Credit / Debit / Aporte | `views/balance/*` |
| Contabil | Dashboard / Events / Monitor / ChartOfAccounts / CostCenters / StandardHistory / Netting / Reconciliation / Settlement / Fees | `views/accounting/*` |
| DICT | Keys (list/create/detail) | `views/keys/*` |
| DICT | Claims (list/detail) | `views/claims/*` |
| DICT | MED Hub / Infractions / FraudMarkers / FundsRecovery / Refunds | `views/med/*` |
| DICT | Indicators / Policies / Statistics / Reports | `views/dict/*` |
| Multiliquidacao | **NENHUMA** (existe so `views/participants/PixSaquePixTrocoView.vue`, monitor read-only) | — |

Telas legado SEM PAR no nosso: **toda a Multiliquidacao operacional** (operacoes incluir/tratar/cancelar/devolver, parametros de sistema multiliquidacao), **Historico Padrao (cadastro)**, **Politica de Limitacao DICT**, **editar/alterar chave DICT**.
Telas nossas SEM PAR no legado (extras, fora de escopo): Netting Cycles, Settlement Report, Fee Management (netting/tarifa do lado liquidacao). A Reconciliation nossa corresponde ao worker ConciliacaoUseCase do legado (nao a uma tela dedicada).

---

## 1. SALDOS

### 1.1 Detalhamento de Saldo (Conta PI x Reserva)

**Legado:** `saldos.component.ts:82-83` separa saldo por `debitoCredito` (1=deb, 2=cred) em parciais; a tela mostra **Saldo PI** (`SPI_SLD_API /api/SaldoSPI/find/{idIF}/{data}`) e **Saldo Reserva SPB** (`SaldoSPB/refresh/{idIF}/{data}`) — duas fontes distintas. Tabelas `crk_spi.dbo.SpiSaldo`, `SpiSaldoSpb`, `SpiSaldoCAMT` (todas confirmadas vivas).

**Nosso:** `views/balance/BalanceDashboardView.vue` via `stores/balance.ts`. Prova de ausencia de separacao real em `services/balance.ts:253-259` (comentario do proprio codigo): "O backend (list_all_positions) devolve uma linha por ISPB ... e NAO marca a conta como RB ou PI. Nao ha, hoje, separacao real entre Reserva Bancaria e Conta PI nesse retorno". Mapeia a 1a posicao como PI e a 2a como RB por ORDEM; a reserva "real" cai num fallback do snapshot SPB (`stores/balance.ts:47-83`). Backend: `SpiService.Balances.get_balance/1` sobre `monetarie_spi.balances` (schema `balance.ex`, campo unico por ispb, sem coluna PI vs reserva).

Verdict: **divergencia/parcial** (g2).

### 1.2 Solicitar Credito / Debito / Aporte de Saldo (ReqSaldo)

**Legado:** `solicitacao_saldo.service.ts:26` `POST SPI_SLD_API/api/ReqSaldo/add` com `idTipoRequisicao` (`solicitacao_saldo.component.ts:25`: "1-credito, 2-debito, 3-aporte") + `finlddLPI` (finalidade LPI). `enumMsgSaldo` = SolicitacaoCredito(1)/SolicitacaoDebito(2)/Aporte(3)/MetaSaldo(4). Persistido em `crk_spi.dbo.SpiReqSaldo` (**4084 linhas vivas**) + `SpiHistReqSaldo`. O PIX legado NAO emite STR de reserva: `ReqPagtoUseCase` integra com o SPB (TOPAZ/JD) para movimentar a Conta Reserva.

**Nosso:** telas existem — `CreditRequestView.vue:86` (`type:'CREDIT'`), `DebitRequestView.vue:125` (`type:'DEBIT'`), `LiquidityInjectionView.vue:134` (`type:'APORTE'`) — todas chamam `balanceStore.createRequest` → `balanceApi.createRequest` → `POST /api/v1/balance/requests` (`services/balance.ts:303`). O gateway repassa para o SPI: `spi_proxy_controller.ex:502-510` chama `InternalClient.call_spi(:post, "/api/v1/balance/requests", ...)`. **Mas o SPI nao tem essa rota**: `spi_service_web/router.ex` scope `/balance` so tem `get "/requests/pending"` (linha 111); nao ha `post "/requests"`, `put "/requests/:id/approve"` nem `/reject`. Resultado: criar/aprovar/rejeitar solicitacao de saldo → SPI 404 → gateway devolve erro. Fluxo nao funciona ponta a ponta.
Alem disso, `GET /balance/requests/pending` retorna **balance BLOCKS** (holds), nao ReqSaldo: `SpiService.Balances.list_pending_requests/1` (`balances.ex:716-740`) mapeia `BalanceBlock` (status active) como "request type balance_block" — semantica diferente da SpiReqSaldo.

Verdict: **ausente (backend)** — tela presente mas sem endpoint (g1, risco alto: parece funcional).

Nota lateral: as rotas admin `post "/balance/:ispb/inject|adjust|block|release"` (`router.ex:247-250`) referenciam acoes `inject_liquidity/adjust/create_block/release_block` que **nao existem** no `balance_controller.ex` (as unicas defs sao current/projected/history/summary/.../pending_requests; grep confirmou 0 def dessas acoes) — chamada dispara `UndefinedFunctionError` (500). O `create_injection` do gateway (`balance_operation_controller.ex:200-207`) repassa para `/api/v1/admin/balance/#{ispb}/inject`, que cai nesse buraco; `list_injections`/`show_injection` retornam `not_implemented` explicito (`:214-225`).

### 1.3 Parametrizacao de Saldos (min/max reserva, thresholds)

**Legado:** `SpiCadParamValoresSaldo` (min/max reserva; `enumTipoValor` MinimoReservaSPI=1/MaximoReservaSPI=2 disparam credito/debito automatico p/ manter o PI entre min e max) + `SpiCadParamReqSaldo` (valor padrao da requisicao por tipo). Tabelas vivas confirmadas.

**Nosso:** `views/balance/BalanceParametersView.vue` → `PUT/GET /api/v1/balance/parameters` (`services/balance.ts:329-335`) → `BalanceParametersController` (gateway). Persiste em `monetarie_settlement.system_configs` categoria "limits" (`balance_parameters_controller.ex:8,69-72`), com `minBalanceRB`, `minBalancePI` + canais de notificacao (emails/SMS/slack). RBAC de update exige permissao SPI (`:29`).

Verdict: **parcial** (g4/coberto-com-caveat). Armazena min reserva/PI + notificacao (paridade com SpiCadParamValoresSaldo), mas **nao ha top-up automatico** (o gatilho MinimoReservaSPI/MaximoReservaSPI que emite credito/debito automatico nao existe — e o proprio caminho de emissao de ReqSaldo esta morto, ver 1.2). Nao ha `SpiCadParamReqSaldo` (valor padrao por tipo).

### 1.4 Coberto em saldos
- Dashboard/positions/intraday/history sobre dados reais (`/api/v1/balance/positions|intraday|history/:ispb`, `balance_controller.ex` + `Balances`).
- CAMT.060 (consulta de saldo/movimento) presente (`camt060_controller.ex`).

---

## 2. CONTABIL

Diferenca estrutural (contexto, nao gap por si): o **legado PIX nao faz partida dobrada por operacao** — e uma camada de CONFIGURACAO (plano/evento/hist/centro-custo) + um MONITOR que agrega as liquidadas do dia por evento e gera ARQUIVO posicional para o contabil externo. No nosso desenho, a contabilizacao COSIF por operacao vive no **Core** (Fase 1/2, ver CLAUDE.md), entao o front "contabil" da cabine PIX e fino.

### 2.1 Eventos Contabeis (estrutura multi-perna)

**Legado:** `CRK_SPICONTABIL.dbo.EventoContabil` — colunas confirmadas vivas: `IdContaDebito1`, `IdContaDebito2`, `IdContaCredito1`, `IdContaCredito2`, `IdCentroCustoDebito1/2`, `IdCentroCustoCredito1/2`, `IdHist`. Ou seja: **ate 2 contas de debito + 2 de credito, cada uma com centro de custo, + historico padrao**.

**Nosso:** `SettlementService.Accounting.AccountingEvent` (`accounting_event.ex:14-27`): `event_type`, `amount`, **`debit_account` (1)**, **`credit_account` (1)**, `date`, `status`, `reference`. Um unico debito e um unico credito, **sem centro de custo por perna**, **sem vinculo com historico padrao**. Rotas `GET/POST /api/v1/accounting/events` (`router.ex:680-681`).

Verdict: **divergencia/parcial** (g5) — modelo 1D+1C vs 2D+2C+CC+Hist.

### 2.2 EventoMensagem / EventoMensagemTag (CdMsg -> evento; condicao por tag)

**Legado:** tabelas `EventoMensagem` (qual CdMsg dispara qual EventoContabil) e `EventoMensagemTag` (condicao no nivel de tag/campo da mensagem, ex. FinalidadeTransacao, DebitoCredito) — ambas confirmadas vivas. `MonitorContabilUseCase.ObtemLancamentos` casa operacao->evento por CdMsg+tags com peso (especificidade), soma D e C.

**Nosso:** **nenhuma** tabela/config CdMsg->evento nem condicao por tag. A journalizacao COSIF e code-driven no Core, nao config-driven na cabine. Nao ha `EventoMensagem`/`EventoMensagemTag` equivalente.

Verdict: **ausente/divergencia** (g6).

### 2.3 Historico Padrao (cadastro)

**Legado:** `CRK_SPICONTABIL.dbo.HistPadrao` (`{CdHist, DsHist, FlAtivo}`) com CRUD (`histpadrao/ListaHist`, `IncluiHist`, `AlteraHist`, `ExcluiHist`). Tabela viva.

**Nosso:** `views/accounting/StandardHistoryView.vue` **NAO e cadastro de historico padrao** — e uma listagem de `JournalEntry[]` por periodo (`StandardHistoryView.vue:13` `entries: JournalEntry[]`, export CSV). Nao existe tabela/endpoint de HistPadrao (grep: 0 hits `hist_padrao`/`standard_history` no backend accounting; rota accounting nao tem `/history` de cadastro).

Verdict: **ausente** (g7) — o cadastro de Historico Padrao nao existe; a tela homonima e outra coisa (extrato de lancamentos).

### 2.4 Plano de Contas

**Legado:** `PlanoConta` (`{CdConta, DsConta, FlAtivo, FlCentroCusto}`) com CRUD (`planoconta/IncluiConta`, `AlteraConta`, `ExcluiPlano`). Tabela viva.

**Nosso:** `views/accounting/ChartOfAccountsView.vue:12` — **READ-ONLY** por design ("COSIF is the BACEN regulatory chart of accounts, not admin-editable"). Backend `GET /api/v1/accounting/chart-of-accounts` so listagem; schema `chart_of_accounts` (`cosif_code/name/account_type/parent_code/level/active`). Sem create/update/delete.

Verdict: **divergencia** (g8) — legado CRUD editavel; nosso somente leitura (justificavel como COSIF regulatorio, mas sem paridade de edicao).

### 2.5 Monitor Contabil (agregacao + arquivo posicional)

**Legado:** `MonitorContabilUseCase.ObtemLancamentos` — le liquidadas (`IdStatus==9`) do dia, casa por evento (peso/especificidade), soma D e C, gera `Lancamento` (2 contas D + 2 C, hist, qtd, VlrDeb, VlrCred); nao casadas caem em "NAO CONTABILIZADO". Export `DownloadArquivo`/`BaixaArquivo` = arquivo POSICIONAL por layout (`LayoutCRK`/`LayoutCRKDinamico`). Tela `monitor-contabil` (`monitor-contabil.component.ts`).

**Nosso:** `views/accounting/AccountingMonitorView.vue` — apenas conta total de eventos + lista dos 10 recentes (`AccountingMonitorView.vue:50-59`, chama `listAccountingEvents({page:1,limit:10})`). **Sem** filtro por empresa/data/evento/conta-deb/conta-cre, **sem** agregacao liquidadas->evento, **sem** bucket "nao contabilizado", **sem** export posicional por layout. Existe `GET /api/v1/accounting/export/circular-4010` (COSIF Circular 4010) + balance-sheet/income-statement — export regulatorio diferente, nao o arquivo posicional do contabil externo.

Verdict: **parcial** (g9).

### 2.6 Coberto em contabil
- Centro de Custo: CRUD real (`GET/POST/PUT /cost-centers`, `POST /cost-centers/:id/toggle-status`; `AccountingController` + `CostCenter` schema) — paridade com `CentroCusto` (Inclui/Altera). (g10 coberto)
- Eventos contabeis: create/list existem (modelo simplificado, ver 2.1).
- Reconciliacao/Netting/Fees: telas proprias do lado liquidacao (extras).

---

## 3. DICT

### 3.1 Chaves

**Legado:** `entries*` — Inclui/Altera/AlteraBloqueio/Exclui/Consulta/ConsultaBaseLocal/ConsultaPorConta/DerivaTpChave/ListaChaves/Sincronismo + `keys/VerificarExistenciaChaves` (check-keys). Limites PF=5/PJ=20, validade consulta 60s.

**Nosso:** `dict_service` `EntryController` (`entry_controller.ex`) — `index/create/show/delete/delete_with_reason/block/unblock/search_by_account` (`:14-303`). Rotas: `POST /entries/:key/block`, `/unblock` (paridade AlteraBloqueioChave), `GET /entries/by-account` (paridade QueryKeyByAccount), `POST /keys/check` (BatchKeyController → `Keys.check_keys`, paridade VerifyKeys). Limites PF/PJ e validade de consulta: BACEN Manual (CLAUDE.md). CID sync (`Sync.CidSyncService` 6h full + 5min events).

Coberto: consulta, inclusao, exclusao, bloqueio/desbloqueio, por-conta, check-keys em lote, sincronismo CID.

**Gaps:**
- **AlteraChave (mudanca de vinculo conta<->chave / update entry): ausente.** `EntryController` nao tem `update`; router dict nao tem `put/patch /entries/:key`. Verdict: **ausente** (g11, menor).
- **Bloqueio/desbloqueio de chave nao exposto no gateway do admin:** o gateway `/api/v1/dict/keys` (`settlement router:370-376`) so tem get/post/get/delete + claims — sem block/unblock nem by-account. As acoes existem no `dict_service` (:4001) mas nao no caminho que o pix-admin usa. Verdict: **parcial** (g12).

### 3.2 Reivindicacoes (Claims)

**Legado:** ciclo OWNERSHIP/PORTABILITY (OPEN/WAITING_RESOLUTION/CONFIRMED/CANCELLED/COMPLETED); worker `Claims` com quarentena de posse (7 dias resolucao, 30 dias conclusao); doador varre o BACEN.

**Nosso:** `DictService.Claims` (`claims.ex`) — ciclo completo (reivindicar/confirmar/cancelar/concluir posse+portabilidade, `:208-234`); automacao por deadline via `nats/claim_deadline_consumer.ex` (CLAIM_DONOR_TIMEOUT D+14 auto-resolve, claimer timeout auto-cancel); deadlines `@donor_notification_days 7 / @donor_deadline_days 14 / @claimer_deadline_days 30` (`claims.ex:44-47`) + `resolution_period_end` vindo do BACEN (`:688-689`). Telas `views/claims/*`.

Verdict: **coberto** (g13). Caveat menor: modelo de prazo (D+7/14/30) parametrizado local + `resolution_period_end` do BACEN; honra o periodo do BACEN.

### 3.3 Infracoes + Marcador de Fraude + MED 2.0

**Legado:** `infractionreports` (Incluir/Cancelar/Fechar/Consultar; AGREED/DISAGREED; situationType SCAM/ACCOUNT_TAKEOVER/COERCION/...); `statistics` marcador de fraude (APPLICATION_FRAUD/MULE_ACCOUNT/SCAMMER_ACCOUNT; NEW/REGISTERED/CANCELLED); MED/GID funds-recoveries (CREATED->TRACKED->AWAITING_ANALYSIS->ANALYSED->REFUNDING->COMPLETED/CANCELLED) + tracking-graph + refund + event-notifications.

**Nosso:** `dict_service` `InfractionReportController` (create/index/show/acknowledge/analyse/close, `router:265-270`), `FraudMarkerController`, `FundsRecoveryController` (+ `tracking_graph_controller.ex`), `RefundController`, `EventNotificationController`. Gateway v2 expoe tudo (`settlement router:389-424`: funds-recoveries create/get/tracking-graph, refund-requests complete/cancel/close, fraud-markers create/get/cancel, infraction-reports acknowledge/analyse/close). Telas `views/med/*` (Hub, Infractions, FraudMarkers, FundsRecovery, Refunds).

Verdict: **coberto** (g14). Diferenca de abordagem (ver CLAUDE.md: infracao migrada para funds-recovery 2.12.1) — funcionalmente presente.

### 3.4 Devolucao Especial (Dev Especial DICT, ligada a infracao)

**Legado:** trilho `refunds` separado — `IncluiDevEspecial`, `ListarDevEspecial`, `ConsultarDevEspecial`, `FecharDevEspecial`, `CancelarDevEspecial`; `enumStatusAnaliseDevolucao` TOTALLY/PARTIALLY_ACCEPTED/REJECTED + motivos de rejeicao. Tela `dict/monitoracao/devolucao/{incluir,detalhe,fechar}`.

**Nosso:** gateway `refund-requests` tem `complete/cancel/close` + list/get (`settlement router:410-414`); `views/med/RefundListView.vue`. **Nao ha "IncluiDevEspecial" (originar uma solicitacao de devolucao especial pela tela)** — a devolucao MED se origina via `funds-recoveries/:id/refund`. Analise TOTALLY/PARTIALLY_ACCEPTED existe no dominio MED.

Verdict: **parcial** (g15) — ciclo de tratamento presente; originar dev especial pela tela DICT nao tem par direto.

### 3.5 Politica de Limitacao (limitationPolicy)

**Legado:** `limitationPolicyController` (`ListaPoliticas`, `ConsultaPolitica`) — politicas de limitacao BACEN por participante (percentis/ANS). Tela `dict/monitoracao/politicas`.

**Nosso:** `views/dict/DictPoliciesView.vue` chama `store.fetchPolicies/createPolicy/updatePolicy` → `dictService.getPolicies` = **`GET /api/v2/admin/institutions`** (`services/dict.ts:79,95,100`). Ou seja, a tela "Politicas" foi remapeada para **CRUD de Instituicoes**, nao para as politicas de limitacao BACEN. Nao ha modulo `limitation_policy` no backend (grep: 0 hits fora de `dict_calculator` de percentis APIX).

Verdict: **ausente/divergencia** (g16) — a Politica de Limitacao BACEN nao existe; a tela homonima e cadastro de IF.

### 3.6 Protecao / Antivarredura (rate-limit por pagamento)

**Legado:** `WorkerProtecao` + `ValidaProtecaoUseCase.Processar` (`DICT.Core.Worker.Protecao.decompiled.cs:90-130`, `DICT.Core.Application.decompiled.cs:2303`) sobre `RegraProtecao` (`Domain:723`, `QtConsultasLimite`, por SPBParticipante x TipoPessoa) — correlaciona consultas DICT que NAO viraram pagamento (varredura/scan); gate na consulta via `_regraProtecaoReadRepository.VerificaProtecao(...)` (`Application:650`) dentro do `ValidaChaveUseCase`.

**Nosso:** o unico rate-limit e o `DictServiceWeb.Plugs.DictRateLimit` (BACEN Manual: G 250 req/s, S 50 req/s, agregado 1000 req/s, por tier de instituicao) — controle grosso por ISPB/tier, **nao** deteccao de varredura por pagador (consulta->pagamento). Nota: o modulo "protecao" citado no nosso codigo (`ownership.ex:5`, `keys.ex:1083` "paridade ValidaProtecaoUseCase") e **validacao de POSSE por OTP**, conceito diferente do antivarredura.

Verdict: **divergencia/parcial** (g17) — sem a regra de protecao antivarredura por pagador; so rate-limit por tier.

### 3.7 Coberto em DICT (indicadores/estatisticas/relatorios)
- Indicadores/ANS + percentis: `GET /api/v1/dict/metrics/indicators` + `/statistics` (`DictMetricsController`, agregado sobre `monetarie_dict.keys` + `monetarie_spi.messages`); `views/dict/{DictIndicatorsView,StatisticsView}.vue`. (g18 coberto)
- Relatorios DICT (chaves/devolucoes/reivindicacoes/fraude): `GET /api/v1/dict/reports/{keys,refunds,claims,fraud}` (`DictReportsController`, "em paridade com o LegadoPIX ListarDevEspecial/ListaReivindicacaoBacen/ListaInfracoes/ListaChaves"); `views/dict/DictReportsView.vue`. (g19 coberto)

---

## 4. MULTILIQUIDACAO

**Legado (subsistema completo de PIX-out de negocio orientado a lote):** DB `crk_multtiliquidacao` vivo — `TB_OPERACAO` (**492.076 operacoes**), `TB_ARQUIVO_PAGTO`/`TB_ARQUIVO_PAGTO_DETALHE` (import de lote CSV `;`/ZIP tipos 01/02/03/99), `TB_PARTICIPANTECONTROLADO` (contas de terceiro controladas, roteadas p/ provedor de CC Agibank/Crefisa/Sinqia/Topazio/Cobis/BNP), `TB_BLOQUEIO` (bloqueio de infracao/MED na conta, Parcial->Total), `TB_INICPAGTODINAMICORECEBEDOR` (QR dinamico/CobV/composto saque-troco), `TB_JANELA_RETENTATIVA` (agendamento por janela por ISPB), `TB_SANCTIONSCREENING`. Motor `PagaOperacaoDTOUseCase.TratarPix` + workers (Importacao/Processamento/Agendamento/Bloqueio/EmAberto/Exportacao/RetornoMQ/Expurgo). Telas Angular: `monitoracao/operacoes/` com `TratarPix` (`monitor-operacao.service.ts:97`), `CancelarPagto` (`:145`), `DevolvePix` (`:160`), `ListarPix` (`:28`); `monitoracao/pixsaquepixtroco/` (`ListarPixSaquePixTroco`, `:27`); `parametrizacao/`.

Modalidades: transferencia (IPAY), **PIX Saque** (OTHR/VLDN + ModalidadeAgente AGPSS/AGFSS/AGTEC/AGTOT + PrestadorSaque), **PIX Troco** (GSCB/VLDN+VLCP), devolucao (pacs.004), agendamento com **debito diferido** + retentativa por janela, recorrencia (PIX Automatico).

**Nosso:** **nao existe modulo de multiliquidacao.** Confirmacao:
- Nenhuma tela (grep views): so `views/participants/PixSaquePixTrocoView.vue` = MONITOR read-only de operacoes saque/troco (campos `createdAt`/export CSV; sem TratarPix/incluir/cancelar/devolver — grep 0 hits de acao de escrita).
- Nenhum motor de lote: sem `TB_ARQUIVO_PAGTO`/`Operacao` de negocio, sem parser 01/02/03/99, sem participante controlado, sem bloqueio de conta parcial->total, sem `JanelaRetentativa`.
- `settlement_service/workers/cycle_scheduler.ex:5` cita "Equivalent to legacy Multiliquidacao.Core.Worker.Agendamento" mas e o **scheduler de NETTING** (ciclos de liquidacao), nao o agendamento de arquivo de pagamento.
- `settlement_service/apix/xml_serializer.ex:8` referencia o model `Multiliquidacao` do legado apenas para o **relatorio regulatorio APIX001** (serializer), nao o motor.

Existe, no nosso lado, o motor de PIX-out UNITARIO (PixDebitValidator/pacs.008, DICT lookup, E2E burn) = equivalente ao nucleo `TratarPix`, mas **toda a camada de negocio de lote** (importacao, agendamento por janela com debito diferido, saque/troco end-to-end, QR composto, bloqueio de conta por infracao, sanction screening, operacoes incluir/tratar/devolver/cancelar pela tela, parametros de sistema) esta **ausente**.

Verdict: **ausente** (g20, o maior gap; front inteiro sem par).

---

## 5. Resumo dos gaps

| id | Front | Titulo | Tipo | Risco |
|---|---|---|---|---|
| g1 | Saldos | ReqSaldo credito/debito/aporte sem backend (SPI 404) | ausente | alto |
| g2 | Saldos | Sem separacao real Conta PI x Reserva SPB | divergencia | medio |
| g3 | Saldos | Sem top-up automatico por min/max reserva | ausente | medio |
| g5 | Contabil | EventoContabil 1D+1C vs 2D+2C+CC+Hist | divergencia | medio |
| g6 | Contabil | Sem EventoMensagem/EventoMensagemTag (CdMsg->evento) | ausente | medio |
| g7 | Contabil | Sem cadastro Historico Padrao (tela homonima e outra coisa) | ausente | medio |
| g8 | Contabil | Plano de Contas read-only vs CRUD legado | divergencia | baixo |
| g9 | Contabil | Monitor Contabil sem agregacao/arquivo posicional | parcial | medio |
| g11 | DICT | Sem AlteraChave (update entry) | ausente | baixo |
| g12 | DICT | Bloqueio de chave nao exposto no gateway do admin | parcial | baixo |
| g15 | DICT | Sem originar Dev Especial pela tela DICT | parcial | baixo |
| g16 | DICT | Politica de Limitacao ausente (tela mapeada p/ Instituicoes) | ausente | medio |
| g17 | DICT | Sem protecao antivarredura por pagador (so rate-limit por tier) | divergencia | medio |
| g20 | Multi | Multiliquidacao de negocio inteira ausente | ausente | alto |
| g4 | Saldos | Parametros min reserva/PI + notificacao (parcial) | coberto | info |
| g10 | Contabil | Centro de Custo CRUD | coberto | info |
| g13 | DICT | Claims ciclo completo + automacao de prazo | coberto | info |
| g14 | DICT | Infracoes + Fraude + MED 2.0 funds-recovery | coberto | info |
| g18 | DICT | Indicadores/ANS/percentis reais | coberto | info |
| g19 | DICT | Relatorios DICT (chaves/dev/claims/fraude) reais | coberto | info |
