# `Isox.Pacs004`
[🔗](https://github.com/RicardoSantos-99/isox/blob/v0.2.0/lib/isox/pacs004.ex#L1)

Devolução: a ordem que faz o dinheiro de um Pix já liquidado voltar.

Versão 1.5. Aponta o pagamento original por `orgnl_end_to_end_id`, e
ganha identificador próprio em `rtr_id`, que segue o mesmo formato do
idFimAFim mas começa com `D` em vez de `E`. A resposta é uma
`Isox.Pacs002`.

Devolução parcial é permitida, então `value` pode ser menor que o
original. Maior, não, e a soma das devoluções também não pode passar do
valor original.

Os dois agentes mantêm os papéis do pagamento original: quem pagou
continua sendo o `dbtr`, mesmo que agora seja ele quem recebe o dinheiro
de volta.

## Lote

`TxInf` é ilimitado no XSD, e o catálogo documenta lote de verdade
(`pacs.004_SPI_10_msg.xml`, 10 transações numa mensagem só). `encode/3`
aceita uma mensagem ou uma lista, e `decode/1` devolve uma struct ou uma
lista, conforme o XML.

# `t`

```elixir
@type t() :: %Isox.Pacs004{
  cdtr_agt_ispb: String.t(),
  created_at: DateTime.t(),
  dbtr_agt_ispb: String.t(),
  msg_id: String.t(),
  orgnl_end_to_end_id: String.t(),
  rmt_inf_ustrd: String.t() | nil,
  rtr_id: String.t(),
  rtr_rsn_addtl_inf: String.t() | nil,
  rtr_rsn_cd: String.t(),
  sttlm_prty: String.t(),
  value: String.t() | number()
}
```

# `version`

```elixir
@type version() :: :v1_5
```

# `decode`

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

Decodifica um XML de pacs.004 de volta para a struct, ou
para uma lista de structs quando a
mensagem traz mais de uma `TxInf` (lote), para uma lista de structs.

# `encode`

```elixir
@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 (lote: vira várias `TxInf` 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.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
