Isox.Pacs002 (Isox v0.1.0)

Copy Markdown View Source

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.

TxInfAndSts é max: ilimitado no XSD e o catálogo oficial documenta lote de verdade (pacs.002_SPI_10_msg.xml, 10 transações numa mensagem só). encode/3 aceita 1 mensagem ou uma lista (lote); decode/1 devolve 1 struct quando o XML tem 1 TxInfAndSts, ou uma lista quando tem mais — sem uma segunda API paralela pra isso.

StsRsnInf continua modelado como no máximo 1 motivo por transação, com sua lista de AddtlInf.

Mesma validação em duas camadas do Pacs008: encode/3 confere os campos obrigatórios do modelo e depois reaproveita o decode do próprio módulo gerado pra validar pattern/enum/cardinalidade sem duplicar regra — inclusive o enum de Rsn.Cd, que diverge entre 1.16 e 1.17.

Summary

Functions

Decodifica um XML de pacs.002 (qualquer versão) de volta para a struct — ou, quando a mensagem traz mais de uma TxInfAndSts (lote), para uma lista de structs, uma por transação.

Monta o XML (envelope completo, AppHdr + Document) para a versão dada. Aceita 1 mensagem ou uma lista de mensagens (lote — vira várias TxInfAndSts na mesma Document, com NbOfTxs implícito no XSD desta mensagem).

Types

t()

@type t() :: %Isox.Pacs002{
  created_at: DateTime.t(),
  fctv_intr_bk_sttlm_dt: DateTime.t() | nil,
  msg_id: String.t(),
  orgnl_end_to_end_id: String.t(),
  orgnl_instr_id: String.t(),
  orgnl_intr_bk_sttlm_dt: Date.t() | nil,
  sts_rsn_addtl_inf: [String.t()],
  sts_rsn_cd: String.t() | nil,
  tx_sts: String.t()
}

version()

@type version() :: :v1_16 | :v1_17

Functions

decode(xml)

@spec decode(binary()) :: {:ok, t() | [t(), ...], version()} | {:error, term()}

Decodifica um XML de pacs.002 (qualquer versão) de volta para a struct — ou, quando a mensagem traz mais de uma TxInfAndSts (lote), para uma lista de structs, uma por transação.

encode(message, header, version)

@spec encode(t() | [t(), ...], Isox.AppHdr.t(), version()) ::
  {:ok, binary()} | {:error, String.t()}

Monta o XML (envelope completo, AppHdr + Document) para a versão dada. Aceita 1 mensagem ou uma lista de mensagens (lote — vira várias TxInfAndSts na mesma Document, com NbOfTxs implícito no XSD desta mensagem).

msg_id/created_at são campos de GrpHdr (um por mensagem XML, não por transação) — em lote, precisam ser iguais em todos os itens da lista; se divergirem, encode/3 erra em vez de escolher um deles em silêncio.