# Auditoria profunda do Core + ETL Autbank (homolog vivo)

Data: 2026-06-26. Ambiente: AWS conta `990933657879`, `sa-east-1`, cluster ECS `monetarie-greenfield-homolog`. Leitura empirica do `mon_core` vivo via ECS exec no task do `core-api` (`psql` e `bin/monetarie rpc` dentro do container, mesmo caminho que o app usa). App vivo na imagem `core-api:homolog-9e98a0aa` (codigo bate com a working tree local).

## Veredito curto

O ETL acertou o nucleo do razao: o **saldo autoritativo bate ao centavo** (TigerBeetle == COSIF == origem == R$ 741.158,98). Mas deixou **loose ends** que impedem o sistema (que le do Postgres) de mostrar a realidade. Logo o ETL **nao esta 100% funcional no sistema** ainda, apesar do razao estar correto.

## Numeros provados (mon_core vivo)

- Contas: 1.573 (147 ativas, 1.420 inativas, 6 bloqueadas), todas na unica entidade `61d67833 = MONETARIE SCD, ISPB 46026562`.
- Clientes: 1.525 (844 PJ, 681 PF), todos ativos, mesma entidade.
- Extrato `account_entries`: 244.984 linhas, status `confirmed`, datas 2024-07 a 2026-05.
- COSIF `cosif_journal_entries`: 77 lancamentos `etl_opening`, todos datados de **2026-06-26**, total 74.115.898 centavos = **R$ 741.158,98**.

### Reconciliacao de saldo (a parte central)

Unidades: `account_entries.amount` e saldo TigerBeetle em **subcentavos** (BRL x 10.000); COSIF em **centavos** (BRL x 100).

| Fonte | Valor (subcentavos) | BRL |
|---|---:|---:|
| TigerBeetle total (1.573 contas, autoritativo) | 7.411.589.800 | R$ 741.158,98 |
| COSIF etl_opening total (x100) | 7.411.589.800 | R$ 741.158,98 |
| Soma de `account_entries` (extrato PG) | 4.694.493.300 | R$ 469.449,33 |
| **Gap (abertura nao lancada no extrato)** | **2.717.096.500** | **R$ 271.709,65** |

Saldo TB por status: ativas R$ 625.861,90; bloqueadas R$ 115.296,96; inativas R$ 0,12. Soma R$ 741.158,98.

Extrato `account_entries` por status: ativas R$ 388.986,38; bloqueadas R$ 80.931,79; inativas -R$ 468,84. Soma R$ 469.449,33.

**Conclusao:** o saldo de abertura (a diferenca entre o saldo real da origem e o que o historico de movimentos parcial reconstroi) foi lancado em TB e COSIF, mas **nao foi escrito como linha em `account_entries`**. Por isso o extrato no Postgres nao fecha com o saldo real. Em contas onde o historico disponivel ja reconstroi o saldo, TB == soma do extrato (verificado em 10009294, 10009357, 10008281, 10009068). Onde o historico e incompleto (ligado a pendencia do cliente: a Autbank ainda nao exportou `autbank_legacy_transactions`), o TB tem a abertura e o extrato nao.

## As 4 telas reportadas (causa provada por probe HTTP autenticado)

Token de admin obtido em `POST /api/admin/auth/login` (claims do JWT: `entity_id=61d67833`, mesma entidade dos dados).

1. **Clientes (lista vazia)** — BUG DE FRONT, nao e ETL. A tela chama `GET /merchants` que, com `baseURL=/api`, cai em `/api/merchants` (MerchantPortalController, devolve `{"data":[]}`). O endpoint correto e `/api/admin/merchants` (MerchantsController), que **devolve os 1.525 clientes** (probe retornou Cirilo Pereira luz, Maria Isabel Dias, etc.). Conserto: front `useClients.ts` deve chamar `/admin/merchants`.

2. **Contas Correntes (SALDO TOTAL R$ 0,00 / sem movimentacao 147)** — `dashboard_stats` calcula saldo e movimento da tabela `transactions` (so 215 linhas de teste de PIX/TED), nao do razao PG. Resposta viva: `{total_active:147, no_movement:147, total_balance:0, entries_today:0, total_closed:1426}`. O saldo real das ativas e R$ 625.861,90. Conserto: ler saldo/movimento do PG (`account_entries`).

3. **Relatorios Contabeis / Balancete (sem dados em fev/2026)** — os 77 lancamentos COSIF estao todos datados de 2026-06-26. Probe de `/api/v1/cosif/trial-balance` para junho/2026 retornou `balanced:true`, total R$ 741.158,98 em ATIVO/Disponibilidades. Ou seja, a tela funciona; faltou datar/replicar o historico no COSIF. Conserto: datar/replicar.

