Skip to content

Commit

Permalink
Adicionado flexibilidade de fazer envio de eventos já assinados
Browse files Browse the repository at this point in the history
wmixvideo#27 Adicionado flexibilidade de fazer envio de eventos já assinados
para os casos de certificados A3.
  • Loading branch information
jefperito committed May 2, 2016
1 parent 1e2fce7 commit 529a9d7
Show file tree
Hide file tree
Showing 5 changed files with 193 additions and 160 deletions.
157 changes: 80 additions & 77 deletions src/main/java/com/fincatto/nfe310/webservices/WSCancelamento.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.stream.Format;

import com.fincatto.nfe310.NFeConfig;
import com.fincatto.nfe310.assinatura.AssinaturaDigital;
Expand All @@ -20,86 +18,91 @@
import com.fincatto.nfe310.classes.evento.cancelamento.NFInfoCancelamento;
import com.fincatto.nfe310.classes.evento.cancelamento.NFInfoEventoCancelamento;
import com.fincatto.nfe310.parsers.NotaFiscalChaveParser;
import com.fincatto.nfe310.transformers.NFRegistryMatcher;
import com.fincatto.nfe310.persister.NFPersister;
import com.fincatto.nfe310.webservices.gerado.RecepcaoEventoStub;
import com.fincatto.nfe310.webservices.gerado.RecepcaoEventoStub.NfeCabecMsg;
import com.fincatto.nfe310.webservices.gerado.RecepcaoEventoStub.NfeCabecMsgE;
import com.fincatto.nfe310.webservices.gerado.RecepcaoEventoStub.NfeDadosMsg;
import com.fincatto.nfe310.webservices.gerado.RecepcaoEventoStub.NfeRecepcaoEventoResult;

class WSCancelamento {
private static final String DESCRICAO_EVENTO = "Cancelamento";
private static final BigDecimal VERSAO_LEIAUTE = new BigDecimal("1.00");
private static final String EVENTO_CANCELAMENTO = "110111";
private static final Logger LOG = Logger.getLogger(WSCancelamento.class);
private final NFeConfig config;

public WSCancelamento(final NFeConfig config) {
this.config = config;
}

public NFEnviaEventoRetorno cancelaNota(final String chaveAcesso, final String numeroProtocolo, final String motivo) throws Exception {
final String cancelamentoNotaXML = this.gerarDadosCancelamento(chaveAcesso, numeroProtocolo, motivo).toString();
final String xmlAssinado = new AssinaturaDigital(this.config).assinarDocumento(cancelamentoNotaXML);
final OMElement omElementResult = this.efetuaCancelamento(xmlAssinado, chaveAcesso);
return new Persister(new NFRegistryMatcher(), new Format(0)).read(NFEnviaEventoRetorno.class, omElementResult.toString());
}

private OMElement efetuaCancelamento(final String xmlAssinado, final String chaveAcesso) throws Exception {
final RecepcaoEventoStub.NfeCabecMsg cabecalho = new NfeCabecMsg();
cabecalho.setCUF(this.config.getCUF().getCodigoIbge());
cabecalho.setVersaoDados(WSCancelamento.VERSAO_LEIAUTE.toPlainString());

final RecepcaoEventoStub.NfeCabecMsgE cabecalhoE = new NfeCabecMsgE();
cabecalhoE.setNfeCabecMsg(cabecalho);

final RecepcaoEventoStub.NfeDadosMsg dados = new NfeDadosMsg();
final OMElement omElementXML = AXIOMUtil.stringToOM(xmlAssinado);
WSCancelamento.LOG.debug(omElementXML);
dados.setExtraElement(omElementXML);

final NotaFiscalChaveParser parser = new NotaFiscalChaveParser(chaveAcesso);
final NFAutorizador31 autorizador = NFAutorizador31.valueOfChaveAcesso(chaveAcesso);
final String urlWebService = NFModelo.NFCE.equals(parser.getModelo()) ? autorizador.getNfceRecepcaoEvento(this.config.getAmbiente()) : autorizador.getRecepcaoEvento(this.config.getAmbiente());
if (urlWebService == null) {
throw new IllegalArgumentException("Nao foi possivel encontrar URL para RecepcaoEvento " + parser.getModelo().name() + ", autorizador " + autorizador.name());
}

final NfeRecepcaoEventoResult nfeRecepcaoEvento = new RecepcaoEventoStub(urlWebService).nfeRecepcaoEvento(dados, cabecalhoE);
final OMElement omElementResult = nfeRecepcaoEvento.getExtraElement();
WSCancelamento.LOG.debug(omElementResult.toString());
return omElementResult;
}

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

final NFInfoCancelamento cancelamento = new NFInfoCancelamento();
cancelamento.setDescricaoEvento(WSCancelamento.DESCRICAO_EVENTO);
cancelamento.setVersao(WSCancelamento.VERSAO_LEIAUTE);
cancelamento.setJustificativa(motivo);
cancelamento.setProtocoloAutorizacao(numeroProtocolo);

final NFInfoEventoCancelamento infoEvento = new NFInfoEventoCancelamento();
infoEvento.setAmbiente(this.config.getAmbiente());
infoEvento.setChave(chaveAcesso);
infoEvento.setCnpj(chaveParser.getCnpjEmitente());
infoEvento.setDataHoraEvento(DateTime.now());
infoEvento.setId(String.format("ID%s%s0%s", WSCancelamento.EVENTO_CANCELAMENTO, chaveAcesso, "1"));
infoEvento.setNumeroSequencialEvento(1);
infoEvento.setOrgao(chaveParser.getNFUnidadeFederativa());
infoEvento.setCodigoEvento(WSCancelamento.EVENTO_CANCELAMENTO);
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(Arrays.asList(evento));
enviaEvento.setIdLote("1");
enviaEvento.setVersao(WSCancelamento.VERSAO_LEIAUTE);
return enviaEvento;
}
private static final String DESCRICAO_EVENTO = "Cancelamento";
private static final BigDecimal VERSAO_LEIAUTE = new BigDecimal("1.00");
private static final String EVENTO_CANCELAMENTO = "110111";
private static final Logger LOG = Logger.getLogger(WSCancelamento.class);
private final NFeConfig config;

