Isox.Pain013 (Isox v0.1.0)

Copy Markdown View Source

Modelo ISO 20022 do pain.013 (agendamento da instrução de pagamento vinculada a um mandato ativo), versão 2.2 — na data agendada, essa instrução vira o gatilho de uma pacs.008 real.

PmtInf/CdtTrfTx é max: ilimitado no schema — encode/3 aceita 1 mensagem ou uma lista (lote: vários PmtInf na mesma Document, com NbOfTxs ajustado) e decode/1 devolve 1 struct ou uma lista de volta, mesmo padrão do Pacs002/Pacs004/Pacs008. InitgPty no GrpHdr é sempre [0]{14} (14 zeros) no schema real — não é campo variável, fica fixo, assim como PmtMtd ("TRF"), InstrPrty ("NORM"), SvcLvl.Prtry ("PAGAGD"), LclInstrm.Prtry ("AUTO") e ChrgBr ("SLEV"). Valor vai em Amt/InstdAmt, não IntrBkSttlmAmt — ainda não liquidado. Purp aqui é Prtry (enum próprio), não Cd como no Pacs008. Tax aqui é usado (bloco de Split Payment — divisão de IBS/CBS da reforma tributária).

ReqdExctnDt é opcional no schema, mas obrigatório na prática quando purp_prtry == "AGND" (agendamento futuro) e proibido quando "NTAG"/"RIFL" (reenvio/retentativa, execução imediata) — regra da planilha do catálogo (BCB), confirmada nos 4 exemplos oficiais. encode/3 valida isso.

Tax é opcional e só permitido quando dbtr_cpf_cnpj é CNPJ (14 caracteres). Cada tipo de tributo em tax_records precisa de um Record com ctgy: "INF" (informado pelo recebedor) e opcionalmente outro com ctgy: "COR" (valor corrigido pela Plataforma Pública, tem prioridade sobre o INF quando presente); a soma dos valores efetivos não pode exceder value. encode/3 valida tudo isso.

Summary

Functions

Decodifica um XML de pain.013 de volta para a struct — ou, quando a mensagem traz mais de um PmtInf (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 PmtInf na mesma Document, com NbOfTxs ajustado à quantidade).

Types

t()

@type t() :: %Isox.Pain013{
  cdtr_acct_id: term(),
  cdtr_acct_issr: term(),
  cdtr_acct_type: term(),
  cdtr_agt_ispb: term(),
  cdtr_cpf_cnpj: term(),
  created_at: term(),
  dbtr_agt_ispb: term(),
  dbtr_cpf_cnpj: term(),
  end_to_end_id: term(),
  mndt_id: term(),
  msg_id: term(),
  pmt_inf_id: term(),
  purp_prtry: term(),
  reqd_exctn_dt: term(),
  rmt_inf: term(),
  tax_records: term(),
  tax_ref_nb: term(),
  ultmt_dbtr_cpf_cnpj: term(),
  ultmt_dbtr_name: term(),
  value: term(),
  xpry_dt: term()
}

tax_record()

@type tax_record() :: %{tp: String.t(), ctgy: String.t(), ttl_amt: String.t()}

version()

@type version() :: :v2_2

Functions

decode(xml)

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

Decodifica um XML de pain.013 de volta para a struct — ou, quando a mensagem traz mais de um PmtInf (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 PmtInf na mesma Document, com NbOfTxs ajustado à quantidade).

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.