Isox.Pain012 (Isox v0.2.0)

Copy Markdown View Source

Resposta sobre uma recorrência do Pix Automático: aceita ou recusa uma Isox.Pain009 ou uma Isox.Pain011.

Versões 1.3 e 1.4 coexistindo. accptd é o campo que se lê primeiro, e mndt_sts diz a que mensagem esta resposta se refere: "PDNG" responde a uma pain.009, "CCLD" responde a uma pain.011.

A cópia da recorrência difere das outras duas

O bloco do mandato original aqui não é igual ao da pain.009 nem ao da pain.011. Tem Dbtr.PstlAdr.TwnNm e MndtRef, que as outras não têm, e não tem Adjstmnt. Isso foi conferido contra o schema real de cada uma, não deduzido por semelhança.

MndtPrcgDtls é opcional e vai de 0 a 3 itens, diferente da pain.009, que exige exatamente 3. SplmtryData ganha ainda MndtSts.

Regra cruzada que o XSD não expressa

Validada em encode/3, a partir da planilha e confirmada nos 12 exemplos oficiais do BCB, sem exceção:

  • accptd falso exige rjct_rsn_prtry presente, e mndt_sts e mndt_prcg_dtls ausentes.
  • accptd verdadeiro exige o oposto: rjct_rsn_prtry ausente e mndt_sts presente.

Que domínios de mndt_prcg_dtls acompanham qual mndt_sts não é validado aqui. A regra está na planilha, mas verificá-la exigiria duplicar a lógica de negócio inteira do Pix Automático.

Lote

UndrlygAccptncDtls é ilimitado no schema. encode/3 aceita uma mensagem ou uma lista, e decode/1 devolve uma struct ou uma lista.

Summary

Functions

Decodifica um XML de pain.012 de volta para a struct, ou para uma lista de structs 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 para uma lista de structs 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.