# HANDOFF — Continuar Core/ETL: re-migração FULL + padronização centavos (2026-06-27)

> Fonte de verdade para RETOMAR de onde paramos. Tudo abaixo foi validado EMPIRICAMENTE no vivo (não inferido). Dono cético, mandato "ache nosso defeito, prove empírico".
> **AUTORIZAÇÃO EXPLÍCITA DO DONO (registrada): pode executar o RESET FULL destrutivo da entidade SCD e re-migrar do backup novo. Bloqueio investigado e aprovado (é artefato). Migrar o campo `account_wallets.balance`.**

---

## 0. Estado vivo CONFIRMADO (validação empírica 2026-06-26 23h)

ECS `monetarie-greenfield-homolog`, conta 990933657879, sa-east-1:
- **core-api** task-def **`:37`** img `core-api:homolog-954303de`
- **core-admin-ui** **`:9`** img `core-admin-ui:homolog-c93a59f7`
- **core-banking-ui** **`:11`** img `core-banking-ui:homolog-954303de`
- **core-merchant-ui** **`:11`** img `core-merchant-ui:homolog-954303de`

DB `mon_core` (provado via ECS exec psql):
- `account_entries` = **R$ 741.158,98** | `cosif_journal_entries` reference_type=etl_replay = **245.048** linhas | users **1.525** | accounts **1.573**.
- Schema **`autbank_src`** (origem do novo backup, JÁ carregada, NÃO-destrutivo): `autbank_legacy_transactions` **258.959**, `accounts` **1.606**, `account_wallets` **1.606** (balance autoridade = **R$ 961.178,02**), `account_information` **1.606**.

Git: branch **`fix/core-etl-visibility`** tip **`22433f98`**, **11 commits à frente de origin/main, NÃO pushada**. (origin/main=75ca3376 tem os módulos ETL.)
A outra sessão (PIX/HSM) mexe em pix-api `:62` / mq / hsm — **disjunto do Core**, não conflita.

## 1. Acessos (copiar)

```bash
awsmon() { env -u AWS_ACCESS_KEY_ID -u AWS_SECRET_ACCESS_KEY -u AWS_SESSION_TOKEN AWS_PROFILE=vulcimonetarie AWS_REGION=sa-east-1 aws "$@"; }
# DB vivo via ECS exec (container core-api tem psql, bin/monetarie, curl, gunzip; NÃO tem aws cli):
TASK=$(awsmon ecs list-tasks --cluster monetarie-greenfield-homolog --service-name core-api --query "taskArns[0]" --output text | sed 's#.*/##')
B64=$(base64 < script.sh | tr -d '\n')
awsmon ecs execute-command --cluster monetarie-greenfield-homolog --task "$TASK" --container core-api --interactive --command "/bin/sh -c \"echo $B64 | base64 -d | sh\""
# Dentro do script: PGURL=$(printf '%s' "$DATABASE_URL" | sed 's#^ecto://#postgresql://#'); psql "$PGURL" -c "..."
# rpc: /app/bin/monetarie rpc 'Elixir code'  (NÃO usar aspas simples no SQL dentro de rpc)
```
- Admin login: `POST http://coreadmin-h.monetarie.internal/api/admin/auth/login {email:admin@monetarie.com.br, password:<SM monetarie/homolog/admin/core/initial_password>}`. JWT entity_id=**61d67833-4580-4d6e-a1ce-63fb851fb5cf** (única entidade).
- IB (banking) login membro: reset senha via admin `POST /api/admin/merchants/:userId/reset-password` → `temporaryPassword`; depois `POST http://ib-h.monetarie.internal/api/auth/login {document:<cpf/cnpj>, password:<temp>}`. Banking saldo: `GET http://ib-h.monetarie.internal/api/accounts` (centavos).
- Screenshots: Playwright em `core/node_modules/@playwright/test`. Admin login `#email`+`input[type=password]`+`button[type=submit]`.

## 2. Deploy (manual ARM64; sem GHA)

```
awsmon ecr get-login-password | docker login --username AWS --password-stdin 990933657879.dkr.ecr.sa-east-1.amazonaws.com
docker buildx build --platform linux/arm64 -f <Dockerfile> -t 990933657879.dkr.ecr.sa-east-1.amazonaws.com/monetarie/<repo>:homolog-<sha> --push <ctx>
# register nova task-def (strip ARN/revision/status/requiresAttributes/compatibilities/registeredAt/registeredBy, troca image) + update-service
```
Contextos/Dockerfiles: core-api `core/backend` (`core/backend/Dockerfile`); admin-ui/banking-ui/merchant-ui ctx=`core` (`core/apps/<app>/Dockerfile`); repos ECR: core-api, core-admin-ui, core-banking-ui, core-merchant-ui.

## 3. ✅ TRACK B (centavos) — COMPLETO, DEPLOYADO, PROVADO. Não refazer.

