# Dicionário de dados do Legado PIX (CRK/Corner) - Schema, índices, procedures e filas

Fonte: scripts T-SQL (SQL Server) versionados em `LegadoPIX/Pix/SPI`, `LegadoPIX/Pix/DICT`, `LegadoPIX/Pix/Med_gid` e `LegadoPIX/AdmWeb/XPsCLR`. Extração 100% read-only. Foco em paridade money-path PIX. Segredos e certificados (credenciais em `TB_PARTICIPANTECONTROLADO`, chaves privadas em `SpiCriptoChavePrivada`, valores de HMAC) NÃO foram copiados.

## Visão geral dos bancos de dados

A cabine PIX legada é fragmentada em vários bancos SQL Server, cada um com uma responsabilidade. O processamento não é monolítico: um enxame de workers .NET (executáveis `worker.fila*`) consome tabelas de fila por polling com `UPDLOCK, READPAST` (padrão skip-locked), e o módulo MED usa Service Broker de verdade.

| DB | Responsabilidade |
|----|------------------|
| **CRK_SPI** | Núcleo operacional: mensagens SPI, pagamentos, saldos (previsto/confirmado, CAMT, SPB), alçadas, tarifas, classificação de status |
| **CRK_SPIAPIBACEN** | Logs de envio/recepção/validação da API do BACEN (canal SPI/ICOM) |
| **CRK_SPIDOMINIO** | Dados de referência: catálogo de mensagens, status, motivos (reasons), bancos/ISPB, campos de filtro, XSDs |
| **CRK_SPIHIST** | Arquivo histórico (espelho das tabelas operacionais para expurgo/retenção) |
| **CRK_SPILOG** | Trilha de integração, log de workers, log de atividade do usuário, alertas de tela/e-mail, downloads, logs de assinatura BACEN |
| **CRK_SPIMENSAGERIA** | Criptografia/mensageria: certificados, chaves pública/privada, XML das mensagens, funções de assinatura |
| **CRK_SPISEEDS** | Geradores/controle de identificadores únicos: EndToEndId, MessageId, RtrId, dedup de UniqueId recebido |
| **CRK_SPIFILAS** | Filas SQL Server Service Broker (criadas pelo módulo MED); também a `SpiFilaInterna` de polling |
| **CRK_SPIMOCK** | Cadastro de instituições financeiras / filiais (mock: `spb_tb_cad_inst_financ`, `spb_tb_cad_filial_inst`) |
| **CRK_SPISIMULADOR** | Simulador do BACEN (mensagens enviadas/recebidas/pagamentos gerados) |
| **DES_4DICT** | DICT: contas/chaves cadastradas, operações (create/update/delete de chave), reivindicações (claims), histórico de situação |
| **DICT Simulador** (`DICT.Web.Api.Simulador`) | Simulador do DICT: `Conta`, `ArquivoCid`, `Requisicao` |
| **CRK_GDI** | MED / GID (Gestão de Devolução e Infração): `TB_TRCK002` (tracking), `TB_CAMT025`, `TB_PARTICIPANTECONTROLADO` (multiliquidação/participante indireto), parâmetros |

Contagem aproximada (a partir dos scripts): ~13 bancos, ~55 tabelas relevantes, ~25 índices explícitos, ~20 procedures principais + funções CLR (assemblies em `AdmWeb/XPsCLR`).

---

## 1. CRK_SPI (núcleo operacional)

Tabelas (versão autoritativa `Base CRK_SPI/Tabelas/v1/Criacao_Tabelas.sql`, mais rica que o consolidado):

### SpiMessage (tabela central de operações money-path)
PK `IdOperacao` (bigint identity). Uma linha por operação (pacs.008, pacs.004, camt, etc.).

