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

Relatório de status: a resposta a uma `Isox.Pacs008` ou a uma
`Isox.Pacs004`.

Versões 1.16 e 1.17 (ADR 0002). Aponta a mensagem original por
`orgnl_instr_id` e `orgnl_end_to_end_id`, e diz em `tx_sts` o que
aconteceu. Quando rejeitou, `sts_rsn_cd` diz por quê.

Repare na diferença entre os dois identificadores: `orgnl_instr_id`
aceita tanto pagamento quanto devolução, e `orgnl_end_to_end_id` só
aceita pagamento. É o que permite responder a uma devolução ainda
apontando para o pagamento que a originou.

## Lote

`TxInfAndSts` é ilimitado no XSD, e o catálogo documenta lote de
verdade (`pacs.002_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.

`StsRsnInf` segue modelado como no máximo um motivo por transação, com
sua lista de `AddtlInf`.

## Validação

`encode/3` confere os campos obrigatórios e depois faz o caminho de
volta pelo módulo gerado, reaproveitando a validação de pattern, enum e
cardinalidade. Isso inclui o enum de `Rsn.Cd`, que diverge entre 1.16 e
1.17.

# `t`

```elixir
@type t() :: %Isox.Pacs002{
  created_at: DateTime.t(),
  fctv_intr_bk_sttlm_dt: DateTime.t() | nil,
  msg_id: String.t(),
  orgnl_end_to_end_id: String.t(),
  orgnl_instr_id: String.t(),
  orgnl_intr_bk_sttlm_dt: Date.t() | nil,
  sts_rsn_addtl_inf: [String.t()],
  sts_rsn_cd: String.t() | nil,
  tx_sts: String.t()
}
```

# `version`

```elixir
@type version() :: :v1_16 | :v1_17
```

# `decode`

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

Decodifica um XML de pacs.002 (qualquer versão) de volta para a
struct, ou para uma lista de structs quando a mensagem traz mais de uma `TxInfAndSts` (lote), para
uma lista de structs, uma por transação.

# `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 de mensagens (lote: vira várias
`TxInfAndSts` na mesma `Document`, com `NbOfTxs` implícito no XSD desta
mensagem).

`msg_id`/`created_at` são campos de `GrpHdr` (um por mensagem XML,
não por transação). Em lote, precisam ser iguais em todos os itens da
lista; se divergirem, `encode/3` erra em vez de escolher um deles em
silêncio.

---

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