public WSCancelamento(final NFeConfig config) {
this.config = config;
}

public NFEnviaEventoRetorno cancelaNotaAssinada(final String chaveAcesso, final String eventoAssinadoXml) throws Exception {
final OMElement omElementResult = this.efetuaCancelamento(eventoAssinadoXml, chaveAcesso);
return new NFPersister().read(NFEnviaEventoRetorno.class, omElementResult.toString());
}

public NFEnviaEventoRetorno cancelaNota(final String chaveAcesso, final String numeroProtocolo, final String motivo) throws Exception {
final String cancelamentoNotaXML = this.gerarDadosCancelamento(chaveAcesso, numeroProtocolo, motivo).toString();
final String xmlAssinado = new AssinaturaDigital(this.config).assinarDocumento(cancelamentoNotaXML);
final OMElement omElementResult = this.efetuaCancelamento(xmlAssinado, chaveAcesso);
return new NFPersister().read(NFEnviaEventoRetorno.class, omElementResult.toString());
}

private OMElement efetuaCancelamento(final String xmlAssinado, final String chaveAcesso) throws Exception {
final RecepcaoEventoStub.NfeCabecMsg cabecalho = new NfeCabecMsg();
cabecalho.setCUF(this.config.getCUF().getCodigoIbge());
cabecalho.setVersaoDados(WSCancelamento.VERSAO_LEIAUTE.toPlainString());

final RecepcaoEventoStub.NfeCabecMsgE cabecalhoE = new NfeCabecMsgE();
cabecalhoE.setNfeCabecMsg(cabecalho);

final RecepcaoEventoStub.NfeDadosMsg dados = new NfeDadosMsg();
final OMElement omElementXML = AXIOMUtil.stringToOM(xmlAssinado);
WSCancelamento.LOG.debug(omElementXML);
dados.setExtraElement(omElementXML);

final NotaFiscalChaveParser parser = new NotaFiscalChaveParser(chaveAcesso);
final NFAutorizador31 autorizador = NFAutorizador31.valueOfChaveAcesso(chaveAcesso);
final String urlWebService = NFModelo.NFCE.equals(parser.getModelo()) ? autorizador.getNfceRecepcaoEvento(this.config.getAmbiente()) : autorizador.getRecepcaoEvento(this.config.getAmbiente());
if (urlWebService == null) {
throw new IllegalArgumentException("Nao foi possivel encontrar URL para RecepcaoEvento " + parser.getModelo().name() + ", autorizador " + autorizador.name());
}

final NfeRecepcaoEventoResult nfeRecepcaoEvento = new RecepcaoEventoStub(urlWebService).nfeRecepcaoEvento(dados, cabecalhoE);
final OMElement omElementResult = nfeRecepcaoEvento.getExtraElement();
WSCancelamento.LOG.debug(omElementResult.toString());
return omElementResult;
}

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