| Coluna | Tipo | Papel |
|--------|------|-------|
| IdOperacao | bigint PK | Id interno da operação |
| CdMsg / MsgDefIdr | varchar(10)/(30) | Código da mensagem (ex.: pacs.008) e MsgDefIdr do catálogo |
| IdInstFinanc / IdFilialInst | int | Instituição / filial dona |
| DtMovto / DtHrOperacao | date / datetime2 | Data de movimento e timestamp |
| IspbDebtor / IspbCreditor | char(8) | ISPB pagador / recebedor |
| IspbIF | char(8) | ISPB da IF (participante indireto, add em 20201106; default '') |
| IdSystem | int | Sistema de origem/roteamento (3=SPI, 5=GID/MED) |
| **UniqueId** | varchar(36) | Chave de idempotência de recepção (dedup) |
| **MessageId** | varchar(32) | MessageId gerado no envio |
| **EndToEndId** | char(32) | E2E BACEN |
| FlDebitoCredito | tinyint | 1=débito / 2=crédito (default 1) |
| IdStatus | int | Status corrente (FK SpiStatusOperacao) |
| FlSentido | tinyint | 1=envio(saída), 2=recepção(entrada) — usado no cálculo de saldo |
| RtrId / MessageIdOrig / IdOperacaoOrig / EndToEndIdOrig / IdSystemOrig | | Encadeamento para devolução (pacs.004) e resposta |
| DtHrMsg / DtHrTermino / DtHrLiquidacao / DtContabil | | Marcos temporais e data contábil da liquidação |
| **FlAtuSldConf** | char(1) | Flag "saldo confirmado já atualizado" (evita dupla contabilização de saldo) |
| NumCtrlSTR | varchar(36) | Nº de controle STR (integração legado/SPB) |
| JsonInput | varchar(max) | Payload de entrada bruto |
| ResourceId | varchar(40) | PIResourceId do BACEN |
| Ustrd | varchar(140) | Descrição livre |
| IdUsuario | int | Usuário que originou (envio manual) |

### SpiPayment (dados financeiros do pagamento) - FK IdOperacao → SpiMessage (ON DELETE CASCADE)
PK `IdOperacao`. `Vlr numeric(18,2)` (default 0), `Ccy char(3)` default 'BRL', `IdMetodo tinyint` default 1, **`IdPriority tinyint` default 1** (prioridade), `ChargeBearer int` default 1, `TxId varchar(35)`, `InitgPty char(14)`. Pagador: `CpfCnpjDebtor`, `NmDebtor`, `IdAccountDebtor numeric(20,0)`, `IssuerAccountDebtor`, `TypeAccountDebtor char(4)`, `ProxyIdDebtor varchar(77)`. Recebedor: mesmos campos `*Creditor`. `ReturnReasonCodes varchar(max)`.

### SpiMessageHistory (histórico de status) - PK (IdOperacao, DtHrHistorico, IdStatus), FK → SpiMessage
Guarda `XmlMsg`, `DetStatus`, `OrigStatus`, `DadosRetorno`, `ResourceId`, `IdUsuario` por transição.

### SpiMessageIds (CONTROLE DE MESSAGEIDS GERADOS - idempotência de envio)
PK NONCLUSTERED (MessageId, IdOperacao), FK IdOperacao → SpiMessage. Registra CADA MessageId que a cabine gerou/emitiu para uma operação (originais + respostas). Inserido dentro de `SPI_SPUPDSTATUSMESSAGE` só se ainda não existir (garante que um MessageId nunca é reemitido para a mesma operação). Chave da não-duplicação de envio.

### SpiSaldo (saldo previsto/confirmado por IF e data) - PK (IdInstFinanc, DtMovto)
`VlrPrevisto`, `VlrConfirmado`, `VlrSaldoAnterior`, `VlrSaldoPrevisto`, `VlrSaldoConfirmado` numeric(28,2). Roll-forward diário mantido por `SPI_SPUPDSLDSPI`.

### SpiSaldoCAMT (saldo lido do BACEN via camt) - PK (IdInstFinanc/Ispb, DtHrSaldoDisponivel, DtHrSaldoBloqueado)
`VlrSaldoDisponivel`, `VlrSaldoBloqueado` numeric(28,2). (No consolidado a PK é por `Ispb`; na versão rica por `IdInstFinanc`.)

### SpiSaldoSpb (saldo SPB/reserva) - PK (DtMovto, IdInstFinanc)
`VlrSaldo numeric(28,2)`, `DtAtualizacao`.

### SpiReqSaldo / SpiHistReqSaldo (requisição de saldo camt.060)
`SpiReqSaldo`: PK `IdRequisicao` identity; `Ispb`, `IspbDestino`, `IdTipoMsg`, `IdTipoRequisicao`, `Vlr`, `NumCtrlIF varchar(20)`, `Protocolo`, `FinlddLPI tinyint` (finalidade LPI). Histórico em `SpiHistReqSaldo`.

