# Manifesto ETL dos backups AB/GX/MGI para cabines PIX e SPB

Data: 2026-07-01  
Fonte: backups SQL Server restaurados localmente em `monetarie-bak-mssql`  
Destino: cabines PIX e SPB. Core esta fora do escopo desta carga.

## Estado local verificado

- SQL Server: os 16 backups foram restaurados e inventariados.
- SPB local: a carga foi executada no banco `cc_spb`, com staging `legacy_ab_spb` e projecoes em `spb_operations`, `bacen_messages`, `message_type_config` e `message_tag_definitions`.
- PIX local: a carga foi executada no banco `cc_pix`. Nesta instancia, os schemas finais usam prefixo `cecresa_*`; o ETL mapeou os destinos logicos para `cecresa_spi`, `cecresa_dict`, `cecresa_spi_msg`, `cecresa_settlement` e `cecresa_audit`.
- Resultado detalhado: `docs/reports/2026-07-01-pix-spb-etl-load-result.md`.

## Regras de carga

1. Criar staging separado por cabine: `legacy_ab_pix` no banco PIX e `legacy_ab_spb` no banco SPB.
2. Preservar fonte, tabela, chave original, hash de payload e data de extracao em toda linha migrada.
3. Usar chaves idempotentes por `{source_db, source_table, source_pk}`. E2E e numero de controle sao correlacao de negocio, nao chave global.
4. Converter valores monetarios com `Decimal`/`numeric`, sem `float`.
5. Nao migrar certificados, chaves privadas, endpoints MQ ou credenciais. Esses itens viram checklist de configuracao segura.

## Cabine PIX

