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