Skip to content

Commit

Permalink
Evento de Cancelamento por Substituição NFCe (#679)
Browse files Browse the repository at this point in the history
* Evento de Cancelamento por Substituicão

Ajustes nas classes para possibilitar o Cancelamento por Substituição, evento utilizando em documentos do modelo 65 - NFC-e.
Melhoria feita com base na NT 2018.004 - Evento de cancelamento por substituição da NFC-e

* Update NFInfoEventoRetorno.java

Ajuste no retorno

* Ajuste de parametros

* Update WSCancelamento.java

Ajuste

Co-authored-by: Caio Cezar Teodoro <[email protected]>
Co-authored-by: Diego Fincatto <[email protected]>
  • Loading branch information
3 people authored Sep 7, 2020
1 parent a6c2e7f commit bba8663
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ public class NFInfoEventoRetorno extends DFBase {
@Element(name = "nSeqEvento", required = false)
private Integer numeroSequencialEvento;

@Element(name = "cOrgaoAutor", required = false)
private String codigoOrgaoAutorizador;

@Element(name = "CNPJDest", required = false)
private String cpnj;

Expand Down Expand Up @@ -96,7 +99,15 @@ public Integer getNumeroSequencialEvento() {
return this.numeroSequencialEvento;
}

public String getCpnj() {
public String getCodigoOrgaoAutorizador() {
return codigoOrgaoAutorizador;
}

public void setCodigoOrgaoAutorizador(String codigoOrgaoAutorizador) {
this.codigoOrgaoAutorizador = codigoOrgaoAutorizador;
}

public String getCpnj() {
return this.cpnj;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,56 @@
package com.fincatto.documentofiscal.nfe400.classes.evento.cancelamento;

import com.fincatto.documentofiscal.DFUnidadeFederativa;
import com.fincatto.documentofiscal.nfe400.classes.evento.NFTipoEvento;
import com.fincatto.documentofiscal.validadores.StringValidador;
import org.simpleframework.xml.Element;

public class NFInfoCancelamento extends NFTipoEvento {
private static final long serialVersionUID = 7427073073940993756L;

@Element(name = "cOrgaoAutor", required = false)
private DFUnidadeFederativa ufAutorizador;//campo destinado ao cancelamento por substituicao

@Element(name = "tpAutor", required = false)
private String tipoAutorizador;//campo destinado ao cancelamento por substituicao

@Element(name = "verAplic", required = false)
private String versaoAplicativo;//campo destinado ao cancelamento por substituicao

@Element(name = "nProt")
private String protocoloAutorizacao;

@Element(name = "xJust")
private String justificativa;

@Element(name = "chNFeRef", required = false)
private String chaveAcessoSubstituta;//campo destinado ao cancelamento por substituicao

public DFUnidadeFederativa getUfAutorizador() {
return ufAutorizador;
}

public void setUfAutorizador(DFUnidadeFederativa ufAutorizador) {
this.ufAutorizador = ufAutorizador;
}

public String getTipoAutorizador() {
return tipoAutorizador;
}

public void setJustificativa(final String justificativa) {
public void setTipoAutorizador(String tipoAutorizador) {
this.tipoAutorizador = tipoAutorizador;
}

public String getVersaoAplicativo() {
return versaoAplicativo;
}

public void setVersaoAplicativo(String versaoAplicativo) {
this.versaoAplicativo = versaoAplicativo;
}

public void setJustificativa(final String justificativa) {
StringValidador.tamanho15a256(justificativa, "Justificativa");
this.justificativa = justificativa;
}
Expand All @@ -31,7 +68,15 @@ public String getProtocoloAutorizacao() {
return this.protocoloAutorizacao;
}

@Override
public String getChaveAcessoSubstituta() {
return chaveAcessoSubstituta;
}

public void setChaveAcessoSubstituta(String chaveAcessoSubstituta) {
this.chaveAcessoSubstituta = chaveAcessoSubstituta;
}

@Override
public void setCondicaoUso(final String condicaoUso) {
throw new UnsupportedOperationException("Evento de cancelamento nao possui condicao de uso");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@

class WSCancelamento implements DFLog {

private static final String DESCRICAO_EVENTO = "Cancelamento";
private static final BigDecimal VERSAO_LEIAUTE = new BigDecimal("1.00");
private static final String DESCRICAO_EVENTO = "Cancelamento";
private static final String EVENTO_CANCELAMENTO = "110111";
private static final String DESCRICAO_EVENTO_CANCELAMENTO_POR_SUBSTITUICAO = "Cancelamento por substituicao";
private static final String EVENTO_CANCELAMENTO_POR_SUBSTITUICAO = "110112";
private final NFeConfig config;

WSCancelamento(final NFeConfig config) {
Expand Down Expand Up @@ -97,4 +99,53 @@ private NFEnviaEventoCancelamento gerarDadosCancelamento(final String chaveAcess
enviaEvento.setVersao(WSCancelamento.VERSAO_LEIAUTE);
return enviaEvento;
}

NFEnviaEventoRetorno cancelaNotaPorSubstituicao(final String chaveAcesso, final String numeroProtocolo, final String motivo, final String versaoAplicativoAutorizador, final String chaveSubstituta) throws Exception {
final String cancelamentoNotaXML = this.gerarDadosCancelamentoPorSubstituicao(chaveAcesso, numeroProtocolo, motivo, versaoAplicativoAutorizador, chaveSubstituta).toString();
final String xmlAssinado = new DFAssinaturaDigital(this.config).assinarDocumento(cancelamentoNotaXML);
final OMElement omElementResult = this.efetuaCancelamento(xmlAssinado, chaveAcesso);
return this.config.getPersister().read(NFEnviaEventoRetorno.class, omElementResult.toString());
}

private NFEnviaEventoCancelamento gerarDadosCancelamentoPorSubstituicao(final String chaveAcesso, final String numeroProtocolo, final String motivo, final String versaoAplicativoAutorizador, final String chaveSubstituta) {
final NotaFiscalChaveParser chaveParser = new NotaFiscalChaveParser(chaveAcesso);

if(DFModelo.NFE.equals(chaveParser.getModelo())) throw new IllegalArgumentException("Evento nao permitido para modelo 55 - NFe!");

final NFInfoCancelamento cancelamento = new NFInfoCancelamento();
cancelamento.setDescricaoEvento(WSCancelamento.DESCRICAO_EVENTO_CANCELAMENTO_POR_SUBSTITUICAO);
cancelamento.setUfAutorizador(chaveParser.getNFUnidadeFederativa());
cancelamento.setTipoAutorizador("1");//como orientado no manual
cancelamento.setVersaoAplicativo(versaoAplicativoAutorizador);
cancelamento.setVersao(WSCancelamento.VERSAO_LEIAUTE);
cancelamento.setJustificativa(motivo);
cancelamento.setProtocoloAutorizacao(numeroProtocolo);
cancelamento.setChaveAcessoSubstituta(chaveSubstituta);

final NFInfoEventoCancelamento infoEvento = new NFInfoEventoCancelamento();
infoEvento.setAmbiente(this.config.getAmbiente());
infoEvento.setChave(chaveAcesso);
if (Integer.parseInt(chaveParser.getSerie()) >= 920 && Integer.parseInt(chaveParser.getSerie()) <= 969) {//destinado a emissão de pessoa física com IE
infoEvento.setCpf(chaveParser.getCnpjEmitente().substring(3));
} else {
infoEvento.setCnpj(chaveParser.getCnpjEmitente());
}
infoEvento.setDataHoraEvento(ZonedDateTime.now(this.config.getTimeZone().toZoneId()));
infoEvento.setId(String.format("ID%s%s0%s", WSCancelamento.EVENTO_CANCELAMENTO_POR_SUBSTITUICAO, chaveAcesso, "1"));
infoEvento.setNumeroSequencialEvento(1);
infoEvento.setOrgao(chaveParser.getNFUnidadeFederativa());
infoEvento.setCodigoEvento(WSCancelamento.EVENTO_CANCELAMENTO_POR_SUBSTITUICAO);
infoEvento.setVersaoEvento(WSCancelamento.VERSAO_LEIAUTE);
infoEvento.setCancelamento(cancelamento);

final NFEventoCancelamento evento = new NFEventoCancelamento();
evento.setInfoEvento(infoEvento);
evento.setVersao(WSCancelamento.VERSAO_LEIAUTE);

final NFEnviaEventoCancelamento enviaEvento = new NFEnviaEventoCancelamento();
enviaEvento.setEvento(Collections.singletonList(evento));
enviaEvento.setIdLote(Long.toString(ZonedDateTime.now(this.config.getTimeZone().toZoneId()).toInstant().toEpochMilli()));
enviaEvento.setVersao(WSCancelamento.VERSAO_LEIAUTE);
return enviaEvento;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,21 @@ public NFEnviaEventoRetorno cancelaNota(final String chave, final String numeroP
public NFEnviaEventoRetorno cancelaNotaAssinada(final String chave, final String eventoAssinadoXml) throws Exception {
return this.wsCancelamento.cancelaNotaAssinada(chave, eventoAssinadoXml);
}

/**
* Faz o cancelamento da nota por substituicao, evento permitido para NFCe.
*
* @param chave chave de acesso da nota
* @param numeroProtocolo numero do protocolo da nota
* @param motivo motivo do cancelamento
* @param chave chave de acesso da nota substituta
* @return dados do cancelamento da nota retornado pelo webservice
* @throws Exception caso nao consiga gerar o xml ou problema de conexao com
* o sefaz
*/
public NFEnviaEventoRetorno cancelaNotaPorSubstituicao(final String chave, final String numeroProtocolo, final String motivo, final String versaoAplicativoAutorizador, final String chaveSubstituta) throws Exception {
return this.wsCancelamento.cancelaNotaPorSubstituicao(chave, numeroProtocolo, motivo, versaoAplicativoAutorizador, chaveSubstituta);
}

/**
* Inutiliza a nota com o evento assinado ATENCAO: Esse metodo deve ser
Expand Down

0 comments on commit bba8663

Please sign in to comment.