| Fonte | Tabelas origem | Destino | Chave idempotente | Transformacao principal | Condicao |
|---|---|---|---|---|---|
| `AB_PAGAMENTO_INSTANTANEO` | todas as 178 tabelas com linhas | `legacy_ab_pix.*` | `{source_table, pk}` | copia bruta tipada, com hash de payload e timestamp de extracao | obrigatorio antes da carga final |
| `AB_PAGAMENTO_INSTANTANEO` | `MENSAGEM_BACEN_PSP`, `MENSAGEM_RESPOSTA_BACEN_PSP`, `*_MENSAGEM`, `PACS*`, `PIBR*`, `MSG_*` | `monetarie_spi.messages`, `monetarie_spi.message_history`, `monetarie_spi.bacen_inbound`, `monetarie_spi.bacen_outbound`, `monetarie_spi_msg.xml_messages` | `ID`, `ID_MSG`, `resource_id` ou `{table, ID}` | `COD_MSG` -> `message_code`; `ID_MSG` -> `message_id`; ISPB origem/destino -> debtor/creditor ou sender/receiver; payload XML/varbinary -> `xml_messages`/auditoria | carregar depois de status/message-code map |
| `AB_PAGAMENTO_INSTANTANEO` | `ANOTACAO_CREDITO` | `monetarie_spi.messages`, `monetarie_spi.payments`, `monetarie_spi.credit_notifications` | `ID_ANOTACAO_CREDITO`; E2E como correlacao | credito recebido/autorizado; valor -> `payments.amount`; parte/contraparte -> debtor/creditor conforme natureza; status -> `status_id` | reconciliar com extrato |
| `AB_PAGAMENTO_INSTANTANEO` | `ORDEM_PAGAMENTO` | `monetarie_spi.messages`, `monetarie_spi.payments`, `monetarie_spi.message_history` | `ID`; `ID_IDEMPOTENTE` como correlacao | ordem enviada; `COD_MSG` -> tipo; `MENSAGEM` -> XML bruto; E2E quando existir | exigir parse de XML para participantes quando coluna tabular nao existir |
| `AB_PAGAMENTO_INSTANTANEO` | `BLOQUEIO_ORDEM_PAGAMENTO` | `monetarie_spi.messages`, `monetarie_spi.payments`, `monetarie_spi.balance_blocks`, MED/devolucao quando aplicavel | `ID_BLOQUEIO_ORDEM_PAGAMENTO`; E2E como correlacao | bloqueio/devolucao/MED; `MOTIVO_MED`, `ID_DEVOLUCAO`, `END_TO_END_ORIGINAL` alimentam devolucao/MED | nao liquidar como pagamento confirmado sem regra de status |
| `AB_PAGAMENTO_INSTANTANEO` | `MOVIMENTOS_CONTABEIS_CLIENTE_CREDITO_EXTERNO`, `MOVIMENTOS_CONTABEIS_CLIENTE_DEBITO_EXTERNO` | `monetarie_spi.statement_entries` e staging de reconciliacao | `ID`; E2E como correlacao | fonte auxiliar de conferencia por conta/dia/natureza | nao usar como fonte primaria se `EXTRATO_MOVIMENTO_GI` bater |
| `AB_PAGAMENTO_INSTANTANEO` | `BALANCO_SALDO_SPI`, `MOVIMENTOS_CONTA_PI` | `monetarie_spi.balances`, `monetarie_spi.balance_history`, `monetarie_spi.balance_cache` | `ID` ou `{TIPO, DATA_HORA}` | saldo SPI e historico de variacao; `TIPO`/`IND_CREDT_DEBT` -> tipo/direcao | carregar apenas apos definir semantica de saldo disponivel/bloqueado/projetado |
| `AB_PAGAMENTO_INSTANTANEO` | `MSG_SOLICITACAO_DEVOLUCAO_*`, `MSG_RELATO_DE_INFRACAO_*` | `monetarie_dict.med_requests`, `monetarie_dict.refund_requests`, `monetarie_dict.infraction_reports`, `monetarie_dict.infractions`, `monetarie_spi_msg.xml_messages` | `{table, pk}` + E2E/original | MED, devolucao e relato de infracao; payload bruto fica auditavel | requer mapa de status MED/DICT |
| `AB_PAGAMENTO_INSTANTANEO_EXTRATO` | `EXTRATO_MOVIMENTO_GI` | `monetarie_spi.statements`, `monetarie_spi.statement_entries` | `SEQUENCIAL` | agrupar por ISPB/agencia/conta/data; `NATUREZA C/D` -> credit/debit; `STATUS='SUCESSO'` -> extrato confirmado; `ERRO` -> auditoria | fonte prioritaria para historico de extrato PIX |
| `AB_GI_INFO_MOVIMENTOS_INTERNOS` | `LOTE`, `OPERACAO_LOTE`, `MENSAGEM_ENVIADA`, `MENSAGEM_RECEBIDA` | `monetarie_settlement` e `monetarie_audit`; XML em storage/auditoria | `LOTE.ID`, `OPERACAO_LOTE.END_TO_END`, ids de mensagem | lote GI, operacoes aprovadas, mensagens compactadas | validar por E2E contra extrato antes de fechar carga |
| `AB_GI_INFO_MOVIMENTOS_INTERNOS_ANTIGA` | tabelas de controle | `legacy_ab_pix` apenas se auditoria exigir | `{table, pk}` | acervo historico; sem carga operacional | opcional |
| `AB_PAGAMENTO_INSTANTANEO_METRICAS` | `DICT_CONSULTA`, `PAGAMENTO_*`, `RECEBIMENTO_*`, `TEMPO_*` | observabilidade historica da cabine ou `monetarie_audit` | `{table, pk}` | metricas/latencia/status; nao afeta saldo/extrato | opcional |
| `AB_PAGAMENTO_INSTANTANEO_BALDES_DICT` | `PARAMETROS_BALDE_DICT` | `monetarie_dict.participant_buckets`, `monetarie_dict.parameters`, `monetarie_dict.rate_limit_policies` | parametro + vigencia | configuracao DICT/rate limit | migrar manualmente se ainda compativel |
| `AB_PAGAMENTO_INSTANTANEO_EXPURGO` | tabelas de controle | politica de retencao/auditoria | `{table, pk}` | referencia de expurgo legado | nao carregar em runtime |
| `AB_PAGAMENTO_INSTANTANEO_CTAESPECIAL` | schema vazio operacionalmente | nenhum destino operacional agora | n/a | apenas schema de referencia | sem carga |
| `AB_GX_*`, `GX_PIX_AGENDAMENTO` | schemas vazios ou parametros minimos | checklist de configuracao PIX | n/a | comparar contratos/agendamentos/notificacoes | sem ETL transacional |