### SpiStatusOperacao + SpiClassifResultado (MOTOR DE FINALIDADE/ERRO)
- `SpiStatusOperacao(IdStatus PK, DsStatus, Resultado, EhMensagem, EhMensagemIda, EhStatusLogIntegracao)`.
- `SpiClassifResultado(Resultado PK, DsResultado, EhStatusFinal, EhStatusPendente, EhErro)`.
- Regra: um status só é sobrescrito se o atual NÃO for final (`EhStatusFinal='S'` trava). Determina também se contabiliza saldo confirmado (`EhErro` → estorna previsto).

### SpiAccount (contas PIX cadastradas por IF)
`Id` PK identity, `IdInstFinanc`, `IdFilialInst`, `CnpjCpf`, `AccountNo varchar(34)`, `Type`, `IcDefault char(1)` default 'N', `Issuer`, `Proxy varchar(2048)`, `IdStatusConta` default 1.

### Alçadas (autorização por valor/quantidade de vistos)
- **SpiCadParamAlcada** (parametrização): `IdAlcada` PK identity, `IdInstFinanc`, `NmAlcada`, `IdPeriodoVerificacao`, `NrQtdeVistos` (nº de aprovações exigidas), listas `UsuariosAlcada/GruposAlcada/IdSystemsAlcada/UsuariosAprovadores/GruposAprovadores`, **`VlrMinimo/VlrMaximo/VlrDiario numeric(28,2)`**, `HrInicioVerificacao/HrFimVerificacao char(5)` (janela horária), `JsonMsgs`, `FlAtiva` default 'S'.
- **SpiRegAlcada**: registro de operação retida em alçada; `IdRegistroAlcada` PK, `IdAlcada`, `IdOperacao` (FK→SpiMessage CASCADE), `IdStatusAlcada tinyint` default 37, `NrVistos`.
- **SpiRegAlcadasOperacao**: N:N operação↔alçadas disparadas.
- **SpiRegVistoAlcada**: PK (IdRegistroAlcada, IdUsuario); `IdStatusVisto`, `DsVisto` (aprovação/rejeição por usuário).

### Tarifas
- **SpiCadParamTarifa**: `IdParametroTarifa` PK identity, `DtInicioVigencia`, `NrQtdeMsgs`, `VlrTarifa numeric(14,5)`.
- **SpiCadParamTarifaXMsg**: N:N tarifa↔CdMsg (FK cascade).

### Alertas de mensagem (pendências)
- **SpiCadParamAlertaMsg** (`IdInstFinanc`, `CdMsg`, `JsonFiltroAlerta`) e **SpiCadParamAlertMsgXUsuario** (destinatários).

### Outras
- **SpiADMI004**: avisos operacionais do BACEN (admi.004) — PK `DtHrAviso`, `EvtCd`, `EvtDesc`.
- **SpiMessageXSystem** (fan-out): PK (IdOperacao, IdSystem), `IdOperacaoDest varchar(100)` — mapeia a operação SPI para o id no sistema legado/multiliquidação de destino (FK→SpiMessage cascade).
- **SpiCadParamRetornoLegado** (`IdSystem`, `NmDll`, `NmClasse`): roteamento do handler .NET de retorno por sistema (ex.: IdSystem 3 → `SPI.Core.Application...TrataRetornoLegado`).
- **SpiDtMovto**: controle da data de movimento aberta por IF (`Ativa`, `DtMovtoAnterior`).
- **SpiCadParamReqSaldo / SpiCadParamValoresSaldo**: parâmetros por vigência para requisição de saldo e limites.
- **SpiLayoutReport**: layouts de relatório (JSON).

Índices notáveis (CRK_SPI): `IX_SpiMessage_2` (DtMovto, IdInstFinanc, IdFilialInst, CdMsg INCLUDE IdOperacao); **`IX_SpiMessage_4` (CdMsg, IdInstFinanc, IdFilialInst, DtMovto, FlSentido, IdStatus)** — caminho principal das telas de monitor; **`IX_SpiMessage_5` (IdStatus INCLUDE MessageId)** — polling de status por workers. Em 20200917 a PK de `SpiMessage` migrou para NONCLUSTERED e reindexação de `SpiMessageIds`, `SpiXmlMessage`, `SpiMessageXSystem`.

Procedures principais:
- **SPI_SPUPDSTATUSMESSAGE / _2**: atualiza status da operação com trava de finalidade (não regride status final), preenche datas via COALESCE (nunca sobrescreve marco já gravado), registra MessageId em `SpiMessageIds` (idempotente) e, no status final, chama `SPI_SPUPDSLDSPI` para contabilizar saldo. Versão `_2` recebe TVP (READONLY) para lote.
- **SPI_SPUPDSLDSPI / _2**: motor de saldo previsto/confirmado. `FlSentido` 2=+1 (crédito) / 1=-1 (débito); trata confirmação vs rejeição, D0 vs data contábil futura (subtrai do previsto no dia do movimento e recoloca na data contábil), roll-forward do saldo confirmado para datas futuras.
- **SPI_SPUPDHISTSTATUS**: grava histórico de status.

