Cancelar e registrar eventos

Copy Markdown View Source

Cancelamento e manifestações são eventos da NFS-e, registrados em POST /nfse/{chave}/eventos com um pedido assinado pelo certificado do cliente.

Cancelar

Nfse.cancel/3 registra o evento 101101:

case Nfse.cancel(client, access_key,
       c_motivo: 1,
       x_motivo: "Nota emitida com o valor do serviço errado"
     ) do
  {:ok, %Nfse.Event{} = event} ->
    event.xml

  {:error, %Nfse.Error{kind: :rejected, messages: messages}} ->
    messages
end

Opções:

OpçãoConteúdo
:c_motivo1 erro na emissão, 2 serviço não prestado, 9 outros. Obrigatória
:x_motivoexplicação de 15 a 255 caracteres. Obrigatória
:ver_aplicversão do seu aplicativo. Por padrão, "nfse-" seguido da versão da biblioteca

O autor do evento é o dono do certificado do cliente. event.xml é o evento como a Sefin o devolveu, e event.evento é o mesmo documento lido.

A Sefin recusa o cancelamento fora das regras do município (prazo e situação da nota, por exemplo) com :rejected e o código E.... em messages.

Conferir um evento

Como na emissão, o registro de um evento sai uma única vez. Num :timeout, :transport ou :server, ou num :unexpected com status 2xx (o evento foi registrado, mas a resposta não se leu, e details.xml traz o que veio), o resultado é incerto, e a conferência é Nfse.fetch_event/4, com o tipo do evento (seis dígitos) e o número de sequência:

case Nfse.fetch_event(client, access_key, "101101", 1) do
  {:ok, %Nfse.Event{} = event} -> {:cancelada, event.xml}
  {:error, %Nfse.Error{kind: :not_found}} -> :nao_registrado
  {:error, %Nfse.Error{}} = error -> error
end

Chave, tipo e sequência malformados voltam como %Nfse.Error{kind: :validation} nos caminhos access_key, tipo_evento e n_seq_evento, sem rede. O formato da resposta de fetch_event/4 ainda não foi visto de verdade: veja "O que ainda não está confirmado" no README.

Para listar todos os eventos de uma nota pelo ADN, use Nfse.events/2:

{:ok, documents} = Nfse.events(client, access_key)
Enum.map(documents, & &1.event_type)
#=> ["CANCELAMENTO"]

Outros eventos

Nfse.register_event/2 aceita qualquer evento que o contribuinte pode registrar. Exatamente um campo e<código> vai preenchido, e é ele que define o tipo. A tabela completa está em Nfse.PedidoEvento.

CódigoCampoEvento
101101e101101Cancelamento de NFS-e
101103e101103Solicitação de análise fiscal para cancelamento
202201e202201Confirmação do prestador
203202e203202Confirmação do tomador
204203e204203Confirmação do intermediário
202205e202205Rejeição do prestador
203206e203206Rejeição do tomador
204207e204207Rejeição do intermediário
205208e205208Anulação da rejeição

Uma manifestação do tomador, assinada com o certificado dele, fica assim:

Nfse.register_event(tomador_client, %{
  ch_nfse: access_key,
  ver_aplic: "studio-ana-1.0",
  e203202: %{x_desc: "Manifestação de NFS-e - Confirmação do Tomador"}
})

O cnpj_autor (ou cpf_autor) e o dh_evento saem do certificado do cliente e da hora atual quando você não os informa.