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
@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() }
@type version() :: :v1_3 | :v1_4
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.
@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.