# Isox v0.1.0 - Table of Contents

> Codec ISO 20022 do catálogo de mensagens do SPI (Pix) — encode/decode genéricos por envelope (cabeçalho + mensagem), mais um módulo apartado de assinatura XMLDSig (perfil do Manual de Segurança do SFN).

## Pages

- [Isox](readme.md)
- [Changelog](changelog.md)
- [LICENSE](license.md)

## Modules

- [Isox](Isox.md): Codec das mensagens ISO 20022 do catálogo do SPI (Pix): `encode/2` e
`decode/1` genéricos, que despacham pelo tipo do modelo (`encode/2`) ou
pelo namespace do XML (`decode/1`) para o módulo certo — o schema é
gerado a partir dos XSDs publicados pelo Banco Central (não
redistribuídos aqui — ver `mix catalog.gen`).

- Modelos
  - [Isox.AppHdr](Isox.AppHdr.md): BAH (`head.001`) — cabeçalho compartilhado por toda mensagem do catálogo
(Manual VIII). Fica isolado aqui porque toda mensagem aprofundada
(pacs.008, pacs.002, admi.002, ...) monta o mesmo cabeçalho do mesmo
jeito; só o `Document` muda por mensagem.
  - [Isox.Envelope](Isox.Envelope.md): Cabeçalho (`Isox.AppHdr`) + modelo de uma mensagem do catálogo — o par
que `Isox.encode/2` recebe e `Isox.decode/1` devolve.

- Mensagens (API de baixo nível)
  - [Isox.Admi002](Isox.Admi002.md): Modelo ISO 20022 do admi.002 (recusa de mensagem) — resposta de
erro da ICOM referenciando a mensagem recusada por `RltdRef/Ref`, que é
o `PI-ResourceId` devolvido no ingresso daquela mensagem (Manual VIII).
  - [Isox.Admi004](Isox.Admi004.md): Modelo ISO 20022 do admi.004 (evento de sistema, ex.: mudança de
data contábil), versão 1.2 — notificação sem referência transacional.
  - [Isox.Camt014](Isox.Camt014.md): Modelo ISO 20022 do camt.014 (consulta de identificação de
participante — `ReturnMember`), versão 1.6 — lookup num registro
estático/configurável de participantes: ISPB consultado (`MmbId`) mais
os dados do participante (`MmbOrErr.Mmb`) e do role (`PtyRoleIdSD1`).
  - [Isox.Camt025](Isox.Camt025.md): Modelo ISO 20022 do camt.025 (recibo, resposta a trck.002),
versão 1.0 — até 500 confirmações por mensagem (`RctDtls` é
`max: ilimitado` no schema real, modelado como lista de verdade).
  - [Isox.Camt029](Isox.Camt029.md): Modelo ISO 20022 do camt.029 (resposta ao camt.055 — aceite
`ACCR` ou rejeição `RJCR`), versões 1.1 e 1.2 coexistindo (enums de
`rsn_prtry` diferem entre as duas: `v1_1` tem 4 códigos a mais que
`v1_2`). Correlaciona com o `PmtCxlId` do camt.055 original (aqui
`OrgnlPmtInfCxlId`).
  - [Isox.Camt052](Isox.Camt052.md): Modelo ISO 20022 do camt.052 (relação de lançamentos da Conta
PI, resposta a camt.060), versão 1.3.
  - [Isox.Camt053](Isox.Camt053.md): Modelo ISO 20022 do camt.053 (saldo/demonstrativo da Conta PI,
resposta a camt.060), versão 1.4.
  - [Isox.Camt054](Isox.Camt054.md): Modelo ISO 20022 do camt.054 (detalhamento de um lançamento da
Conta PI — a contrapartida contábil de cada pacs.008/002 liquidada),
versões 1.15 e 1.16 coexistindo. A maior mensagem do catálogo.
  - [Isox.Camt055](Isox.Camt055.md): Modelo ISO 20022 do camt.055 (pedido de cancelamento de ordem
agendada — Pix Agendado), versão 1.1. Referencia a ordem agendada por
`OrgnlEndToEndId` e traz motivo (`CxlRsnInf`). Todo campo do schema
real é obrigatório.
  - [Isox.Camt060](Isox.Camt060.md): Modelo ISO 20022 do camt.060 (requisição de relatório da Conta
PI), versão 1.9 — `ReqdMsgNmId` é o campo despachante: decide se a
resposta é camt.052, camt.053 ou camt.054.
  - [Isox.Pacs002](Isox.Pacs002.md): Modelo ISO 20022 do pacs.002 (relatório de status de pagamento),
versões 1.16 e 1.17 (ADR 0002) — a resposta a um pacs.008, referenciando
a mensagem original por `OrgnlInstrId`/`OrgnlEndToEndId` e informando o
status (`TxSts`) e, quando rejeitada, o motivo.
  - [Isox.Pacs004](Isox.Pacs004.md): Modelo ISO 20022 do pacs.004 (devolução), versão 1.5 — a ordem
de devolução de uma pacs.008 já liquidada, referenciando a original por
`OrgnlEndToEndId`.
  - [Isox.Pacs008](Isox.Pacs008.md): Modelo ISO 20022 do pacs.008 (ordem de crédito), versões 1.15 e
1.16 (ADR 0002) — campos com nome amigável em vez do mapa genérico cru
que o motor de codec interno produz.
  - [Isox.Pain009](Isox.Pain009.md): Modelo ISO 20022 do pain.009 (solicitação de autorização de
recorrência / mandato), versão 1.1 — cria o estado de mandato pendente:
`MndtId`, frequência, datas de vigência, valor.
  - [Isox.Pain011](Isox.Pain011.md): Modelo ISO 20022 do pain.011 (cancelamento de mandato), versão
