Isox.Pain014 (Isox v0.1.0)

Copy Markdown View Source

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.

OrgnlPmtInfAndSts é max: ilimitado no schema — encode/3 aceita 1 mensagem ou uma lista (lote: vários OrgnlPmtInfAndSts na mesma Document) e decode/1 devolve 1 struct ou uma lista de volta, mesmo padrão do Pacs002/Pacs004/Pacs008.

O schema real só define TxSts como ACSP/RJCT — um eventual estado de fila/pendência não existe neste schema, então não é modelado aqui.

InitgPty (14 zeros) e OrgnlGrpInfAndSts (OrgnlMsgId com 32 zeros, OrgnlMsgNmId com 8 zeros) são valores fixos no perfil do BCB, não campos variáveis — a correlação de verdade acontece em OrgnlPmtInfAndSts, não no grupo.

StsRsnInf/rsn_prtry é condicional a tx_sts, regra da planilha do catálogo (BCB): obrigatório quando "RJCT", proibido quando "ACSP" — confirmado nos 4 exemplos oficiais. encode/3 valida isso.

Summary

Functions

Decodifica um XML de pain.014 de volta para a struct — ou, quando a mensagem traz mais de um OrgnlPmtInfAndSts (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 OrgnlPmtInfAndSts na mesma Document).

Types

t()

@type t() :: %Isox.Pain014{
  cdtr_agt_ispb: String.t(),
  cdtr_cpf_cnpj: String.t(),
  created_at: DateTime.t(),
  dbtr_dcsn_dt_tm: DateTime.t(),
  msg_id: String.t(),
  orgnl_end_to_end_id: String.t(),
  orgnl_pmt_inf_id: String.t(),
  rsn_prtry: String.t() | nil,
  tx_sts: String.t()
}

version()

@type version() :: :v2_3 | :v2_4

Functions

decode(xml)

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

Decodifica um XML de pain.014 de volta para a struct — ou, quando a mensagem traz mais de um OrgnlPmtInfAndSts (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 OrgnlPmtInfAndSts na mesma Document).

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