4. **Onboarding (vazio)** — esperado: a migracao abre conta direto (via OpenAccount), nao cria fila de onboarding. O "port do coreproviders" (matriz `docs/plans/2026-06-24-coreproviders-port-matrix.md`) e trabalho de paridade a parte, fora do escopo desta sessao.

## Chaves PIX

O `mon_core` nao tem tabela propria de chave PIX/DICT. O `mon_pix` que o core enxerga (`DICT_SOURCE_DATABASE_URL`) so tem `med_*`, `pix_limits`, `pix_participants`. As ~1.070 chaves sincronizadas estao num DB da cabine PIX (provavelmente `monetarie_spi`), acessivel pelo task do `pix-api`. Decisao do dono: espelhar as chaves no cadastro do Core.

## Plano de conserto (escopo aprovado: telas + chaves PIX; saldos = os dois; chave = espelhar no Core)

A. **Saldo de abertura no extrato PG**: lancar, por conta, uma linha de `account_entries` de abertura = (saldo TB - soma atual do extrato), datada no corte da migracao, para o extrato fechar com o saldo real (R$ 741.158,98) em toda conta. Re-datar/replicar o COSIF para o balancete historico fechar.

B. **dashboard_stats lê o PG**: somar saldo/movimento de `account_entries` (nao de `transactions`); alem disso backfill de `transactions` (os dois, conforme pedido).

C. **Front Clientes**: `useClients.ts` -> `/admin/merchants`; rebuild + deploy do admin-ui.

D. **Chaves PIX**: puxar da cabine (task pix-api) e espelhar no cadastro do Core (tabela/associacao + migracao).

E. **Validacao tela a tela com print (antes/depois)** e fechamento do relatorio.

## Pendencia externa (nao e defeito nosso)

A Autbank precisa exportar `autbank_legacy_transactions` para o historico de movimento ficar completo. Sem isso, o extrato so tem os movimentos disponiveis no backup; a abertura cobre a diferenca para o saldo bater.

## RESULTADO: consertos aplicados e validados ao vivo (2026-06-26)

1. **Saldo de abertura no extrato PG (dado, sem deploy).** Inseridas 64 linhas `account_entries` de abertura (categoria `adjustment`, `reference=etl_opening_backfill_20260626`, reversiveis), uma por conta onde o saldo TB diferia do acumulado do extrato. Resultado: soma de `account_entries` = **7.411.589.800 subcentavos = R$ 741.158,98**, identica a TB e COSIF; reconciliacao por conta = **0 sobra**. A tela Saldo e o extrato passaram a ler o valor certo (ex.: conta 10008101 = R$ 27.160,77; statement da conta 10009294 = 1.888 lancamentos, saldo R$ 373.446,51).

2. **dashboard_stats lendo o PG (codigo, deploy).** `bank_accounts_controller.dashboard_stats` passou a somar saldo/movimento de `account_entries` (nao de `transactions`). Ao vivo: **SALDO TOTAL R$ 625.861,90** (era R$ 0,00), **SEM MOVIMENTACAO 69** (era 147).

3. **Lista de Clientes (codigo, deploy).** `useClients.ts` passou a chamar `/admin/merchants` (era `/merchants`, que caia no controller do portal). Ao vivo: lista **populada** com os 1.525 clientes migrados.

4. **Balancete.** Ja funcionava: o periodo padrao da tela e o mes corrente (junho/2026), que inclui os lancamentos COSIF; mostra os R$ 741.158,98. A tela so aparecia vazia porque o usuario tinha selecionado fevereiro.

5. **Chaves PIX (dado).** Criada a tabela `mon_core.pix_keys` e espelhadas **1.160 chaves** da cabine (`mon_pix.monetarie_dict.keys`, ISPB 46026562). Cobertura real: **12 chaves batem com 4 clientes migrados**; as demais sao chaves de TESTE do BACEN homolog (donos "Fulano de tal", "Teste BCB"), nao dos clientes do Autbank. Visibilidade no admin (aba "Chaves PIX") fica como follow-up (precisa de endpoint + aba + 2 builds, para 12 chaves reais).

### Deploy

- Branch local `fix/core-etl-visibility` (`c93a59f7`), nao pushada. Imagens ARM64 `homolog-c93a59f7` no ECR. ECS: `core-api` task-def **:33**, `core-admin-ui` task-def **:9**, rollout COMPLETED.

### Observacao (defeito pre-existente, fora do escopo)

A tela de extrato (`StatementView`) mostra "Nao foi possivel carregar o extrato" quando o periodo selecionado nao tem lancamento, mesmo a API retornando HTTP 200 com `opening_balance` correto. E so um tratamento de UX do front para lista vazia; o dado esta certo.