Padronização: API devolve CENTAVOS; todo `formatCurrency` ÷100. TigerBeetle/account_entries são SUBCENTAVOS (×10000); converter = `div(_,100)`.
- Backend: v2/partner pararam de fazer `MoneySerializer.to_base()` em respostas (devolvem centavos); saldo TB → centavos. `account_controller`, `wallet`(check), `v2/account`, `v2/transfer`, `v2/capital`, `partner_v1/accounts` ajustados. `from_base` (entrada) mantido.
- Front: `moneyUnit.ts` (banking, merchant, shared) em ÷100. `lib/format.ts`/`lib/formatters.ts` já ÷100.
- **Provado vivo:** login IB como KAY CASS (user 9086, doc 54885969000116) → `GET /api/accounts` balance=**37344651 centavos = R$ 373.446,51** (era 100x). Admin já provado em sessão anterior (conta 109071-2 R$ 373.446,51, dashboard R$ 625.861,90).
- Commits Track B: `41fa13e6` + `954303de`. Deploy: core-api :37, banking-ui :11, merchant-ui :11.
- GOTCHA: user 9086 ficou `must_change_password=true` (senha temp invalidada). 94 bugs no relatório `docs/reports/2026-06-26-core-money-bug-sweep.md`; os hardcoded_mock (PIX cards/Basileia) NÃO são bug de unidade — features não implementadas.

## 4. 🔴 TRACK A — RE-MIGRAÇÃO FULL: PRÓXIMA AÇÃO (autorizada)

Plano detalhado: `docs/plans/2026-06-26-etl-autbank-full-remigration.md`. Mapa COSIF: `docs/handoff/2026-06-26-core-etl-deep-fix-and-remigration-handoff.md` §5 + `~/Desktop/Plano_de_Contas_Interno_SCD.md`.

### Fatos provados (reconciliação)
- Autoridade do saldo = **`account_wallets.balance` = R$ 961.178,02** (NÃO o `balance_after`=R$457k, incompleto: 57 contas têm saldo sem histórico). Das 291 contas COM histórico, **288 batem exato** (wallet==balance_after, diff R$4.142,41).
- Novo backup é mais completo: **+33 contas (1.606), +9 usuários (1.542/1.606 info), histórico real 258.959 tx**. Atual=R$741k → novo=R$961k.
- **Bloqueio = ARTEFATO** (não judicial): `blocked_amount` compensa available negativo (POOLMAK balance R$1,57/avail −442k/blocked 442k). KAY CASS R$373k real marcado 100% blocked. **Migrar campo `balance`; NÃO replicar split available/blocked.**

### O que falta (a execução em si)
A re-migração precisa do **mix task do ETL** (em origin/main `core/backend/lib/monetarie/etl/autbank/*`), porque as **33 contas novas precisam de carteira TigerBeetle** — SQL puro NÃO cria (TB é ledger separado, via `Wallet.create`/`OpenAccount`).

### Sequência (TDD, subagents):
1. **Trazer ETL p/ a branch:** `git merge origin/main` (ou cherry-pick os módulos `etl/autbank/*`) na `fix/core-etl-visibility`. Interseção ETL×centavos = checar; resolver.
2. **Estender `source.ex`**: ler `autbank_src.autbank_legacy_transactions` (stream por account_number ordenado posted_at,id) + `autbank_src.account_wallets.balance` (autoridade) + `autbank_src.accounts`/`account_information` (titulares). AUTBANK_SOURCE = o próprio mon_core schema autbank_src (mesma conexão) OU via Postgrex.
3. **`event_map.ex`**: classificar por `history_code` (top: 01000 credit=PIX receb, 01012 debit=PIX pgto, 00903/00725 debit, 00732 credit, 00709/00708 transf, 00724 debit, 00505 credit, 00505=TED return…) → mapa COSIF do §5.
4. **`loader/ledger.ex`**: por movimento → account_entries (subcent, sinal) + cosif_journal_entries (centavos) pelo event_map.
5. **`reset.ex` --reset-entity** (ALLOW_ENTITY_RESET=true): apaga entidade SCD (users/accounts/account_entries/cosif_journal_entries/cosif_account_balances/TB wallets/pix_keys). **DESTRUTIVO — AUTORIZADO.**
6. **apply:** reset → customers(OpenAccount+Member, cria TB wallet) → opening(wallet.balance) → ledger replay → cosif snapshots mensais 2024-07..2026-06 → reconcile.
7. **reconcile (porta de saída):** por conta `sum(account_entries)/10000 == account_wallets.balance` (ao centavo); COSIF balanceado; A=P+Resultado. Total alvo **R$ 961.178,02**.
8. **build core-api + deploy** (a task roda o mix/rpc; OU rodar via `bin/monetarie rpc` na task viva se o código já estiver na imagem). 
9. **Validar tela + relatório pt-br humano SEM travessão** (regra do dono [[doc-writing-style-ptbr]]): dashboard, balancete mês a mês, extrato de conta com balance batendo, lista clientes (1.542), screenshots.
10. **Recomenda-se DRY-RUN primeiro** (--dry-run, sem escrever) + relatório de reconciliação, mostrar ao dono, ENTÃO o reset real.

### Limpeza pós-migração
- `drop schema autbank_src cascade;` no mon_core.
- `awsmon s3 rb s3://monetarie-etl-src-990933657879 --force` (contém PII do concorrente).
- Re-espelhar pix_keys se aplicável.

## 5. Pendências menores
- Capital Social=R$0 (Autbank não traz capital Monetarie; cadastrar integralização real se houver).
- Dashboard PIX/Boletos/MEDs/Basileia=hardcoded 0 (não implementados).
- Branch não pushada (11 commits): decidir push/merge.

## 6. Sanity de retomada (rodar e conferir)
```
awsmon ecs describe-services --cluster monetarie-greenfield-homolog --services core-api core-banking-ui core-merchant-ui --query "services[].{n:serviceName,td:taskDefinition,r:deployments[0].rolloutState}" --output table
# DB: account_entries=R$741.158,98 ; autbank_src.account_wallets sum(balance)=R$961.178,02 ; autbank_src.autbank_legacy_transactions=258959
```