---

## 2. CRK_SPIAPIBACEN (logs da API BACEN)

- **SpiEnvioApiBacen**: PK (MessageId, DtHrEnvio); `Ispb`, `ReturnCode`, `PIResourceId`, `XmlMsg`, `ContentType`, `Problem` (RFC7807).
- **SpiRecepApiBacen**: PK (PIResourceId, Ispb, DtHrRecepcao); `ReturnCode`, `ContentType`, `Next` (paginação de long-poll), `XmlMsg`, `DtHrProcessamento`.
- **SpiValResultApiBacen**: resultado da validação da mensagem recebida; `ErrosValidacao`, `ValoresHeader`, `MsgResposta tinyint`, correlação `IdOperacaoOriginal/MessageIdOriginal/PIResourceIdOriginal` e `CdMsgGerar/MsgDefIdrGerar` (qual resposta gerar).

Procedures (TVP em lote): `SPI_SPUPDLOGENVIOAPIBACEN`, `SPI_SPUPDLOGRECEPAPIBACEN`, `SPI_SPUPDVALRESPAPIBACEN`, `SPI_SPUPDVALRESULTAPIBACEN`.

---

## 3. CRK_SPIDOMINIO (referência / catálogo)

- **SpiCadMessage** (catálogo de mensagens): PK `CdMsg`; `FlFinanceira` (1=financeira/prioritária), `FlAssinar`, `CdMsgResposta`, `CdMsgErro`, `Classificacao`, `Caracteristica`, `CdMsgsRespondidas` (quais msgs esta responde).
- **SpiCadMessageVigencia**: PK (CdMsg, DtInicioVigencia); `MsgDefIdr`, `NmXsd` (versionamento de layout).
- **SpiCadXSD**: PK `NmXsd`, `Conteudo` (XSD inteiro em texto).
- **SpiDomain / SpiRefSource / SpiReason / SpiStatus**: enums do catálogo BACEN (domínios, fontes, motivos de rejeição com `FlPodeReenviar`, status).
- **SpiMsgXSystem**: PK (IdSystem, CdMsg); `FlGeraMsg`, `FlNotificaOrigemBacen` — quais mensagens cada sistema gera/notifica.
- **SpiSystem**: PK `IdSystem`; `IsBacen`, `IsSPI`, `IspbOrigem`. Semeados: 2=Teste, 3=SPI, 5=GID/MED.
- **SpiBanco**: diretório ISPB↔banco (CdBanco, NmBanco, Ispb).
- **SpiCamposFiltro / SpiCamposFiltrosxMsg**: campos de filtro configuráveis por mensagem (telas de consulta/alerta).

---

## 4. CRK_SPIHIST (arquivo histórico)

Espelho de `SpiMessage`, `SpiMessageHistory`, `SpiPayment`, `SpiMessageIds` (mesmas colunas). Alimentado pelo `worker.expurgo` para retenção. Também recebeu `FlAtuSldConf`, `JsonInput`, `NumCtrlSTR`.

---

## 5. CRK_SPILOG (trilha, workers, alertas)

- **SpiLogIntegracao** (trilha de integração): PK `UniqueId`+..; `IdSystem`, `IdTipoWorkerOrigem`, `MetodoApi`, `TipoObjeto`, `JsonProtocolo`, `MessageId/EndToEndId/RtrId/IdOperacao`.
- **SpiDetLogIntegracao**: detalhe por transição; `IdStatusOperacao`, `IcSucesso`, `TipoResultado`, `JsonResultado`, `ResourceId`, `XmlMsg`.
- **SpiLogWorker**: log por worker; `GuidWorker`, `TipoLog`, **`Fila varchar(300)`**, `UniqueId`, `IdOperacao`, `MessageId`, `EndToEndId`, `LabelMsg`, `DsLog`.
- **SpiWorkerAtivo**: heartbeat dos workers (`GuidWorker`, `Tipo`, `DtHrUltimoPulso`, `DtHrTermino`).
- **SpiLogEnvioBacen / SpiLogRetornoBacen**: log de assinatura XMLDSig (CertSerial, CertIssuer, CanonicalizationMethod, SignatureMethod, XmlSignature, XmlMsg).
- **SpiLogAtividade**: log de ação do usuário (`IdUsuario`, `IdTransacao`, `DsLog`).
- **SpiLogAutomacaoMsg**: controle de automação de mensagens (por `IdAutomacao`, `HrRefExecucao`).
- **SpiLogAlertaMsg / SpiLogAlertaTela / SpiLogAlertaMsgAlcada**: alertas (e-mail e tela) de pendência e de alçada; `DsEmails`, `DsEmailsNaoEnviados`, `ListaErros`, `FlLida`, `IdUsuarioNotificar`.
- **SpiDownloadArquivos**: arquivos gerados (camt.052 etc.); `BinArquivo varbinary(max)`, `HashValido`, `GuidDownload` (índice único), `NrLinhas`.

