# `Nfse.PedidoEvento`
[🔗](https://github.com/ideia4it/nfse/blob/v0.1.0/lib/nfse/pedido_evento.ex#L1)

O pedido de registro de um evento da NFS-e, montado a partir dos campos que quem o pede
preenche.

Os campos do struct são os elementos do `Nfse.Schema.V1_01.TCInfPedReg`, com os mesmos nomes e
as mesmas regras de conversão. Exatamente um elemento `e<código>` vai preenchido, e é ele que
define o tipo do evento. `build/2` aceita o struct ou um mapa com essas chaves.

## Eventos que o contribuinte pode registrar

| Código | Campo | Evento |
|---|---|---|
| `101101` | `e101101` | Cancelamento de NFS-e |
| `101103` | `e101103` | Solicitação de análise fiscal para cancelamento |
| `202201` | `e202201` | Confirmação do prestador |
| `203202` | `e203202` | Confirmação do tomador |
| `204203` | `e204203` | Confirmação do intermediário |
| `202205` | `e202205` | Rejeição do prestador |
| `203206` | `e203206` | Rejeição do tomador |
| `204207` | `e204207` | Rejeição do intermediário |
| `205208` | `e205208` | Anulação da rejeição |

No cancelamento (`e101101`), `c_motivo` é `1` para erro na emissão, `2` para serviço não prestado
e `9` para outros, e `x_motivo` explica o motivo com 15 a 255 caracteres. Para cancelar sem
montar o pedido, use `Nfse.cancel/3`.

## O que `build/2` calcula

  * `Id` do `infPedReg`, com 59 caracteres: `"PRE"`, a chave de acesso da NFS-e e o tipo do
    evento com 6 dígitos
  * `versao` da raiz, sempre `"1.01"`
  * `tp_amb`, a partir do ambiente do cliente. Pode ser omitido; se vier, precisa ser o do
    cliente
  * `cnpj_autor` ou `cpf_autor`, a partir do certificado do cliente, quando o chamador não
    informa nenhum dos dois
  * `dh_evento`, a hora atual em UTC com precisão de segundos, quando o chamador não informa

`ver_aplic` vem sempre do chamador. Depois valida tudo, assina o `infPedReg` com o certificado do
cliente e devolve o XML canônico, pronto para enviar. Nada é reescrito entre assinar e devolver.

## Erros

Os erros voltam juntos, como `%Nfse.Error{kind: :validation}`, antes de qualquer assinatura. Além
dos erros do schema, descritos em `Nfse.Schema.Runtime`:

| Caminho | Erro | Quando |
|---|---|---|
| `id` | `:unknown_field` | o chamador passou `id`, que é sempre calculado |
| `tp_amb` | `:environment` | `tp_amb` diferente do ambiente do cliente |
| (vários) | `:choice` | mais de um elemento `e<código>` preenchido, ou nenhum |

# `built`

```elixir
@type built() :: %{xml: binary(), id: String.t()}
```

# `t`

```elixir
@type t() :: %Nfse.PedidoEvento{
  ch_nfse: term(),
  cnpj_autor: term(),
  cpf_autor: term(),
  dh_evento: term(),
  e101101: term(),
  e101103: term(),
  e105102: term(),
  e105104: term(),
  e105105: term(),
  e202201: term(),
  e202205: term(),
  e203202: term(),
  e203206: term(),
  e204203: term(),
  e204207: term(),
  e205204: term(),
  e205208: term(),
  e305101: term(),
  e305102: term(),
  e305103: term(),
  tp_amb: term(),
  ver_aplic: term()
}
```

# `build`

```elixir
@spec build(t() | map(), Nfse.Client.t()) :: {:ok, built()} | {:error, Nfse.Error.t()}
```

Calcula `Id`, `versao` e `tpAmb`, valida, assina e devolve o XML do pedido com o `Id`.

---

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