Isox.Pain013 (Isox v0.2.0)

Copy Markdown View Source

Instrução de pagamento agendada, vinculada a uma recorrência ativa do Pix Automático.

Versão 2.2. Na data marcada, esta instrução vira uma Isox.Pacs008 real, que repete o end_to_end_id gerado aqui. A resposta imediata é uma Isox.Pain014, dizendo se o participante do pagador aceitou.

O valor vai em Amt/InstdAmt, não em IntrBkSttlmAmt, porque ainda não houve liquidação. Purp aqui é Prtry, com enum próprio, não Cd como na pacs.008.

Campos fixos que não viram campo

InitgPty é [0]{14} no schema real, quatorze zeros literais, então não é variável. O mesmo vale para PmtMtd ("TRF"), InstrPrty ("NORM"), SvcLvl.Prtry ("PAGAGD"), LclInstrm.Prtry ("AUTO") e ChrgBr ("SLEV").

Regras que o XSD não expressa

reqd_exctn_dt é opcional no schema, mas na prática é obrigatório quando purp_prtry é "AGND" e proibido nos outros casos.

tax_records é o bloco de Split Payment, a divisão de IBS e CBS da reforma tributária. Só é permitido quando dbtr_cpf_cnpj é CNPJ. Cada tipo de tributo precisa de um registro com ctgy igual a "INF", o valor informado, e pode ter outro com "COR", o valor corrigido pela Plataforma Pública, que prevalece quando existe. A soma dos valores efetivos não pode passar de value. encode/3 valida tudo isso.

Lote

PmtInf é ilimitado no schema. encode/3 aceita uma mensagem ou uma lista, com NbOfTxs ajustado, e decode/1 devolve uma struct ou uma lista.

Summary

Functions

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