final NFInfoCancelamento cancelamento = new NFInfoCancelamento();
cancelamento.setDescricaoEvento(WSCancelamento.DESCRICAO_EVENTO);
cancelamento.setVersao(WSCancelamento.VERSAO_LEIAUTE);
cancelamento.setJustificativa(motivo);
cancelamento.setProtocoloAutorizacao(numeroProtocolo);

final NFInfoEventoCancelamento infoEvento = new NFInfoEventoCancelamento();
infoEvento.setAmbiente(this.config.getAmbiente());
infoEvento.setChave(chaveAcesso);
infoEvento.setCnpj(chaveParser.getCnpjEmitente());
infoEvento.setDataHoraEvento(DateTime.now());
infoEvento.setId(String.format("ID%s%s0%s", WSCancelamento.EVENTO_CANCELAMENTO, chaveAcesso, "1"));
infoEvento.setNumeroSequencialEvento(1);
infoEvento.setOrgao(chaveParser.getNFUnidadeFederativa());
infoEvento.setCodigoEvento(WSCancelamento.EVENTO_CANCELAMENTO);
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(Arrays.asList(evento));
enviaEvento.setIdLote("1");
enviaEvento.setVersao(WSCancelamento.VERSAO_LEIAUTE);
return enviaEvento;
}
}
157 changes: 82 additions & 75 deletions src/main/java/com/fincatto/nfe310/webservices/WSCartaCorrecao.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.fincatto.nfe310.classes.evento.NFTipoEvento;
import com.fincatto.nfe310.classes.evento.cartacorrecao.NFEnviaEventoCartaCorrecao;
import com.fincatto.nfe310.parsers.NotaFiscalChaveParser;
import com.fincatto.nfe310.persister.NFPersister;
import com.fincatto.nfe310.transformers.NFRegistryMatcher;
import com.fincatto.nfe310.webservices.gerado.RecepcaoEventoStub;
import com.fincatto.nfe310.webservices.gerado.RecepcaoEventoStub.NfeCabecMsg;
Expand All @@ -32,79 +33,85 @@
import com.fincatto.nfe310.webservices.gerado.RecepcaoEventoStub.NfeRecepcaoEventoResult;

