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

Saldo da Conta PI: a resposta a uma `Isox.Camt060` que pediu `CSA` ou
`CRE`.

Versão 1.4. Um extrato reporta vários tipos de saldo ao mesmo tempo,
então `balances` é lista de verdade. Vale notar a relação entre dois
deles: `SADP`, o disponível, já vem descontado do `SABK`, o bloqueado.
Bloquear não muda o total, muda onde ele está.

`CdtDbtInd` é fixo em `"CRDT"` e não vira campo.

## Lote

`Stmt` é ilimitado no schema. Como a camt.060 pede uma conta por vez, o
caminho comum é 1, mas `encode/3` aceita uma mensagem ou uma lista, e
`decode/1` devolve uma struct ou uma lista, conforme o XML.

# `saldo`

```elixir
@type saldo() :: %{
  tp_prtry: String.t(),
  value: String.t() | number(),
  dt_tm: DateTime.t()
}
```

# `t`

```elixir
@type t() :: %Isox.Camt053{
  acct_ispb: String.t(),
  balances: [saldo()],
  created_at: DateTime.t(),
  msg_id: String.t(),
  stmt_id: String.t()
}
```

# `version`

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

# `decode`

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

Decodifica um XML de camt.053 de volta para a struct, ou
para uma lista de structs quando a
mensagem traz mais de um `Stmt` (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 de mensagens (lote: vira vários
`Stmt` 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.

---

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