Procedures: `SPI_SPLOGENVIOBACEN`, `SPI_SPLOGRETBACEN`, `SPI_SPLOGENVIOAPIBACEN`, `SPI_SPLOGRETAPIBACEN`, `SPI_SPUPDLOGINTEG(2)`, `SPI_SPUPDDETLOGINTEG(2)` (várias em versão TVP para lote).

---

## 6. CRK_SPIMENSAGERIA (criptografia / assinatura)

- **SpiCriptoChaves**: PK `id_registro` identity; `nr_ispb`, `ds_CN`, `flag_prod_teste`, `ds_serial`, `vb_chave_publica varbinary(148)`, `bin_certificado_original`, `flag_ativo`, `flag_valido`, colunas computadas `cert_id`, `nr_sequencia`, `tp_finalidade` (via funções CLR). Domínio via FK → `SpiCriptoDomain`.
- **SpiCriptoChavePrivada**: PK/FK `id_registro`; `bin_chave_privada`, `bin_passphrase` (varbinary — SEGREDO, não copiado).
- **SpiCriptoDomain**: domínios de cripto (id_dominio, cd_dominio).
- **SpiMessage** (nesta base é por `MessageId` PK): índice das mensagens; `IspbDebtor/Creditor`, `EndToEndId`, `RtrId`, `ResourceId`, `IdOperacao`, `EndToEndIdOrig`.
- **SpiXmlMessage**: XML completo (`XmlMsg varchar(max)`), `Sentido` default 1, PK (MessageId, DtHrMsg, CdMsg), FK→SpiMessage cascade.
- Funções CLR/T-SQL: `spb_fc_VarbinaryToVarcharHex`, `spb_fc_obtem_tp_finalidade`, `spb_fc_obtem_nr_sequencia`, `SPI_SPUPDLOGMENSAGERIA`, view `spivwcertificado`.

---

## 7. CRK_SPISEEDS (identificadores únicos / dedup)

Núcleo da idempotência de recepção e geração de ids:
- **SpiEndToEndIds**: PK (Ispb, EndToEndId) — E2E já usados; evoluído com `IdSystem`, `FlUtilizado`, `DtMovto`.
- **SpiMsgIds**: PK (Ispb, MsgId) — MessageIds emitidos; +`DtHrOperacao`.
- **SpiReturnIdentification**: PK (Ispb, RtrId) — RtrId de devolução; +`DtMovto`.
- **SpiRecMsg**: PK `UniqueId` — dedup de mensagens recebidas (com `IdSystem`, `DtHrRecepcao`).

Procedures: **SPI_SPNEXTIDOPERACAO** (gera bloco de IdOperacao a partir de `SEQIDOPERACAO`), **SPI_UPDDADOSRECEPMSG / _2** (grava E2E/RtrId/MsgId/UniqueId de forma idempotente; a `_2` de 20201106 trata participante indireto crédito/débito, inserindo por `Ispb` correto).

---

## 8. CRK_SPIFILAS + mecanismo de filas

Duas mecânicas coexistem:
1. **Workers de polling** (arquitetura principal do SPI): tabela `SpiFilaInterna` (`Ispb`, `Chave`, `DtHrEntrada` FIFO, `DtHrProcessamento` NULL=disponível, `IpClient` afinidade). Claim via `SELECT ... WITH (UPDLOCK, READPAST)` + `ROW_NUMBER() OVER (ORDER BY DtHrEntrada)` (skip-locked, um por vez) — visto em `SPI_SPGETMSG`. Executáveis por tipo de fila com **separação por prioridade FIN vs GEN**:
   - `worker.filaentrada` / `filaentradaFIN` (financeira/prioritária) / `filaentradaGEN` (geral)
   - `worker.filaenvioapibacen` / `filaenvioapibacenFIN`
   - `worker.filaretornoapibacen`, `worker.tratamentoretornoapibacen(FIN/RSP)`
   - `worker.filastatus` / `filastatusFIN` / `filastatusRSP`
   - `worker.retornolegado`, `worker.conciliacao`, `worker.envioalerta(alcada)`, `worker.envioautomacaomensagem`, `worker.downloadautomatico`, `worker.expurgo`, `worker.caching`, `worker.tarefasautomaticas`
   - `worker.sec.*` = instâncias secundárias/redundantes.
