Isox.Camt054 (Isox v0.1.0)

Copy Markdown View Source

Modelo ISO 20022 do camt.054 (detalhamento de um lançamento da Conta PI — a contrapartida contábil de cada pacs.008/002 liquidada), versões 1.15 e 1.16 coexistindo. A maior mensagem do catálogo.

Ntfctn é max: ilimitado no schema — o caminho comum é 1 (um lançamento por notificação, como o próprio mensagens.md descreve: "um por liquidação"), mas encode/3 aceita 1 mensagem ou uma lista (lote: vários Ntfctn na mesma Document) e decode/1 devolve 1 struct ou uma lista de volta, mesmo padrão do Pacs002/Pacs004/Pacs008. Ntry já é max: 1 no schema real, isso não muda.

Cobre o caminho comum de um lançamento de liquidação (mesmos dados de pagador/recebedor do Pacs008, mais metadados contábeis e, quando é devolução, RtrInf). Ficam de fora, mesma razão do Pacs008: Tax e RmtInf.Strd — ramos raros, disponíveis via codec genérico.

RltdAgts é obrigatório como contêiner, mas DbtrAgt/CdtrAgt dentro dele são cada um independentemente opcional (diferente do Pacs008, onde os dois agentes são sempre obrigatórios) — confirmado contra o schema real, não assumido do padrão anterior.

addtl_tx_inf (AddtlTxInf) não é texto livre, apesar do nome — o tipo XSD real (Priority2Code) e a planilha ("prioridadePagamento") confirmam que é a prioridade da transação original (HIGH/NORM), reaproveitando por engano o mesmo tipo ISO do InstrPrty de Pacs008/Pain013. Fica com esse nome porque é a tag XML (AdditionalTransactionInformation) do schema — mas só aceita esses dois valores.

Summary

Functions

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

Types

t()

@type t() :: %Isox.Camt054{
  accptnc_dt_tm: term(),
  acct_ispb: term(),
  addtl_ntfctn_inf: term(),
  addtl_ntry_inf: term(),
  addtl_tx_inf: term(),
  bktxcd_domn_cd: term(),
  bktxcd_fmly_cd: term(),
  bktxcd_sub_fmly_cd: term(),
  bookg_dt: term(),
  cdt_dbt_ind: term(),
  cdtr_acct_id: term(),
  cdtr_acct_issr: term(),
  cdtr_acct_proxy: term(),
  cdtr_acct_type: term(),
  cdtr_agt_ispb: term(),
  cdtr_cpf_cnpj: term(),
  clr_sys_ref: term(),
  created_at: term(),
  dbtr_acct_id: term(),
  dbtr_acct_issr: term(),
  dbtr_acct_type: term(),
  dbtr_agt_ispb: term(),
  dbtr_cpf_cnpj: term(),
  dbtr_name: term(),
  end_to_end_id: term(),
  initg_pty_id: term(),
  instr_id: term(),
  lcl_instrm: term(),
  msg_id: term(),
  msg_nm_id: term(),
  ntfctn_id: term(),
  prtry_ref: term(),
  purp_cd: term(),
  rmt_inf: term(),
  rtr_rsn_addtl_inf: term(),
  rtr_rsn_cd: term(),
  sts_cd: term(),
  tx_id: term(),
  val_dt: term(),
  value: term()
}

version()

@type version() :: :v1_15 | :v1_16

Functions

decode(xml)

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

Decodifica um XML de camt.054 de volta para a struct — ou, quando a mensagem traz mais de um Ntfctn (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 Ntfctn 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.