## Cabine SPB

| Fonte | Tabelas origem | Destino | Chave idempotente | Transformacao principal | Condicao |
|---|---|---|---|---|---|
| `AB_MGI` | todas as 37 tabelas com linhas | `legacy_ab_spb.*` | `{source_table, pk}` | copia bruta tipada, sem segredos | obrigatorio antes da carga final |
| `AB_MGI` | `TRANS_INTERF_PASS`, `TRANS_SISTEMAS` | `spb_operations` | `TRANS_INTERF_PASS.{CODSISTEMA_O, NUMORIGEM, DESTINO}`; `TRANS_SISTEMAS.NUMCTRLIF` quando existir | `NUMCTRLSPB`/`NUMCTRLSTR` -> `control_number`; `STATUSSGR`/`STATUSSTR`/`STATUSINTF`/`SITUACAO` -> `state`/`status_code`; `VALORMOVTO` -> `amount`; `CODEVENTO`/`TIPO_M` -> tipo/categoria | exige mapa de status legado |
| `AB_MGI` | `CORPO_TRANS_INTERF_PASS`, `CORPO_TRANS_INTERF_USMSG_PASS` | `bacen_messages` | `{CODSISTEMA_O, NUMORIGEM, DESTINO, SEQXML}` | XML -> `xml_content`/`binary_payload`; vincular por `operation_id`; `DTHRINC` -> received/sent/inserted timestamps | carregar depois de criar operacao pai |
| `AB_MGI` | `MENSAGENS`, `EVENTOS` | `message_type_config`, `message_templates`, `operation_events` seeds | `{CODEVENTO, TIPO_M, VRSMANUAL}` | catalogo de mensagens, direcao, efeito financeiro, evento ligado, default status | deduplicar por versao/manual |
| `AB_MGI` | `CONFIG_TAGS`, `COLUNAS`, `TIPODADO`, `DOMINIOS` | `message_tag_definitions` e tabelas/seeds de dominio SPB | tag + tipo + `VRSMANUAL` | definicoes de tags, tipo de dado, dominio e validacao | nao sobrescrever seed atual sem diff |
| `AB_MGI` | `PARAMETROS_MQ`, `CERTIFICADOS`, parametros sensiveis | nenhum dado runtime | n/a | gerar checklist: ISPB, validade, CN, alias, canal, servidor, porta | nao migrar credenciais/certificados |
| `AB_MGI_DDAMSG` | `DOMINIOS`, `COLUNAS`, `MENSAGENS_COL`, `TIPODADO`, `CONFIG_TAGS`, `MENSAGENS`, `EVENTOS` | seeds DDA/SPB nos mesmos destinos de referencia | chave de catalogo + `VRSMANUAL` | complemento DDA do catalogo MGI | aplicar como merge/diff, nao duplicar `AB_MGI` |

## Validacoes obrigatorias

1. Contagem por fonte: linhas origem vs staging vs tabelas finais.
2. Idempotencia: segunda execucao deve inserir zero linhas novas.
3. Valores PIX: soma C/D de `EXTRATO_MOVIMENTO_GI` vs `MOVIMENTOS_CONTABEIS_CLIENTE_*` vs eventos principais por E2E.
4. GI: `OPERACAO_LOTE` aprovado deve bater com extrato por E2E e data de liquidacao.
5. SPB: `TRANS_INTERF_PASS` deve ter operacao pai em `spb_operations` e mensagem filha em `bacen_messages` quando houver corpo XML.
6. Segurança: payload sensivel em storage/auditoria com hash; credenciais/certificados fora do banco transacional.

## Bloqueios restantes

1. Fechar tabela oficial de status legado -> status destino para substituir `legacy_imported`/`legacy_erro` quando o produto exigir estado final de tela.
2. Fechar regra definitiva de armazenamento externo dos XMLs/varbinary compactados; hoje ficam preservados em staging/projecao local.
3. Confirmar se a mesma carga deve ser repetida em outro endpoint de homologacao fora deste Postgres local.