2. **SQL Server Service Broker** (usado pelo módulo MED em `CRK_SPIFILAS`): filas + message types + contracts + services criados por `Med_gid/scripts/01.Inicial.sql`:
   - `SPI_INPUT_API_MED` (+ `_REPR` reprocessamento, `_ERR` erro, `_DEADLETTER`), `SPI_INPUT_STATUS_MED`, `SPI_INPUT_LOG_MED`, `SPI_INPUT_LOG_ENVIOAPIBACEN_MED`, `SPI_INPUT_LOG_BACEN_MED`. Todas com `POISON_MESSAGE_HANDLING (STATUS = OFF)` e validação `WELL_FORMED_XML`.

Observação: o `20201030_ReviewPerformanceESqlServiceBroker.sql` migrou o núcleo SPI de Service Broker para procedures com Table-Valued Parameters (`READONLY`) em lote (LOGENVIOAPIBACEN, LOGRECEPAPIBACEN, VALRESAPIBACEN, DADOSRECEPMSG etc.) por performance.

---

## 9. CRK_SPIMOCK / CRK_SPISIMULADOR

- **CRK_SPIMOCK**: `spb_tb_cad_inst_financ` (PK `id_inst_financ`, `ispbif`, `id_empresa_liquidnt`, `bol_ativo`) e `spb_tb_cad_filial_inst` (PK id_filial+id_inst) — cadastro de IF/filial e relação consolidadora/liquidante.
- **CRK_SPISIMULADOR**: catálogo próprio (`SpiCadMessage/Vigencia/XSD`, `SpiBanco`), `SpiControleReceive` (ISPB, ResourceId, Next — long-poll), `SpiMessageTeste`, `SpiMessageReturnValues`, `SpiSimulaMsgEnviada`, `SpiSimulaMsgRecebida`, `SpiSimulaPagtosGerados` (`JsonPagto`, `Devolvido`). Reproduz o SPI para testes.

---

## 10. DES_4DICT (DICT)

- **TB_CONTADICT** (chave/conta registrada no DICT): PK `ID_CONTADICT`; `ID_REQUISICAO`, `ID_CID`, `ID_TIPOCHAVE`, `TX_CHAVE nvarchar(77)`, `ID_TIPOPESSOA`, `NR_CPFCNPJPESSOA`, `NM_PESSOA`, `NM_FANTASIAPESSOA`, `NR_AGENCIA`, `ID_TIPOCONTA`, `NR_CONTA`, `NR_SPBPARTICIPANTE`, `IC_CONTAATIVA bit`, `DT_CRIACAOCHAVE`, `DT_POSSECHAVE`.
- **TB_OPERACAO** (operações de chave: create/update/delete/consulta): PK `ID_OPERACAO`; `ID_CID`, `ID_CONTADICT` (FK), `ID_TIPOOPERACAO`, `ID_TIPOMOTIVOOPERACAO`, `DH_INCLUSAO/CONFIRMACAO/CANCELAMENTO`, `ID_TIPOCANCELAMENTO`, + snapshot dos dados da chave.
- **TB_OPERACAOREIVINDICACAO** (claims/portabilidade/posse): PK `ID_OPERACAO`; `ID_TIPOREIVINDICACAO`, `ID_TIPOMOTIVOREIVINDICACAO`, `NR_SPBPARTICIPANTEDOADOR`, **`DH_FIMPERIODORESOLUCAO`, `DH_FIMPERIODOCONCLUSAO`** (prazos regulatórios), `DH_ULTIMAMODIFICACAO`.
- **TB_HISTSITUACAOREIVINDICACAO**: histórico de situação do claim (FK → OPERACAOREIVINDICACAO e TIPOSITUACAO).
- **TB_MENSAGEMOPERACAO**: mensagens/observações por operação.
- Domínios: `TB_TIPOCHAVE`, `TB_TIPOCONTA`, `TB_TIPOPESSOA`, `TB_TIPOOPERACAO`, `TB_TIPOMOTIVOOPERACAO`, `TB_TIPOREIVINDICACAO`, `TB_TIPOMOTIVOREIVINDICACAO`, `TB_TIPOCANCELAMENTO`, `TB_TIPOSITUACAO`, `TB_TIPOFUNCIONALIDADE`, `TB_TIPOHORARIO`, `TB_TIPOSITUACAOSINCRONISMO`, `TB_PARAMETRO`.
- Auth: `TB_USUARIO`, `TB_SENHA`, `TB_SENHA_HMAC` (HASH/SALT — segredos, não copiados).
- Cripto: `SpiCriptoChaves`, `SpiCriptoDomain`, `SpiCriptoChavePrivada` (espelho da mensageria).
- Índices: **`IX_TB_CONTADICT` (ID_TIPOCHAVE, TX_CHAVE)** e **`IX_TB_SOLICITACAO` sobre TB_OPERACAO (ID_TIPOCHAVE, TX_CHAVE)** — caminho de consulta de chave (lookup). FKs completas ligam operações/claims aos domínios.