class WSCartaCorrecao {
private final static Logger LOG = Logger.getLogger(WSCartaCorrecao.class);
private static final String EVENTO_CARTA_CORRECAO = "110110";
private static final BigDecimal VERSAO_LEIAUTE = new BigDecimal("1.00");
private final NFeConfig config;

public WSCartaCorrecao(final NFeConfig config) {
this.config = config;
}

public NFEnviaEventoRetorno corrigeNota(final String chaveAcesso, final String textoCorrecao, final int numeroSequencialEvento) throws Exception {
final String cartaCorrecaoXML = this.gerarDadosCartaCorrecao(chaveAcesso, textoCorrecao, numeroSequencialEvento).toString();
final String xmlAssinado = new AssinaturaDigital(this.config).assinarDocumento(cartaCorrecaoXML);
final OMElement omElementResult = this.efetuaCorrecao(xmlAssinado, chaveAcesso);

return new Persister(new NFRegistryMatcher(), new Format(0)).read(NFEnviaEventoRetorno.class, omElementResult.toString());
}

private OMElement efetuaCorrecao(final String xmlAssinado, final String chaveAcesso) throws XMLStreamException, RemoteException, AxisFault {
final RecepcaoEventoStub.NfeCabecMsg cabecalho = new NfeCabecMsg();
cabecalho.setCUF(this.config.getCUF().getCodigoIbge());
cabecalho.setVersaoDados(WSCartaCorrecao.VERSAO_LEIAUTE.toPlainString());

final RecepcaoEventoStub.NfeCabecMsgE cabecalhoE = new NfeCabecMsgE();
cabecalhoE.setNfeCabecMsg(cabecalho);

final RecepcaoEventoStub.NfeDadosMsg dados = new NfeDadosMsg();
final OMElement omElementXML = AXIOMUtil.stringToOM(xmlAssinado);
WSCartaCorrecao.LOG.debug(omElementXML);
dados.setExtraElement(omElementXML);

final NotaFiscalChaveParser parser = new NotaFiscalChaveParser(chaveAcesso);

final NFAutorizador31 autorizacao = NFAutorizador31.valueOfCodigoUF(this.config.getCUF());
final String urlWebService = NFModelo.NFCE.equals(parser.getModelo()) ? autorizacao.getNfceRecepcaoEvento(this.config.getAmbiente()) : autorizacao.getRecepcaoEvento(this.config.getAmbiente());
if (urlWebService == null) {
throw new IllegalArgumentException("Nao foi possivel encontrar URL para RecepcaoEvento " + parser.getModelo().name() + ", autorizador " + autorizacao.name());
}

final NfeRecepcaoEventoResult nfeRecepcaoEvento = new RecepcaoEventoStub(urlWebService).nfeRecepcaoEvento(dados, cabecalhoE);
final OMElement omElementResult = nfeRecepcaoEvento.getExtraElement();
WSCartaCorrecao.LOG.debug(omElementResult.toString());
return omElementResult;
}

private NFEnviaEventoCartaCorrecao gerarDadosCartaCorrecao(final String chaveAcesso, final String textoCorrecao, final int numeroSequencialEvento) {
final NotaFiscalChaveParser chaveParser = new NotaFiscalChaveParser(chaveAcesso);

final NFTipoEvento cartaCorrecao = new NFTipoEvento();
cartaCorrecao.setCondicaoUso("A Carta de Correcao e disciplinada pelo paragrafo 1o-A do art. 7o do Convenio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularizacao de erro ocorrido na emissao de documento fiscal, desde que o erro nao esteja relacionado com: I - as variaveis que determinam o valor do imposto tais como: base de calculo, aliquota, diferenca de preco, quantidade, valor da operacao ou da prestacao; II - a correcao de dados cadastrais que implique mudanca do remetente ou do destinatario; III - a data de emissao ou de saida.");
cartaCorrecao.setTextoCorrecao(textoCorrecao);
cartaCorrecao.setDescricaoEvento("Carta de Correcao");
cartaCorrecao.setVersao(WSCartaCorrecao.VERSAO_LEIAUTE);

final NFInfoEvento infoEvento = new NFInfoEvento();
infoEvento.setAmbiente(this.config.getAmbiente());
infoEvento.setDadosEvento(cartaCorrecao);
infoEvento.setChave(chaveAcesso);
infoEvento.setCnpj(chaveParser.getCnpjEmitente());
infoEvento.setDataHoraEvento(DateTime.now());
infoEvento.setId(String.format("ID%s%s0%s", WSCartaCorrecao.EVENTO_CARTA_CORRECAO, chaveAcesso, numeroSequencialEvento));
infoEvento.setNumeroSequencialEvento(numeroSequencialEvento);
infoEvento.setOrgao(chaveParser.getNFUnidadeFederativa());
infoEvento.setTipoEvento(WSCartaCorrecao.EVENTO_CARTA_CORRECAO);
infoEvento.setVersaoEvento(WSCartaCorrecao.VERSAO_LEIAUTE);

final NFEvento evento = new NFEvento();
evento.setInfoEvento(infoEvento);
evento.setVersao(WSCartaCorrecao.VERSAO_LEIAUTE);

final NFEnviaEventoCartaCorrecao enviaEvento = new NFEnviaEventoCartaCorrecao();
enviaEvento.setEvento(Arrays.asList(evento));
enviaEvento.setIdLote("1");
enviaEvento.setVersao(WSCartaCorrecao.VERSAO_LEIAUTE);
return enviaEvento;
}
private final static Logger LOG = Logger.getLogger(WSCartaCorrecao.class);
private static final String EVENTO_CARTA_CORRECAO = "110110";
private static final BigDecimal VERSAO_LEIAUTE = new BigDecimal("1.00");
private final NFeConfig config;

public WSCartaCorrecao(final NFeConfig config) {
this.config = config;
}

public NFEnviaEventoRetorno corrigeNota(final String chaveAcesso, final String textoCorrecao, final int numeroSequencialEvento) throws Exception {
final String cartaCorrecaoXML = this.gerarDadosCartaCorrecao(chaveAcesso, textoCorrecao, numeroSequencialEvento).toString();
final String xmlAssinado = new AssinaturaDigital(this.config).assinarDocumento(cartaCorrecaoXML);
final OMElement omElementResult = this.efetuaCorrecao(xmlAssinado, chaveAcesso);

return new Persister(new NFRegistryMatcher(), new Format(0)).read(NFEnviaEventoRetorno.class, omElementResult.toString());
}

public NFEnviaEventoRetorno corrigeNotaAssinada(final String chaveAcesso, final String eventoAssinadoXml) throws Exception {
final OMElement omElementResult = this.efetuaCorrecao(eventoAssinadoXml, chaveAcesso);

return new NFPersister().read(NFEnviaEventoRetorno.class, omElementResult.toString());
}

private OMElement efetuaCorrecao(final String xmlAssinado, final String chaveAcesso) throws XMLStreamException, RemoteException, AxisFault {
final RecepcaoEventoStub.NfeCabecMsg cabecalho = new NfeCabecMsg();
cabecalho.setCUF(this.config.getCUF().getCodigoIbge());
cabecalho.setVersaoDados(WSCartaCorrecao.VERSAO_LEIAUTE.toPlainString());

final RecepcaoEventoStub.NfeCabecMsgE cabecalhoE = new NfeCabecMsgE();
cabecalhoE.setNfeCabecMsg(cabecalho);

final RecepcaoEventoStub.NfeDadosMsg dados = new NfeDadosMsg();
final OMElement omElementXML = AXIOMUtil.stringToOM(xmlAssinado);
WSCartaCorrecao.LOG.debug(omElementXML);
dados.setExtraElement(omElementXML);

final NotaFiscalChaveParser parser = new NotaFiscalChaveParser(chaveAcesso);

final NFAutorizador31 autorizacao = NFAutorizador31.valueOfCodigoUF(this.config.getCUF());
final String urlWebService = NFModelo.NFCE.equals(parser.getModelo()) ? autorizacao.getNfceRecepcaoEvento(this.config.getAmbiente()) : autorizacao.getRecepcaoEvento(this.config.getAmbiente());
if (urlWebService == null) {
throw new IllegalArgumentException("Nao foi possivel encontrar URL para RecepcaoEvento " + parser.getModelo().name() + ", autorizador " + autorizacao.name());
}

final NfeRecepcaoEventoResult nfeRecepcaoEvento = new RecepcaoEventoStub(urlWebService).nfeRecepcaoEvento(dados, cabecalhoE);
final OMElement omElementResult = nfeRecepcaoEvento.getExtraElement();
WSCartaCorrecao.LOG.debug(omElementResult.toString());
return omElementResult;
}

private NFEnviaEventoCartaCorrecao gerarDadosCartaCorrecao(final String chaveAcesso, final String textoCorrecao, final int numeroSequencialEvento) {
final NotaFiscalChaveParser chaveParser = new NotaFiscalChaveParser(chaveAcesso);

final NFTipoEvento cartaCorrecao = new NFTipoEvento();
cartaCorrecao.setCondicaoUso("A Carta de Correcao e disciplinada pelo paragrafo 1o-A do art. 7o do Convenio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularizacao de erro ocorrido na emissao de documento fiscal, desde que o erro nao esteja relacionado com: I - as variaveis que determinam o valor do imposto tais como: base de calculo, aliquota, diferenca de preco, quantidade, valor da operacao ou da prestacao; II - a correcao de dados cadastrais que implique mudanca do remetente ou do destinatario; III - a data de emissao ou de saida.");
cartaCorrecao.setTextoCorrecao(textoCorrecao);
cartaCorrecao.setDescricaoEvento("Carta de Correcao");
cartaCorrecao.setVersao(WSCartaCorrecao.VERSAO_LEIAUTE);

final NFInfoEvento infoEvento = new NFInfoEvento();
infoEvento.setAmbiente(this.config.getAmbiente());
infoEvento.setDadosEvento(cartaCorrecao);
infoEvento.setChave(chaveAcesso);
infoEvento.setCnpj(chaveParser.getCnpjEmitente());
infoEvento.setDataHoraEvento(DateTime.now());
infoEvento.setId(String.format("ID%s%s0%s", WSCartaCorrecao.EVENTO_CARTA_CORRECAO, chaveAcesso, numeroSequencialEvento));
infoEvento.setNumeroSequencialEvento(numeroSequencialEvento);
infoEvento.setOrgao(chaveParser.getNFUnidadeFederativa());
infoEvento.setTipoEvento(WSCartaCorrecao.EVENTO_CARTA_CORRECAO);
infoEvento.setVersaoEvento(WSCartaCorrecao.VERSAO_LEIAUTE);

final NFEvento evento = new NFEvento();
evento.setInfoEvento(infoEvento);
evento.setVersao(WSCartaCorrecao.VERSAO_LEIAUTE);

final NFEnviaEventoCartaCorrecao enviaEvento = new NFEnviaEventoCartaCorrecao();
enviaEvento.setEvento(Arrays.asList(evento));
enviaEvento.setIdLote("1");
enviaEvento.setVersao(WSCartaCorrecao.VERSAO_LEIAUTE);
return enviaEvento;
}
}
Loading

0 comments on commit 529a9d7

Please sign in to comment.