Isox.Pain012 (Isox v0.1.0)

Copy Markdown View Source

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.

UndrlygAccptncDtls é max: ilimitado no schema — encode/3 aceita 1 mensagem ou uma lista (lote: vários UndrlygAccptncDtls na mesma Document) e decode/1 devolve 1 struct ou uma lista de volta, mesmo padrão do Pacs002/Pacs004/Pacs008. O mandato original aqui difere do Pain009/Pain011: tem Dbtr.PstlAdr.TwnNm (endereço, opcional) e MndtRef (opcional) que os outros dois não têm, e não tem Adjstmnt — conferido contra o schema real de cada mensagem, não assumido por semelhança.

MndtPrcgDtls é opcional (lista, 0 a 3) aqui (diferente do Pain009, onde é obrigatório com exatamente 3) — SplmtryData ganha ainda MndtSts.

Regra da planilha do catálogo, sem contrapartida estrutural no XSD: accptd == "false" exige rjct_rsn_prtry presente e mndt_sts/ mndt_prcg_dtls ausentes; accptd == "true" exige o oposto (rjct_rsn_prtry ausente, mndt_sts presente). encode/3 valida isso explicitamente — confirmado nos 12 exemplos oficiais do BCB, sem exceção. A composição exata de mndt_prcg_dtls (que domínios acompanham qual mndt_sts) não é validada — regra mais profunda, documentada na planilha mas não verificável aqui sem duplicar a lógica de negócio inteira.

Summary

Functions

Decodifica um XML de pain.012 de volta para a struct — ou, quando a mensagem traz mais de um UndrlygAccptncDtls (lote), para uma lista de structs.

Monta o XML (envelope completo, AppHdr + Document) para a versão dada. Aceita 1 mensagem ou uma lista de mensagens (lote — vira vários UndrlygAccptncDtls na mesma Document).

Types

t()

@type t() :: %Isox.Pain012{
  accptd: term(),
  created_at: term(),
  instg_agt_ispb: term(),
  mndt_prcg_dtls: term(),
  mndt_sts: term(),
  msg_id: term(),
  orgnl_cdtr_agt_ispb: term(),
  orgnl_cdtr_cpf_cnpj: term(),
  orgnl_cdtr_name: term(),
  orgnl_colltn_amt: term(),
  orgnl_dbtr_acct_id: term(),
  orgnl_dbtr_acct_issr: term(),
  orgnl_dbtr_agt_ispb: term(),
  orgnl_dbtr_cpf_cnpj: term(),
  orgnl_dbtr_twn_nm: term(),
  orgnl_fnl_colltn_dt: term(),
  orgnl_frqcy_tp: term(),
  orgnl_frst_colltn_dt: term(),
  orgnl_mndt_id: term(),
  orgnl_mndt_ref: term(),
  orgnl_mndt_req_id: term(),
  orgnl_rfrd_doc_cdtr_ref: term(),
  orgnl_rfrd_doc_nb: term(),
  orgnl_trckg_ind: term(),
  orgnl_ultmt_dbtr_cpf_cnpj: term(),
  orgnl_ultmt_dbtr_name: term(),
  rjct_rsn_prtry: term()
}

version()

@type version() :: :v1_3 | :v1_4

Functions

decode(xml)

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

Decodifica um XML de pain.012 de volta para a struct — ou, quando a mensagem traz mais de um UndrlygAccptncDtls (lote), para uma lista de structs.

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ários UndrlygAccptncDtls na mesma Document).

msg_id/created_at/instg_agt_ispb são de GrpHdr (uma vez por mensagem XML) — em lote, têm que ser iguais em todos os itens da lista.