DICT Simulador (`Conta`, `ArquivoCid`, `Requisicao`): reproduz cadastro de chave (`Cid`, `RequestId`, `Ativa`), arquivo CID (`Base64`, `Sha256`, `Tamanho`, `Status`) e requisições de claim com `DataLimiteResolucao/DataLimiteConclusao`.

---

## 11. CRK_GDI (MED / GID - devolução e infração / multiliquidação)

- **TB_TRCK002** (rastreamento de devolução/infração - trck.002): `UniqueId` PK; `EndToEndId`, `InstructionReturnId` (RtrId), `InitiationForm`, `ReportedTransactionType`, `Amount decimal(18,2)`, `TransactionStatus`, dados completos de pagador e recebedor (ISPB/agência/conta/tipo/CPFCNPJ), `TransactionalAccountid varchar(77)`, `MessageId`, `ProtocoloSPI`, `RetornoBACEN`, `Status int` default 1. (Duas variantes no histórico: com/sem `Currency` e `MsgDefIdr`.)
- **TB_CAMT025** (aceite/resposta de solicitação de devolução - camt.025): PK `UniqueId`; `CdMsg`, `MessageId`, `MessageIdOriginal`, `MsgDefIdr`, `SituacaoTransacao`, `CodigoErro`, `DetalheErro`, `IdSystem` (5=GID), `IspbIF`. Índices por `MessageId`, `MessageIdOriginal`, `DtHrOperacao DESC`, `IdSystem`.
- **TB_PARTICIPANTECONTROLADO** (MULTILIQUIDAÇÃO / participante indireto): PK `NR_SPB`; `NR_SPBDIRETO` (participante direto liquidante), `ID_TIPOCONTA`, `NR_AGENCIA`, `NR_CONTA`, `IC_INTEGRACAOCONTA`, e credenciais/endpoints de integração para sistema de conta (`NM_INSTANCIACONTA`, `TP_SISTEMACONTA` = classe .NET `Multiliquidacao.Core...CC.BNP.v1`), SPI e DICT (logins/senhas cifradas — SEGREDOS não copiados), com fallback secundário. Modela o vínculo participante indireto → liquidante direto e como debitar/creditar a conta real.
- **TB_GRUPO_PARAMETRO / TB_PARAMETRO**: parâmetros de configuração (URLs da API SPI, autenticação; grupos GERAL e SOLICITAÇÃO DEVOLUÇÃO).

---

## 12. SQL CLR / Assemblies (AdmWeb/XPsCLR/x64)

Procedures estendidas (CLR) registradas para funções que o T-SQL puro não faz — usadas no money-path de assinatura/mensageria e integração MQ:
- **EVOCryptoXP** (`03-Reg-EVOCryptoXP.sql`): criptografia/assinatura XMLDSig, decifragem de mensagens BACEN (dentro da mensageria, nunca no Core).
- **EVOXPInterfaceMQSeries / EVOXPEnvioMQSeries** (`02-Reg-System-MQSeries*.sql`): interface IBM MQ Series (envio/recepção) — canal legado.
- **SPBXPXML2Posicional** (`04-Reg-XML2Posicional.sql` / `Reg-XML2Posicional.sql`): conversão XML ↔ posicional (layout legado SPB).
- **EVO.Integracao** (`05-Reg-Integracao.sql`): integração genérica.
Registrados via `01-Reg-XPs-CLR-x64.sql`. (DLLs/dacpac presentes; nenhum segredo lido.)