1.3 — carrega uma cópia inteira do mandato original (`OrgnlMndt`, campos
prefixados `orgnl_*`, mesmo formato do `Pain009` sem `Adjstmnt`, que não
existe neste schema) mais o motivo do cancelamento (`CxlRsn`).
  - [Isox.Pain012](Isox.Pain012.md): Modelo ISO 20022 do pain.012 (resposta a pain.009/pain.011 —
aceite ou rejeição de mandato), versões 1.3 e 1.4 coexistindo.
  - [Isox.Pain013](Isox.Pain013.md): Modelo ISO 20022 do pain.013 (agendamento da instrução de
pagamento vinculada a um mandato ativo), versão 2.2 — na data agendada,
essa instrução vira o gatilho de uma pacs.008 real.
  - [Isox.Pain014](Isox.Pain014.md): Modelo ISO 20022 do pain.014 (resposta a pain.013), versões 2.3
e 2.4 coexistindo. Correlaciona com a instrução agendada por
`OrgnlPmtInfId`/`OrgnlEndToEndId`.
  - [Isox.Pibr001](Isox.Pibr001.md): Modelo ISO 20022 do pibr.001 (echo request), versão 1.3 — ping:
`Data` é um text livre (até 35 caracteres) que o pibr.002 de resposta
ecoa em `OrgnlData`.

  - [Isox.Pibr002](Isox.Pibr002.md): Modelo ISO 20022 do pibr.002 (echo reply), versão 1.3 — pong:
ecoa `OrgnlData` com o `Data` recebido no pibr.001 correspondente.

  - [Isox.Reda014](Isox.Reda014.md): Modelo ISO 20022 do reda.014 (solicitação de cadastro de
participante indireto sob um direto), versão 1.3.
  - [Isox.Reda016](Isox.Reda016.md): Modelo ISO 20022 do reda.016 (aviso de status — resposta a
reda.014/022/031), versão 1.5. Correlaciona com o pedido original por
`OrgnlBizInstr.MsgId`.
  - [Isox.Reda017](Isox.Reda017.md): Modelo ISO 20022 do reda.017 (relatório de dados de
participante), versão 1.2 — reflete o cadastro atual, não é resposta a
um pedido específico.
  - [Isox.Reda022](Isox.Reda022.md): Modelo ISO 20022 do reda.022 (solicitação de alteração de
cadastro de participante), versão 1.4 — a mensagem cujo schema real
exigiu corrigir o `Compiler` (ver ADR/issue #27): `ReqdMod` é um
`xs:choice` entre `CtctDtls` (ela mesma outra escolha, entre os grupos
`ReqdModContato` e `ReqdModDiretor`, que compartilham a maioria das
tags — só `Nm` distingue), `TechAdr` e `MktSpcfcAttr`.
  - [Isox.Reda031](Isox.Reda031.md): Modelo ISO 20022 do reda.031 (solicitação de exclusão de
cadastro de participante), versão 1.2 — referencia o ISPB do
participante a excluir.

  - [Isox.Reda041](Isox.Reda041.md): Modelo ISO 20022 do reda.041 (aviso de mudança de
atividade/status de um participante), versão 1.7.
  - [Isox.Registry](Isox.Registry.md): Descobre os módulos `Isox.Generated.<Mensagem>.<Versao>` já
carregados e despacha o parse pela combinação namespace + `MsgDefIdr`
(ADR 0002) — os dois precisam concordar, ou é erro.

  - [Isox.Trck002](Isox.Trck002.md): Modelo ISO 20022 do trck.002 (autorrelato de transferência
entre contas do mesmo participante — book transfer), versão 1.1.
Independente de pacs.008/002; responde-se com camt.025.

- Assinatura digital (avançado)
  - [Isox.Xmldsig.Signer](Isox.Xmldsig.Signer.md): Núcleo do XMLDSig do Pix (Manual de Segurança do SFN Vol. II §3), comum
aos dois perfis que o manual define: SPI (3 `<ds:Reference>` — tabela 3)
e DICT (2 `<ds:Reference>` — tabela 4). Hoje só o perfil SPI está
implementado (`sign/4`); `sign_references/3` e `key_info_xml/2` já são o
suficiente para montar o perfil do DICT quando existir um simulador para
ele — a diferença entre os dois perfis é só a lista de referências, não
o resto do mecanismo (§3.2 do manual: os passos são os mesmos).
  - [Isox.Xmldsig.TestCA](Isox.Xmldsig.TestCA.md): Gera, em memória, um par de chave privada + certificado autoassinado
RSA-2048, para uso em testes e exemplos de `Isox.Xmldsig.Signer`
e `Isox.Xmldsig.Verifier`.
  - [Isox.Xmldsig.Verifier](Isox.Xmldsig.Verifier.md): Verificação do perfil de assinatura SPI (Manual de Segurança do SFN Vol.
II §3.3): recalcula os três digests com canonicalização real — os bytes
vêm de terceiro, então, diferente da assinatura na saída, não dá pra
confiar que já chegaram canônicos — e confere a assinatura RSA-SHA256
sobre o `SignedInfo`.

## Mix Tasks

- [mix catalog.gen](Mix.Tasks.Catalog.Gen.md): Lê todos os `.xsd` de mensagem em `--xsd-dir` (exceto `xmldsig`, que não é
mensagem) e gera, em `--out`, um módulo `Isox.Generated.<Mensagem>.<Versao>`
por arquivo, mais um módulo interno com o BAH (`head.001`), compartilhado
entre todas as mensagens (ADR 0004).
- [mix xmldsig.spike](Mix.Tasks.Xmldsig.Spike.md): Mede o throughput de assinar e verificar uma pacs.008 realista, sem
servidor HTTP no caminho