---

## Achados de schema mais relevantes para paridade money-path

1. **Idempotência de ENVIO** = `SpiMessageIds` (por operação, cada MessageId emitido) + seeds `SpiMsgIds`/`SpiEndToEndIds`/`SpiReturnIdentification` (por ISPB, ids já consumidos). O proc `SPI_SPUPDSTATUSMESSAGE` só insere MessageId se não existir → nunca reemite id para a mesma operação.
2. **Idempotência de RECEPÇÃO** = `SpiRecMsg.UniqueId` (dedup) e `SpiControleReceive/SpiRecepApiBacen` (`Next`/`ResourceId` do long-poll). `UniqueId` é a chave anti-duplicação da entrada.
3. **Trava de finalidade de status**: `SpiClassifResultado.EhStatusFinal` impede regressão de status; `EhErro` distingue rejeição de confirmação. Toda mudança de status passa por `SPI_SPUPDSTATUSMESSAGE`, que também dispara contabilização de saldo apenas no status final.
4. **Modelo de saldo em 2 dimensões**: `SpiSaldo` (previsto vs confirmado, roll-forward diário via `SPI_SPUPDSLDSPI`, com `FlSentido` definindo sinal débito/crédito e tratamento D0 vs data contábil futura) + `SpiSaldoCAMT` (disponível/bloqueado lido do BACEN) + `SpiSaldoSpb` (reserva). `FlAtuSldConf` evita dupla atualização de saldo confirmado.
5. **Alçadas** = `SpiCadParamAlcada` (VlrMinimo/Maximo/Diario, NrQtdeVistos, janela horária, listas de usuários/grupos aprovadores) → `SpiRegAlcada` (operação retida, status default 37) → `SpiRegVistoAlcada` (aprovações por usuário) → alertas em `SpiLogAlertaMsgAlcada`. Money-path bloqueia envio até completar os vistos.
6. **Filas por prioridade**: separação física FIN (financeira) vs GEN (geral) em workers dedicados (`filaentradaFIN`/`filaentradaGEN`, `filastatusFIN`, `filaenvioapibacenFIN`), com claim skip-locked (`UPDLOCK, READPAST`) sobre `SpiFilaInterna`. `SpiCadMessage.FlFinanceira` marca a prioridade. MED usa Service Broker real (com dead-letter e reprocessamento).
7. **Geração de MessageId no envio**: controlada centralmente; `SPI_SPNEXTIDOPERACAO` gera blocos de IdOperacao a partir de `SEQIDOPERACAO`; MessageId/E2E/RtrId reservados nos seeds por ISPB antes de emitir (impede colisão entre workers concorrentes).
8. **Participante indireto crédito/débito**: `SpiMessage.IspbIF` (add 20201106) + `TB_PARTICIPANTECONTROLADO` (NR_SPB indireto → NR_SPBDIRETO liquidante) + `SpiMessageXSystem` (fan-out da operação para o sistema de conta/multiliquidação com `IdOperacaoDest`). O crédito/débito real é aplicado na conta do sistema integrado (classe `Multiliquidacao...CC.BNP.v1`).
9. **Conciliação de status**: `worker.conciliacao` + correlação `SpiValResultApiBacen` (IdOperacaoOriginal/MessageIdOriginal/PIResourceIdOriginal → qual resposta gerar) e `SpiADMI004` (avisos/admi.004 do BACEN) fecham operações sem pacs.002.
10. **Devolução/infração (MED)**: encadeamento por `RtrId` em `SpiMessage` (RtrId/MessageIdOrig/IdOperacaoOrig/EndToEndIdOrig) + `TB_TRCK002` (tracking, InstructionReturnId, Status) + `TB_CAMT025` (aceite/erro, correlação MessageIdOriginal). Motivos de rejeição em `SpiReason.FlPodeReenviar` decidem reapresentação.
11. **Tarifas**: `SpiCadParamTarifa` (VlrTarifa numeric(14,5) por faixa NrQtdeMsgs e vigência) × `SpiCadParamTarifaXMsg` (por CdMsg).
12. **Assinatura fica na mensageria, nunca no Core**: `CRK_SPIMENSAGERIA` (certificados/chaves + XMLDSig via CLR `EVOCryptoXP`) e logs de assinatura em `SpiLogEnvioBacen/RetornoBacen` — coerente com a regra de que Core não assina mensagem BACEN.
