From 3f0c7750fd9c26e26157daa79b306af9893e0a2e Mon Sep 17 00:00:00 2001 From: SamuelOliveira Date: Fri, 23 Jan 2026 01:25:48 -0300 Subject: [PATCH 1/7] Correcao Impressao Observacoes --- src/main/resources/jasper/nfe/danfe.jasper | Bin 137049 -> 137588 bytes src/main/resources/jasper/nfe/danfe.jrxml | 4 ++-- .../nfe/exemplos/IbsCbsTeste.java | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/jasper/nfe/danfe.jasper b/src/main/resources/jasper/nfe/danfe.jasper index 31337840c6fdfcb1577687df12793e4a0b97eec1..fd78d135fcdf3783f421bdaa8e705294d0757b27 100644 GIT binary patch delta 31325 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 delta 31015 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 Rn%THf)DwDfTY0_V{{jn))>Qxi diff --git a/src/main/resources/jasper/nfe/danfe.jrxml b/src/main/resources/jasper/nfe/danfe.jrxml index c50fe6e9..f472373d 100644 --- a/src/main/resources/jasper/nfe/danfe.jrxml +++ b/src/main/resources/jasper/nfe/danfe.jrxml @@ -1001,8 +1001,8 @@ $F{Trans_CPF}.substring(9,11) : ""]]> - + diff --git a/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTeste.java b/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTeste.java index aa8c021d..540e9566 100644 --- a/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTeste.java +++ b/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTeste.java @@ -13,6 +13,7 @@ import br.com.swconsultoria.nfe.util.IbsCbsUtil; import br.com.swconsultoria.nfe.util.ObjetoUtil; import br.com.swconsultoria.nfe.util.XmlNfeUtil; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import javax.xml.bind.JAXBElement; @@ -25,6 +26,7 @@ /** * @author Samuel Oliveira */ +@Disabled class IbsCbsTeste { @Test From 3f3c3c2b20ff827f842ea49e95bfae86f84a4e7c Mon Sep 17 00:00:00 2001 From: SamuelOliveira Date: Mon, 16 Feb 2026 12:36:29 -0300 Subject: [PATCH 2/7] Ajustes Impressao --- README.md | 9 ++++++--- pom.xml | 2 +- .../br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java | 4 ++-- .../swconsultoria/nfe/exemplos/EventoGenericoTeste.java | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 83425b03..c02730e8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Java-NFe [![MIT License](https://img.shields.io/github/license/Samuel-Oliveira/Java_NFe.svg) ](https://github.com/Samuel-Oliveira/Java_NFe/blob/master/LICENSE) [![Maven Central](https://img.shields.io/maven-central/v/br.com.swconsultoria/java-nfe.svg?label=Maven%20Central)](https://search.maven.org/artifact/br.com.swconsultoria/java-nfe/4.00.49/jar) +# Java-NFe [![MIT License](https://img.shields.io/github/license/Samuel-Oliveira/Java_NFe.svg) ](https://github.com/Samuel-Oliveira/Java_NFe/blob/master/LICENSE) [![Maven Central](https://img.shields.io/maven-central/v/br.com.swconsultoria/java-nfe.svg?label=Maven%20Central)](https://search.maven.org/artifact/br.com.swconsultoria/java-nfe/4.00.50/jar) Biblioteca Java para consumo do WebService de NFe/NFCe ### Powered by @@ -22,7 +22,7 @@ Para Iniciar : br.com.swconsultoria java-nfe - 4.00.49 + 4.00.50 ``` @@ -34,7 +34,7 @@ repositories { } } dependencies { - implementation "br.com.swconsultoria:java-nfe:4.00.49" + implementation "br.com.swconsultoria:java-nfe:4.00.50" } ``` @@ -44,6 +44,9 @@ ________________________________________________________________________________ # Historico de Versões +## v4.00.50 - 16/02/2026 - Schemas PL.010b (v1.30) +- Ajustes Impressao Danfe + ## v4.00.49 - 18/01/2026 - Schemas PL.010b (v1.30) - Corrigido monofasia retida Anteriormente. - Adicionado calculos IBSCBS para Diferimento diff --git a/pom.xml b/pom.xml index e19b31f5..91a86447 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ br.com.swconsultoria java-nfe - 4.00.49 + 4.00.50 Java_NFe Api java para consumo do webService de nota fiscal eletronica https://github.com/Samuel-Oliveira/Java_NFe diff --git a/src/main/java/br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java b/src/main/java/br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java index fec10b43..2140c6ff 100644 --- a/src/main/java/br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java +++ b/src/main/java/br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java @@ -109,8 +109,8 @@ public static ConfiguracoesNfe criarConfiguracoes(EstadosEnum estado, AmbienteEn log.info(String.format("JAVA-NFE | Samuel Oliveira | samuel@swconsultoria.com.br " + "| VERSAO=%s | DATA_VERSAO=%s | PASTA_SCHEMAS=%s | AMBIENTE=%s | ESTADO=%s", - "4.00.49", - "18/01/2026", + "4.00.50", + "16/02/2026", pastaSchemas, ambiente, estado.getNome().toUpperCase())); diff --git a/src/test/java/br/com/swconsultoria/nfe/exemplos/EventoGenericoTeste.java b/src/test/java/br/com/swconsultoria/nfe/exemplos/EventoGenericoTeste.java index b269bb34..0952dbb0 100644 --- a/src/test/java/br/com/swconsultoria/nfe/exemplos/EventoGenericoTeste.java +++ b/src/test/java/br/com/swconsultoria/nfe/exemplos/EventoGenericoTeste.java @@ -44,7 +44,7 @@ public static void main(String[] args) { detEvento.setDescEvento("Informação de efetivo pagamento integral para liberar crédito presumido do adquirente"); detEvento.setCOrgaoAutor(config.getEstado().getCodigoUF()); detEvento.setTpAutor("1"); - detEvento.setVerAplic("v4.00.49"); + detEvento.setVerAplic("v4.00.50"); detEvento.setIndQuitacao("1"); generico.setDetEvento(detEvento); From 1625d18963684b350bc9db0a8b5fc39954d8a246 Mon Sep 17 00:00:00 2001 From: SamuelOliveira Date: Thu, 19 Mar 2026 11:57:50 -0300 Subject: [PATCH 3/7] Adicionado Novo cacert --- .../com/swconsultoria/nfe/CancelarTest.java | 120 +++++++++ .../swconsultoria/nfe/CartaCorrecaoTest.java | 119 +++++++++ .../swconsultoria/nfe/ConsultaReciboTest.java | 92 +++++++ .../swconsultoria/nfe/ConsultaXmlTest.java | 93 +++++++ .../nfe/DistribuicaoDFeTest.java | 106 ++++++++ .../com/swconsultoria/nfe/InutilizarTest.java | 121 +++++++++ .../nfe/ManifestacaoDestinatarioTest.java | 120 +++++++++ .../br/com/swconsultoria/nfe/NfeTest.java | 98 +++++++ .../br/com/swconsultoria/nfe/StatusTest.java | 93 +++++++ .../br/com/swconsultoria/nfe/ValidarTest.java | 175 +++++++++++++ .../nfe/exemplos/EventoGenericoTeste.java | 2 +- .../{IbsCbsTeste.java => IbsCbsTest.java} | 4 +- .../CancelamentoSubstituicaoUtilTest.java | 118 +++++++++ .../nfe/util/CancelamentoUtilTest.java | 111 ++++++++ .../nfe/util/CartaCorrecaoUtilTest.java | 103 ++++++++ .../swconsultoria/nfe/util/ChaveUtilTest.java | 100 +++++++ .../swconsultoria/nfe/util/EpecUtilTest.java | 111 ++++++++ .../nfe/util/InutilizacaoUtilTest.java | 100 +++++++ .../nfe/util/ManifestacaoUtilTest.java | 122 +++++++++ .../nfe/util/ObjetoUtilTest.java | 157 +++++++++++ .../nfe/util/RetornoUtilTest.java | 221 ++++++++++++++++ .../nfe/util/XmlImpostoUtilTest.java | 247 ++++++++++++++++++ .../nfe/util/XmlNfeUtilTest.java | 80 ++++++ 23 files changed, 2609 insertions(+), 4 deletions(-) create mode 100644 src/test/java/br/com/swconsultoria/nfe/CancelarTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/CartaCorrecaoTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/ConsultaReciboTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/ConsultaXmlTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/DistribuicaoDFeTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/InutilizarTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/ManifestacaoDestinatarioTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/NfeTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/StatusTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/ValidarTest.java rename src/test/java/br/com/swconsultoria/nfe/exemplos/{IbsCbsTeste.java => IbsCbsTest.java} (98%) create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/CancelamentoSubstituicaoUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/CancelamentoUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/CartaCorrecaoUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/ChaveUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/EpecUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/InutilizacaoUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/ManifestacaoUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/ObjetoUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/RetornoUtilTest.java create mode 100644 src/test/java/br/com/swconsultoria/nfe/util/XmlImpostoUtilTest.java diff --git a/src/test/java/br/com/swconsultoria/nfe/CancelarTest.java b/src/test/java/br/com/swconsultoria/nfe/CancelarTest.java new file mode 100644 index 00000000..0a92613f --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/CancelarTest.java @@ -0,0 +1,120 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.Evento; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.AssinaturaEnum; +import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envEventoCancNFe.TEnvEvento; +import br.com.swconsultoria.nfe.schema.envEventoCancNFe.TRetEnvEvento; +import br.com.swconsultoria.nfe.util.CancelamentoUtil; +import br.com.swconsultoria.nfe.util.StubUtil; +import br.com.swconsultoria.nfe.wsdl.NFeRecepcaoEvento.NFeRecepcaoEvento4Stub; +import mockit.Mock; +import mockit.MockUp; +import org.apache.axiom.om.util.AXIOMUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class CancelarTest { + + private static final String RET_EVENTO_XML = + "" + + "12TESTE" + + "91128" + + "Lote de Evento Processado" + + ""; + + private ConfiguracoesNfe config; + private TEnvEvento enviEvento; + + @BeforeEach + void setUp() throws NfeException { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.SP); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setEncode("UTF-8"); + + config.setZoneId(java.time.ZoneId.of("America/Sao_Paulo")); + + Evento evento = new Evento(); + evento.setChave("52230309158456000159550010000731791567812345"); + evento.setCnpj("09158456000159"); + evento.setProtocolo("352230000123456"); + evento.setMotivo("Cancelamento por erro na emissao do documento fiscal"); + evento.setDataEvento(java.time.LocalDateTime.of(2024, 1, 15, 10, 0, 0)); + enviEvento = CancelamentoUtil.montaCancelamento(evento, config); + } + + private void mockStubUtil() { + new MockUp() { + @Mock + public void configuraHttpClient(org.apache.axis2.client.Stub stub, + ConfiguracoesNfe cfg, String url) { } + }; + } + + private void mockAssinar() { + new MockUp() { + @Mock + public String assinaNfe(ConfiguracoesNfe cfg, String xml, + AssinaturaEnum tipo) throws NfeException { + return xml; + } + }; + } + + private void mockEventosStub() { + new MockUp() { + @Mock + public void $init(String endpoint) { } + + @Mock + public NFeRecepcaoEvento4Stub.NfeResultMsg nfeRecepcaoEvento( + NFeRecepcaoEvento4Stub.NfeDadosMsg data) throws Exception { + NFeRecepcaoEvento4Stub.NfeResultMsg result = new NFeRecepcaoEvento4Stub.NfeResultMsg(); + result.setExtraElement(AXIOMUtil.stringToOM(RET_EVENTO_XML)); + return result; + } + }; + } + + @Test + void eventoCancelamento_semValidacao_retornaEvento() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = Cancelar.eventoCancelamento(config, enviEvento, false, DocumentoEnum.NFE); + + assertNotNull(ret); + assertEquals("128", ret.getCStat()); + } + + @Test + void eventoCancelamento_retornaLoteProcessado() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = Cancelar.eventoCancelamento(config, enviEvento, false, DocumentoEnum.NFE); + + assertEquals("Lote de Evento Processado", ret.getXMotivo()); + } + + @Test + void eventoCancelamento_retornaAmbienteHomologacao() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = Cancelar.eventoCancelamento(config, enviEvento, false, DocumentoEnum.NFE); + + assertEquals("2", ret.getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/CartaCorrecaoTest.java b/src/test/java/br/com/swconsultoria/nfe/CartaCorrecaoTest.java new file mode 100644 index 00000000..add663a9 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/CartaCorrecaoTest.java @@ -0,0 +1,119 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.Evento; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.AssinaturaEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envcce.TEnvEvento; +import br.com.swconsultoria.nfe.schema.envcce.TRetEnvEvento; +import br.com.swconsultoria.nfe.util.CartaCorrecaoUtil; +import br.com.swconsultoria.nfe.util.StubUtil; +import br.com.swconsultoria.nfe.wsdl.NFeRecepcaoEvento.NFeRecepcaoEvento4Stub; +import mockit.Mock; +import mockit.MockUp; +import org.apache.axiom.om.util.AXIOMUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class CartaCorrecaoTest { + + private static final String RET_EVENTO_XML = + "" + + "12TESTE" + + "91128" + + "Lote de Evento Processado" + + ""; + + private ConfiguracoesNfe config; + private TEnvEvento enviEvento; + + @BeforeEach + void setUp() throws NfeException { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.SP); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setEncode("UTF-8"); + + config.setZoneId(java.time.ZoneId.of("America/Sao_Paulo")); + + Evento evento = new Evento(); + evento.setChave("52230309158456000159550010000731791567812345"); + evento.setCnpj("09158456000159"); + evento.setMotivo("Correcao no campo de endereco do destinatario da nota fiscal"); + evento.setSequencia(1); + evento.setDataEvento(java.time.LocalDateTime.of(2024, 3, 10, 9, 0, 0)); + enviEvento = CartaCorrecaoUtil.montaCCe(evento, config); + } + + private void mockStubUtil() { + new MockUp() { + @Mock + public void configuraHttpClient(org.apache.axis2.client.Stub stub, + ConfiguracoesNfe cfg, String url) { } + }; + } + + private void mockAssinar() { + new MockUp() { + @Mock + public String assinaNfe(ConfiguracoesNfe cfg, String xml, + AssinaturaEnum tipo) throws NfeException { + return xml; + } + }; + } + + private void mockEventosStub() { + new MockUp() { + @Mock + public void $init(String endpoint) { } + + @Mock + public NFeRecepcaoEvento4Stub.NfeResultMsg nfeRecepcaoEvento( + NFeRecepcaoEvento4Stub.NfeDadosMsg data) throws Exception { + NFeRecepcaoEvento4Stub.NfeResultMsg result = new NFeRecepcaoEvento4Stub.NfeResultMsg(); + result.setExtraElement(AXIOMUtil.stringToOM(RET_EVENTO_XML)); + return result; + } + }; + } + + @Test + void eventoCCe_semValidacao_retornaEvento() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = CartaCorrecao.eventoCCe(config, enviEvento, false); + + assertNotNull(ret); + assertEquals("128", ret.getCStat()); + } + + @Test + void eventoCCe_retornaLoteProcessado() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = CartaCorrecao.eventoCCe(config, enviEvento, false); + + assertEquals("Lote de Evento Processado", ret.getXMotivo()); + } + + @Test + void eventoCCe_retornaAmbienteHomologacao() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = CartaCorrecao.eventoCCe(config, enviEvento, false); + + assertEquals("2", ret.getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/ConsultaReciboTest.java b/src/test/java/br/com/swconsultoria/nfe/ConsultaReciboTest.java new file mode 100644 index 00000000..edbedb5e --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/ConsultaReciboTest.java @@ -0,0 +1,92 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema_4.consReciNFe.TRetConsReciNFe; +import br.com.swconsultoria.nfe.util.StubUtil; +import br.com.swconsultoria.nfe.wsdl.NFeRetAutorizacao.NFeRetAutorizacao4Stub; +import mockit.Mock; +import mockit.MockUp; +import org.apache.axiom.om.util.AXIOMUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class ConsultaReciboTest { + + private static final String RET_RECIBO_XML = + "" + + "2104Lote processado" + + "35" + + ""; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.SP); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setEncode("UTF-8"); + } + + private void mockStubUtil() { + new MockUp() { + @Mock + public void configuraHttpClient(org.apache.axis2.client.Stub stub, + ConfiguracoesNfe cfg, String url) { } + }; + } + + private void mockReciboStub() { + new MockUp() { + @Mock + public void $init(String endpoint) { } + + @Mock + public NFeRetAutorizacao4Stub.NfeResultMsg nfeRetAutorizacaoLote( + NFeRetAutorizacao4Stub.NfeDadosMsg data) throws Exception { + NFeRetAutorizacao4Stub.NfeResultMsg result = new NFeRetAutorizacao4Stub.NfeResultMsg(); + result.setExtraElement(AXIOMUtil.stringToOM(RET_RECIBO_XML)); + return result; + } + }; + } + + @Test + void reciboNfe_reciboValido_retornaLoteProcessado() throws NfeException { + mockStubUtil(); + mockReciboStub(); + + TRetConsReciNFe ret = ConsultaRecibo.reciboNfe(config, "135240000000001", DocumentoEnum.NFE); + + assertNotNull(ret); + assertEquals("104", ret.getCStat()); + } + + @Test + void reciboNfe_retornaMotivo() throws NfeException { + mockStubUtil(); + mockReciboStub(); + + TRetConsReciNFe ret = ConsultaRecibo.reciboNfe(config, "135240000000001", DocumentoEnum.NFE); + + assertEquals("Lote processado", ret.getXMotivo()); + } + + @Test + void reciboNfe_nfce_retornaResultado() throws NfeException { + mockStubUtil(); + mockReciboStub(); + + TRetConsReciNFe ret = ConsultaRecibo.reciboNfe(config, "135240000000001", DocumentoEnum.NFCE); + + assertNotNull(ret); + assertEquals("104", ret.getCStat()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/ConsultaXmlTest.java b/src/test/java/br/com/swconsultoria/nfe/ConsultaXmlTest.java new file mode 100644 index 00000000..03a28e21 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/ConsultaXmlTest.java @@ -0,0 +1,93 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema_4.consSitNFe.TRetConsSitNFe; +import br.com.swconsultoria.nfe.util.StubUtil; +import br.com.swconsultoria.nfe.wsdl.NFeConsultaProtocolo.NFeConsultaProtocolo4Stub; +import mockit.Mock; +import mockit.MockUp; +import org.apache.axiom.om.util.AXIOMUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class ConsultaXmlTest { + + private static final String CHAVE = "35240101234567890001550010000000011000000012"; + + private static final String RET_CONSULTA_XML = + "" + + "2100Autorizado o uso da NF-e" + + "352024-01-01T10:00:00-03:00" + + ""; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.SP); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setEncode("UTF-8"); + } + + private void mockStubUtil() { + new MockUp() { + @Mock + public void configuraHttpClient(org.apache.axis2.client.Stub stub, + ConfiguracoesNfe cfg, String url) { } + }; + } + + private void mockConsultaStub() { + new MockUp() { + @Mock + public void $init(String endpoint) { } + + @Mock + public NFeConsultaProtocolo4Stub.NfeResultMsg nfeConsultaNF( + NFeConsultaProtocolo4Stub.NfeDadosMsg data) throws Exception { + NFeConsultaProtocolo4Stub.NfeResultMsg result = new NFeConsultaProtocolo4Stub.NfeResultMsg(); + result.setExtraElement(AXIOMUtil.stringToOM(RET_CONSULTA_XML)); + return result; + } + }; + } + + @Test + void consultaXml_chaveValida_retornaResultado() throws NfeException { + mockStubUtil(); + mockConsultaStub(); + + TRetConsSitNFe ret = ConsultaXml.consultaXml(config, CHAVE, DocumentoEnum.NFE); + + assertNotNull(ret); + assertEquals("100", ret.getCStat()); + } + + @Test + void consultaXml_retornaMotivo() throws NfeException { + mockStubUtil(); + mockConsultaStub(); + + TRetConsSitNFe ret = ConsultaXml.consultaXml(config, CHAVE, DocumentoEnum.NFE); + + assertEquals("Autorizado o uso da NF-e", ret.getXMotivo()); + } + + @Test + void consultaXml_retornaAmbienteHomologacao() throws NfeException { + mockStubUtil(); + mockConsultaStub(); + + TRetConsSitNFe ret = ConsultaXml.consultaXml(config, CHAVE, DocumentoEnum.NFE); + + assertEquals("2", ret.getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/DistribuicaoDFeTest.java b/src/test/java/br/com/swconsultoria/nfe/DistribuicaoDFeTest.java new file mode 100644 index 00000000..17290e95 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/DistribuicaoDFeTest.java @@ -0,0 +1,106 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.ConsultaDFeEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.dom.enuns.PessoaEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.retdistdfeint.RetDistDFeInt; +import br.com.swconsultoria.nfe.util.StubUtil; +import br.com.swconsultoria.nfe.wsdl.NFeDistribuicaoDFe.NFeDistribuicaoDFeStub; +import mockit.Mock; +import mockit.MockUp; +import org.apache.axiom.om.util.AXIOMUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class DistribuicaoDFeTest { + + private static final String RET_DIST_XML = + "" + + "2SVRS" + + "137Nenhum documento localizado" + + "2024-01-01T10:00:00-03:00" + + "000000000000000000000000000000" + + ""; + + private static final String CNPJ = "09158456000159"; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.SP); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setEncode("UTF-8"); + } + + private void mockStubUtil() { + new MockUp() { + @Mock + public void configuraHttpClient(org.apache.axis2.client.Stub stub, + ConfiguracoesNfe cfg, String url) { } + }; + } + + private void mockDistStub() { + new MockUp() { + @Mock + public void $init(String endpoint) { } + + @Mock + public NFeDistribuicaoDFeStub.NfeDistDFeInteresseResponse nfeDistDFeInteresse( + NFeDistribuicaoDFeStub.NfeDistDFeInteresse data) throws Exception { + NFeDistribuicaoDFeStub.NfeDistDFeInteresseResult_type0 resultType0 = + new NFeDistribuicaoDFeStub.NfeDistDFeInteresseResult_type0(); + resultType0.setExtraElement(AXIOMUtil.stringToOM(RET_DIST_XML)); + + NFeDistribuicaoDFeStub.NfeDistDFeInteresseResponse response = + new NFeDistribuicaoDFeStub.NfeDistDFeInteresseResponse(); + response.setNfeDistDFeInteresseResult(resultType0); + return response; + } + }; + } + + @Test + void consultaNfe_comNsu_retornaDistribuicao() throws NfeException { + mockStubUtil(); + mockDistStub(); + + RetDistDFeInt ret = DistribuicaoDFe.consultaNfe(config, PessoaEnum.JURIDICA, CNPJ, + ConsultaDFeEnum.NSU, "000000000000000"); + + assertNotNull(ret); + assertEquals("137", ret.getCStat()); + } + + @Test + void consultaNfe_comChave_retornaDistribuicao() throws NfeException { + mockStubUtil(); + mockDistStub(); + + RetDistDFeInt ret = DistribuicaoDFe.consultaNfe(config, PessoaEnum.JURIDICA, CNPJ, + ConsultaDFeEnum.CHAVE, "35240101234567890001550010000000011000000012"); + + assertNotNull(ret); + assertEquals("Nenhum documento localizado", ret.getXMotivo()); + } + + @Test + void consultaNfe_comCpf_retornaDistribuicao() throws NfeException { + mockStubUtil(); + mockDistStub(); + + RetDistDFeInt ret = DistribuicaoDFe.consultaNfe(config, PessoaEnum.FISICA, "12345678901", + ConsultaDFeEnum.NSU, "000000000000000"); + + assertNotNull(ret); + assertEquals("2", ret.getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/InutilizarTest.java b/src/test/java/br/com/swconsultoria/nfe/InutilizarTest.java new file mode 100644 index 00000000..2650d3f9 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/InutilizarTest.java @@ -0,0 +1,121 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.AssinaturaEnum; +import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema_4.inutNFe.TInutNFe; +import br.com.swconsultoria.nfe.schema_4.inutNFe.TRetInutNFe; +import br.com.swconsultoria.nfe.util.StubUtil; +import br.com.swconsultoria.nfe.wsdl.NFeInutilizacao.NFeInutilizacao4Stub; +import mockit.Mock; +import mockit.MockUp; +import org.apache.axiom.om.util.AXIOMUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class InutilizarTest { + + private static final String RET_INUT_XML = + "" + + "" + + "2102" + + "Inutilizacao de numero homologado" + + "352024-01-01T10:00:00-03:00" + + ""; + + private ConfiguracoesNfe config; + private TInutNFe inutNFe; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.SP); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setEncode("UTF-8"); + + inutNFe = new TInutNFe(); + TInutNFe.InfInut infInut = new TInutNFe.InfInut(); + infInut.setCNPJ("09158456000159"); + infInut.setAno("24"); + infInut.setMod("55"); + infInut.setSerie("001"); + infInut.setNNFIni("1"); + infInut.setNNFFin("1"); + infInut.setXJust("Inutilizacao de teste com justificativa longa"); + inutNFe.setInfInut(infInut); + } + + private void mockStubUtil() { + new MockUp() { + @Mock + public void configuraHttpClient(org.apache.axis2.client.Stub stub, + ConfiguracoesNfe cfg, String url) { } + }; + } + + private void mockAssinar() { + new MockUp() { + @Mock + public String assinaNfe(ConfiguracoesNfe cfg, String xml, + AssinaturaEnum tipo) throws NfeException { + return xml; + } + }; + } + + private void mockInutilizacaoStub() { + new MockUp() { + @Mock + public void $init(String endpoint) { } + + @Mock + public NFeInutilizacao4Stub.NfeResultMsg nfeInutilizacaoNF( + NFeInutilizacao4Stub.NfeDadosMsg data) throws Exception { + NFeInutilizacao4Stub.NfeResultMsg result = new NFeInutilizacao4Stub.NfeResultMsg(); + result.setExtraElement(AXIOMUtil.stringToOM(RET_INUT_XML)); + return result; + } + }; + } + + @Test + void inutiliza_semValidacao_retornaInutilizacao() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockInutilizacaoStub(); + + TRetInutNFe ret = Inutilizar.inutiliza(config, inutNFe, DocumentoEnum.NFE, false); + + assertNotNull(ret); + assertNotNull(ret.getInfInut()); + } + + @Test + void inutiliza_retornaNumeroHomologado() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockInutilizacaoStub(); + + TRetInutNFe ret = Inutilizar.inutiliza(config, inutNFe, DocumentoEnum.NFE, false); + + assertEquals("102", ret.getInfInut().getCStat()); + assertEquals("Inutilizacao de numero homologado", ret.getInfInut().getXMotivo()); + } + + @Test + void inutiliza_retornaAmbienteHomologacao() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockInutilizacaoStub(); + + TRetInutNFe ret = Inutilizar.inutiliza(config, inutNFe, DocumentoEnum.NFE, false); + + assertEquals("2", ret.getInfInut().getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/ManifestacaoDestinatarioTest.java b/src/test/java/br/com/swconsultoria/nfe/ManifestacaoDestinatarioTest.java new file mode 100644 index 00000000..2a146fb0 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/ManifestacaoDestinatarioTest.java @@ -0,0 +1,120 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.Evento; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.AssinaturaEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.dom.enuns.ManifestacaoEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envConfRecebto.TEnvEvento; +import br.com.swconsultoria.nfe.schema.envConfRecebto.TRetEnvEvento; +import br.com.swconsultoria.nfe.util.ManifestacaoUtil; +import br.com.swconsultoria.nfe.util.StubUtil; +import br.com.swconsultoria.nfe.wsdl.NFeRecepcaoEvento.NFeRecepcaoEvento4Stub; +import mockit.Mock; +import mockit.MockUp; +import org.apache.axiom.om.util.AXIOMUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class ManifestacaoDestinatarioTest { + + private static final String RET_EVENTO_XML = + "" + + "12TESTE" + + "91128" + + "Lote de Evento Processado" + + ""; + + private ConfiguracoesNfe config; + private TEnvEvento enviEvento; + + @BeforeEach + void setUp() throws NfeException { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.SP); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setEncode("UTF-8"); + + config.setZoneId(java.time.ZoneId.of("America/Sao_Paulo")); + + Evento evento = new Evento(); + evento.setChave("52230309158456000159550010000731791567812345"); + evento.setCnpj("09158456000159"); + evento.setProtocolo("352230000123456"); + evento.setTipoManifestacao(ManifestacaoEnum.CONFIRMACAO_DA_OPERACAO); + evento.setDataEvento(java.time.LocalDateTime.of(2024, 1, 15, 10, 0, 0)); + enviEvento = ManifestacaoUtil.montaManifestacao(evento, config); + } + + private void mockStubUtil() { + new MockUp() { + @Mock + public void configuraHttpClient(org.apache.axis2.client.Stub stub, + ConfiguracoesNfe cfg, String url) { } + }; + } + + private void mockAssinar() { + new MockUp() { + @Mock + public String assinaNfe(ConfiguracoesNfe cfg, String xml, + AssinaturaEnum tipo) throws NfeException { + return xml; + } + }; + } + + private void mockEventosStub() { + new MockUp() { + @Mock + public void $init(String endpoint) { } + + @Mock + public NFeRecepcaoEvento4Stub.NfeResultMsg nfeRecepcaoEvento( + NFeRecepcaoEvento4Stub.NfeDadosMsg data) throws Exception { + NFeRecepcaoEvento4Stub.NfeResultMsg result = new NFeRecepcaoEvento4Stub.NfeResultMsg(); + result.setExtraElement(AXIOMUtil.stringToOM(RET_EVENTO_XML)); + return result; + } + }; + } + + @Test + void eventoManifestacao_semValidacao_retornaEvento() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = ManifestacaoDestinatario.eventoManifestacao(config, enviEvento, false); + + assertNotNull(ret); + assertEquals("128", ret.getCStat()); + } + + @Test + void eventoManifestacao_retornaLoteProcessado() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = ManifestacaoDestinatario.eventoManifestacao(config, enviEvento, false); + + assertEquals("Lote de Evento Processado", ret.getXMotivo()); + } + + @Test + void eventoManifestacao_retornaAmbienteHomologacao() throws NfeException { + mockStubUtil(); + mockAssinar(); + mockEventosStub(); + + TRetEnvEvento ret = ManifestacaoDestinatario.eventoManifestacao(config, enviEvento, false); + + assertEquals("2", ret.getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/NfeTest.java b/src/test/java/br/com/swconsultoria/nfe/NfeTest.java new file mode 100644 index 00000000..4169a0eb --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/NfeTest.java @@ -0,0 +1,98 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum; +import br.com.swconsultoria.nfe.dom.enuns.PessoaEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Testes de Nfe — fachada principal da biblioteca. + * Verifica o contrato da API (construtor privado, rejeição de config nula). + * As chamadas de rede não são testadas aqui (requerem certificado + SEFAZ). + */ +class NfeTest { + + // ------------------------------------------------------------------------- + // Construtor privado + // ------------------------------------------------------------------------- + + @Test + void nfe_construtorEPrivado() throws Exception { + Constructor constructor = Nfe.class.getDeclaredConstructor(); + assertTrue(Modifier.isPrivate(constructor.getModifiers()), + "Nfe deve ter construtor privado para impedir instanciação"); + } + + // ------------------------------------------------------------------------- + // Rejeição de ConfiguracoesNfe nula (lança NfeException antes da chamada WS) + // ------------------------------------------------------------------------- + + @Test + void statusServico_configNula_lancaNfeException() { + assertThrows(NfeException.class, + () -> Nfe.statusServico(null, DocumentoEnum.NFE)); + } + + @Test + void consultaXml_configNula_lancaNfeException() { + assertThrows(NfeException.class, + () -> Nfe.consultaXml(null, "52230309158456000159550010000731791567812345", DocumentoEnum.NFE)); + } + + @Test + void consultaRecibo_configNula_lancaNfeException() { + assertThrows(NfeException.class, + () -> Nfe.consultaRecibo(null, "123456789012345", DocumentoEnum.NFE)); + } + + @Test + void distribuicaoDfe_configNula_lancaNfeException() { + assertThrows(NfeException.class, + () -> Nfe.distribuicaoDfe(null, PessoaEnum.JURIDICA, "09158456000159", + br.com.swconsultoria.nfe.dom.enuns.ConsultaDFeEnum.NSU, "000000000000001")); + } + + @Test + void inutilizacao_configNula_lancaNfeException() { + br.com.swconsultoria.nfe.schema_4.inutNFe.TInutNFe inutNFe = + new br.com.swconsultoria.nfe.schema_4.inutNFe.TInutNFe(); + br.com.swconsultoria.nfe.schema_4.inutNFe.TInutNFe.InfInut infInut = + new br.com.swconsultoria.nfe.schema_4.inutNFe.TInutNFe.InfInut(); + infInut.setCNPJ("09158456000159"); + inutNFe.setInfInut(infInut); + + assertThrows(NfeException.class, + () -> Nfe.inutilizacao(null, inutNFe, DocumentoEnum.NFE, false)); + } + + // ------------------------------------------------------------------------- + // Config sem certificado lança NfeException (getCertificado() retorna null) + // ------------------------------------------------------------------------- + + @Test + void statusServico_configSemCertificado_lancaNfeException() { + ConfiguracoesNfe config = new ConfiguracoesNfe(); + config.setEstado(br.com.swconsultoria.nfe.dom.enuns.EstadosEnum.GO); + config.setAmbiente(br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum.HOMOLOGACAO); + + assertThrows(Exception.class, + () -> Nfe.statusServico(config, DocumentoEnum.NFE)); + } + + @Test + void consultaXml_configSemCertificado_lancaNfeException() { + ConfiguracoesNfe config = new ConfiguracoesNfe(); + config.setEstado(br.com.swconsultoria.nfe.dom.enuns.EstadosEnum.GO); + config.setAmbiente(br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum.HOMOLOGACAO); + + assertThrows(Exception.class, + () -> Nfe.consultaXml(config, "52230309158456000159550010000731791567812345", DocumentoEnum.NFE)); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/StatusTest.java b/src/test/java/br/com/swconsultoria/nfe/StatusTest.java new file mode 100644 index 00000000..ed8071fe --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/StatusTest.java @@ -0,0 +1,93 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema_4.consStatServ.TRetConsStatServ; +import br.com.swconsultoria.nfe.util.StubUtil; +import br.com.swconsultoria.nfe.wsdl.NFeStatusServico4.NFeStatusServico4Stub; +import mockit.Mock; +import mockit.MockUp; +import org.apache.axiom.om.util.AXIOMUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class StatusTest { + + private static final String RET_STATUS_XML = + "" + + "2107Servico em Operacao" + + "352024-01-01T10:00:00-03:001" + + ""; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.SP); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setEncode("UTF-8"); + } + + private void mockStubUtil() { + new MockUp() { + @Mock + public void configuraHttpClient(org.apache.axis2.client.Stub stub, + ConfiguracoesNfe cfg, String url) { /* skip cert */ } + }; + } + + private void mockStatusStub() { + new MockUp() { + @Mock + public void $init(String endpoint) { /* skip Axis2 init */ } + + @Mock + public NFeStatusServico4Stub.NfeResultMsg nfeStatusServicoNF( + NFeStatusServico4Stub.NfeDadosMsg data) throws Exception { + NFeStatusServico4Stub.NfeResultMsg result = new NFeStatusServico4Stub.NfeResultMsg(); + result.setExtraElement(AXIOMUtil.stringToOM(RET_STATUS_XML)); + return result; + } + }; + } + + @Test + void statusServico_nfe_retornaEstadoOperacional() throws NfeException { + mockStubUtil(); + mockStatusStub(); + + TRetConsStatServ ret = Status.statusServico(config, DocumentoEnum.NFE); + + assertNotNull(ret); + assertEquals("107", ret.getCStat()); + assertEquals("Servico em Operacao", ret.getXMotivo()); + } + + @Test + void statusServico_nfce_retornaEstadoOperacional() throws NfeException { + mockStubUtil(); + mockStatusStub(); + + TRetConsStatServ ret = Status.statusServico(config, DocumentoEnum.NFCE); + + assertNotNull(ret); + assertEquals("107", ret.getCStat()); + } + + @Test + void statusServico_retornaAmbienteHomologacao() throws NfeException { + mockStubUtil(); + mockStatusStub(); + + TRetConsStatServ ret = Status.statusServico(config, DocumentoEnum.NFE); + + assertEquals("2", ret.getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/ValidarTest.java b/src/test/java/br/com/swconsultoria/nfe/ValidarTest.java new file mode 100644 index 00000000..f1a05da8 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/ValidarTest.java @@ -0,0 +1,175 @@ +package br.com.swconsultoria.nfe; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.enuns.ServicosEnum; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.xml.sax.SAXParseException; + +import java.io.File; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Testes unitários de Validar — validação de XML contra esquemas XSD locais. + * Nenhuma chamada de rede é realizada. + */ +class ValidarTest { + + /* ----------------------------------------------------------------------- + * Constantes + * --------------------------------------------------------------------- */ + private static final String SCHEMAS_PATH = "schemas"; + private static final String STATUS_XSD = + SCHEMAS_PATH + File.separator + "consStatServ_v4.00.xsd"; + + /** XML mínimo e válido para consStatServ (homologação, Goiás). */ + private static final String XML_STATUS_VALIDO = + "" + + "252STATUS"; + + /** XML inválido: campo obrigatório cUF ausente. */ + private static final String XML_STATUS_SEM_CUF = + "" + + "2STATUS"; + + /** XML malformado (tag não fechada). */ + private static final String XML_MALFORMADO = "2"; + + /** XML completamente vazio. */ + private static final String XML_VAZIO = ""; + + private Validar validar; + + @BeforeEach + void setUp() { + validar = new Validar(); + } + + // ------------------------------------------------------------------------- + // isValidXml(String xsd, String xml) + // ------------------------------------------------------------------------- + + @Test + void isValidXml_xsdInexistente_retornaFalso() { + assertFalse(validar.isValidXml("/caminho/nao/existe.xsd", XML_STATUS_VALIDO)); + } + + @Test + void isValidXml_xmlValidoComXsdReal_retornaVerdadeiro() { + assertTrue(validar.isValidXml(STATUS_XSD, XML_STATUS_VALIDO)); + } + + @Test + void isValidXml_xmlInvalidoSemCampoObrigatorio_retornaFalso() { + assertFalse(validar.isValidXml(STATUS_XSD, XML_STATUS_SEM_CUF)); + } + + @Test + void isValidXml_xmlMalformado_retornaFalso() { + assertFalse(validar.isValidXml(STATUS_XSD, XML_MALFORMADO)); + } + + @Test + void isValidXml_xmlVazio_retornaFalso() { + assertFalse(validar.isValidXml(STATUS_XSD, XML_VAZIO)); + } + + // ------------------------------------------------------------------------- + // isValidXml(String pastaSchemas, String xml, ServicosEnum servico) + // ------------------------------------------------------------------------- + + @Test + void isValidXml_comPastaEServico_xmlValido_retornaVerdadeiro() { + assertTrue(validar.isValidXml(SCHEMAS_PATH, XML_STATUS_VALIDO, ServicosEnum.STATUS_SERVICO)); + } + + @Test + void isValidXml_comPastaEServico_xmlInvalido_retornaFalso() { + assertFalse(validar.isValidXml(SCHEMAS_PATH, XML_STATUS_SEM_CUF, ServicosEnum.STATUS_SERVICO)); + } + + @Test + void isValidXml_comPastaInexistente_retornaFalso() { + assertFalse(validar.isValidXml("/pasta/invalida", XML_STATUS_VALIDO, ServicosEnum.STATUS_SERVICO)); + } + + // ------------------------------------------------------------------------- + // isValidXml(ConfiguracoesNfe config, String xml, ServicosEnum servico) + // ------------------------------------------------------------------------- + + @Test + void isValidXml_comConfigSemPastaSchemas_retornaFalso() { + ConfiguracoesNfe config = new ConfiguracoesNfe(); // pastaSchemas == null + assertFalse(validar.isValidXml(config, XML_STATUS_VALIDO, ServicosEnum.STATUS_SERVICO)); + } + + @Test + void isValidXml_comConfigComPastaValida_xmlValido_retornaVerdadeiro() throws Exception { + ConfiguracoesNfe config = new ConfiguracoesNfe(); + // Injetar pastaSchemas via reflexão (setter é privado) + java.lang.reflect.Field campo = ConfiguracoesNfe.class.getDeclaredField("pastaSchemas"); + campo.setAccessible(true); + campo.set(config, SCHEMAS_PATH); + + assertTrue(validar.isValidXml(config, XML_STATUS_VALIDO, ServicosEnum.STATUS_SERVICO)); + } + + @Test + void isValidXml_comConfigComPastaValida_xmlInvalido_retornaFalso() throws Exception { + ConfiguracoesNfe config = new ConfiguracoesNfe(); + java.lang.reflect.Field campo = ConfiguracoesNfe.class.getDeclaredField("pastaSchemas"); + campo.setAccessible(true); + campo.set(config, SCHEMAS_PATH); + + assertFalse(validar.isValidXml(config, XML_STATUS_SEM_CUF, ServicosEnum.STATUS_SERVICO)); + } + + // ------------------------------------------------------------------------- + // ErrorHandler — error(), fatalError(), warning() + // ------------------------------------------------------------------------- + + @Test + void error_comMensagemContada_naoLancaExcecao() { + // "cvc-type.3.1.3:" é contado como erro (não está nos filtros de isError) + assertDoesNotThrow(() -> + validar.error(new SAXParseException("cvc-type.3.1.3: campo inválido", null))); + } + + @Test + void error_comMensagemIgnorada_enumeracao_naoLancaExcecao() { + // "cvc-enumeration-valid:" é filtrado pelo isError() e não conta como erro + assertDoesNotThrow(() -> + validar.error(new SAXParseException("cvc-enumeration-valid: valor invalido", null))); + } + + @Test + void error_comMensagemIgnorada_pattern_naoLancaExcecao() { + assertDoesNotThrow(() -> + validar.error(new SAXParseException("cvc-pattern-valid: padrao invalido", null))); + } + + @Test + void error_comMensagemIgnorada_maxLength_naoLancaExcecao() { + assertDoesNotThrow(() -> + validar.error(new SAXParseException("cvc-maxLength-valid: tamanho excedido", null))); + } + + @Test + void error_comMensagemIgnorada_datatype_naoLancaExcecao() { + assertDoesNotThrow(() -> + validar.error(new SAXParseException("cvc-datatype-valid: tipo invalido", null))); + } + + @Test + void fatalError_naoLancaExcecao() { + assertDoesNotThrow(() -> + validar.fatalError(new SAXParseException("erro fatal de parse", null))); + } + + @Test + void warning_naoLancaExcecao() { + assertDoesNotThrow(() -> + validar.warning(new SAXParseException("aviso de validacao", null))); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/exemplos/EventoGenericoTeste.java b/src/test/java/br/com/swconsultoria/nfe/exemplos/EventoGenericoTeste.java index 0952dbb0..eb2877eb 100644 --- a/src/test/java/br/com/swconsultoria/nfe/exemplos/EventoGenericoTeste.java +++ b/src/test/java/br/com/swconsultoria/nfe/exemplos/EventoGenericoTeste.java @@ -44,7 +44,7 @@ public static void main(String[] args) { detEvento.setDescEvento("Informação de efetivo pagamento integral para liberar crédito presumido do adquirente"); detEvento.setCOrgaoAutor(config.getEstado().getCodigoUF()); detEvento.setTpAutor("1"); - detEvento.setVerAplic("v4.00.50"); + detEvento.setVerAplic("v4.00.51"); detEvento.setIndQuitacao("1"); generico.setDetEvento(detEvento); diff --git a/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTeste.java b/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTest.java similarity index 98% rename from src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTeste.java rename to src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTest.java index 540e9566..296cefda 100644 --- a/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTeste.java +++ b/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTest.java @@ -13,7 +13,6 @@ import br.com.swconsultoria.nfe.util.IbsCbsUtil; import br.com.swconsultoria.nfe.util.ObjetoUtil; import br.com.swconsultoria.nfe.util.XmlNfeUtil; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import javax.xml.bind.JAXBElement; @@ -26,8 +25,7 @@ /** * @author Samuel Oliveira */ -@Disabled -class IbsCbsTeste { +class IbsCbsTest { @Test void testeIbsCbs() throws Exception { diff --git a/src/test/java/br/com/swconsultoria/nfe/util/CancelamentoSubstituicaoUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/CancelamentoSubstituicaoUtilTest.java new file mode 100644 index 00000000..4d79699b --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/CancelamentoSubstituicaoUtilTest.java @@ -0,0 +1,118 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.Evento; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.dom.enuns.EventosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envEventoCancSubst.TEnvEvento; +import br.com.swconsultoria.nfe.schema.envEventoCancSubst.TEvento; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CancelamentoSubstituicaoUtilTest { + + private static final String CHAVE = "52230309158456000159550010000731791567812345"; + private static final String CHAVE_SUBST = "52230309158456000159550010000731801234567890"; + private static final String CNPJ = "09158456000159"; + private static final String PROTOCOLO = "352230000123456"; + private static final String MOTIVO = "Cancelamento por substituicao de NF-e"; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.GO); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setZoneId(ZoneId.of("America/Sao_Paulo")); + } + + private Evento novoEvento() { + Evento e = new Evento(); + e.setChave(CHAVE); + e.setCnpj(CNPJ); + e.setProtocolo(PROTOCOLO); + e.setMotivo(MOTIVO); + e.setChaveSusbstituta(CHAVE_SUBST); + e.setDataEvento(LocalDateTime.of(2024, 1, 20, 11, 0, 0)); + return e; + } + + @Test + void montaCancelamento_retornaTEnvEvento() throws NfeException { + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(novoEvento(), config); + assertNotNull(resultado); + assertEquals(1, resultado.getEvento().size()); + } + + @Test + void montaCancelamento_tpEvento_ehCancelamentoSubstituicao() throws NfeException { + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(novoEvento(), config); + TEvento.InfEvento info = resultado.getEvento().get(0).getInfEvento(); + assertEquals(EventosEnum.CANCELAMENTO_SUBSTITUICAO.getCodigo(), info.getTpEvento()); + } + + @Test + void montaCancelamento_idComecaComID() throws NfeException { + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(novoEvento(), config); + assertTrue(resultado.getEvento().get(0).getInfEvento().getId().startsWith("ID")); + } + + @Test + void montaCancelamento_chaveNFe_preenchida() throws NfeException { + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(novoEvento(), config); + assertEquals(CHAVE, resultado.getEvento().get(0).getInfEvento().getChNFe()); + } + + @Test + void montaCancelamento_chaveSubstituta_preenchida() throws NfeException { + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(novoEvento(), config); + assertEquals(CHAVE_SUBST, resultado.getEvento().get(0).getInfEvento().getDetEvento().getChNFeRef()); + } + + @Test + void montaCancelamento_protocolo_preenchido() throws NfeException { + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(novoEvento(), config); + assertEquals(PROTOCOLO, resultado.getEvento().get(0).getInfEvento().getDetEvento().getNProt()); + } + + @Test + void montaCancelamento_justificativa_preenchida() throws NfeException { + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(novoEvento(), config); + assertEquals(MOTIVO, resultado.getEvento().get(0).getInfEvento().getDetEvento().getXJust()); + } + + @Test + void montaCancelamento_descEvento_cancelamentoPorSubstituicao() throws NfeException { + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(novoEvento(), config); + assertEquals("Cancelamento por substituicao", + resultado.getEvento().get(0).getInfEvento().getDetEvento().getDescEvento()); + } + + @Test + void montaCancelamento_lote_retornaMultiplosEventos() throws NfeException { + List lista = new ArrayList<>(); + lista.add(novoEvento()); + lista.add(novoEvento()); + + TEnvEvento resultado = CancelamentoSubstituicaoUtil.montaCancelamento(lista, config); + assertEquals(2, resultado.getEvento().size()); + } + + @Test + void montaCancelamento_loteAcimaDe20_lancaExcecao() { + List lista = new ArrayList<>(); + for (int i = 0; i < 21; i++) lista.add(novoEvento()); + + assertThrows(NfeException.class, () -> CancelamentoSubstituicaoUtil.montaCancelamento(lista, config)); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/CancelamentoUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/CancelamentoUtilTest.java new file mode 100644 index 00000000..fc19c635 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/CancelamentoUtilTest.java @@ -0,0 +1,111 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.Evento; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.dom.enuns.EventosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envEventoCancNFe.TEnvEvento; +import br.com.swconsultoria.nfe.schema.envEventoCancNFe.TEvento; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CancelamentoUtilTest { + + private static final String CHAVE = "52230309158456000159550010000731791567812345"; + private static final String CNPJ = "09158456000159"; + private static final String PROTOCOLO = "352230000123456"; + private static final String MOTIVO = "Cancelamento por erro na emissao"; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.GO); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setZoneId(ZoneId.of("America/Sao_Paulo")); + } + + private Evento novoEvento() { + Evento e = new Evento(); + e.setChave(CHAVE); + e.setCnpj(CNPJ); + e.setProtocolo(PROTOCOLO); + e.setMotivo(MOTIVO); + e.setDataEvento(LocalDateTime.of(2024, 1, 15, 10, 0, 0)); + return e; + } + + @Test + void montaCancelamento_unico_retornaTEnvEvento() throws NfeException { + TEnvEvento resultado = CancelamentoUtil.montaCancelamento(novoEvento(), config); + assertNotNull(resultado); + assertEquals(1, resultado.getEvento().size()); + } + + @Test + void montaCancelamento_tpEvento_ehCancelamento() throws NfeException { + TEnvEvento resultado = CancelamentoUtil.montaCancelamento(novoEvento(), config); + TEvento.InfEvento info = resultado.getEvento().get(0).getInfEvento(); + assertEquals(EventosEnum.CANCELAMENTO.getCodigo(), info.getTpEvento()); + } + + @Test + void montaCancelamento_chaveNFe_preenchida() throws NfeException { + TEnvEvento resultado = CancelamentoUtil.montaCancelamento(novoEvento(), config); + assertEquals(CHAVE, resultado.getEvento().get(0).getInfEvento().getChNFe()); + } + + @Test + void montaCancelamento_idComecaComID() throws NfeException { + TEnvEvento resultado = CancelamentoUtil.montaCancelamento(novoEvento(), config); + String id = resultado.getEvento().get(0).getInfEvento().getId(); + assertTrue(id.startsWith("ID")); + } + + @Test + void montaCancelamento_protocolo_preenchido() throws NfeException { + TEnvEvento resultado = CancelamentoUtil.montaCancelamento(novoEvento(), config); + assertEquals(PROTOCOLO, resultado.getEvento().get(0).getInfEvento().getDetEvento().getNProt()); + } + + @Test + void montaCancelamento_justificativa_preenchida() throws NfeException { + TEnvEvento resultado = CancelamentoUtil.montaCancelamento(novoEvento(), config); + assertEquals(MOTIVO, resultado.getEvento().get(0).getInfEvento().getDetEvento().getXJust()); + } + + @Test + void montaCancelamento_lote_retornaMultiplosEventos() throws NfeException { + List lista = new ArrayList<>(); + lista.add(novoEvento()); + lista.add(novoEvento()); + + TEnvEvento resultado = CancelamentoUtil.montaCancelamento(lista, config); + assertEquals(2, resultado.getEvento().size()); + } + + @Test + void montaCancelamento_loteAcimaDe20_lancaExcecao() { + List lista = new ArrayList<>(); + for (int i = 0; i < 21; i++) lista.add(novoEvento()); + + assertThrows(NfeException.class, () -> CancelamentoUtil.montaCancelamento(lista, config)); + } + + @Test + void montaCancelamento_ambienteHomologacao_preenchido() throws NfeException { + TEnvEvento resultado = CancelamentoUtil.montaCancelamento(novoEvento(), config); + assertEquals(AmbienteEnum.HOMOLOGACAO.getCodigo(), + resultado.getEvento().get(0).getInfEvento().getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/CartaCorrecaoUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/CartaCorrecaoUtilTest.java new file mode 100644 index 00000000..6bdc32f9 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/CartaCorrecaoUtilTest.java @@ -0,0 +1,103 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.Evento; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.dom.enuns.EventosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envcce.TEnvEvento; +import br.com.swconsultoria.nfe.schema.envcce.TEvento; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CartaCorrecaoUtilTest { + + private static final String CHAVE = "52230309158456000159550010000731791567812345"; + private static final String CNPJ = "09158456000159"; + private static final String CORRECAO = "Correcao no campo de endereco do destinatario"; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.GO); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setZoneId(ZoneId.of("America/Sao_Paulo")); + } + + private Evento novoCCe() { + Evento e = new Evento(); + e.setChave(CHAVE); + e.setCnpj(CNPJ); + e.setMotivo(CORRECAO); + e.setSequencia(1); + e.setDataEvento(LocalDateTime.of(2024, 3, 10, 9, 0, 0)); + return e; + } + + @Test + void montaCCe_unico_retornaTEnvEvento() throws NfeException { + TEnvEvento resultado = CartaCorrecaoUtil.montaCCe(novoCCe(), config); + assertNotNull(resultado); + assertEquals(1, resultado.getEvento().size()); + } + + @Test + void montaCCe_tpEvento_ehCCe() throws NfeException { + TEnvEvento resultado = CartaCorrecaoUtil.montaCCe(novoCCe(), config); + TEvento.InfEvento info = resultado.getEvento().get(0).getInfEvento(); + assertEquals(EventosEnum.CCE.getCodigo(), info.getTpEvento()); + } + + @Test + void montaCCe_chaveNFe_preenchida() throws NfeException { + TEnvEvento resultado = CartaCorrecaoUtil.montaCCe(novoCCe(), config); + assertEquals(CHAVE, resultado.getEvento().get(0).getInfEvento().getChNFe()); + } + + @Test + void montaCCe_correcao_preenchida() throws NfeException { + TEnvEvento resultado = CartaCorrecaoUtil.montaCCe(novoCCe(), config); + assertEquals(CORRECAO, resultado.getEvento().get(0).getInfEvento().getDetEvento().getXCorrecao()); + } + + @Test + void montaCCe_descEvento_cartaDeCorrecao() throws NfeException { + TEnvEvento resultado = CartaCorrecaoUtil.montaCCe(novoCCe(), config); + assertEquals("Carta de Correcao", + resultado.getEvento().get(0).getInfEvento().getDetEvento().getDescEvento()); + } + + @Test + void montaCCe_lote_retornaMultiplosEventos() throws NfeException { + List lista = new ArrayList<>(); + lista.add(novoCCe()); + lista.add(novoCCe()); + + TEnvEvento resultado = CartaCorrecaoUtil.montaCCe(lista, config); + assertEquals(2, resultado.getEvento().size()); + } + + @Test + void montaCCe_loteAcimaDe20_lancaExcecao() { + List lista = new ArrayList<>(); + for (int i = 0; i < 21; i++) lista.add(novoCCe()); + + assertThrows(NfeException.class, () -> CartaCorrecaoUtil.montaCCe(lista, config)); + } + + @Test + void montaCCe_idComecaComID() throws NfeException { + TEnvEvento resultado = CartaCorrecaoUtil.montaCCe(novoCCe(), config); + assertTrue(resultado.getEvento().get(0).getInfEvento().getId().startsWith("ID")); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/ChaveUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/ChaveUtilTest.java new file mode 100644 index 00000000..b4149170 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/ChaveUtilTest.java @@ -0,0 +1,100 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; + +import static org.junit.jupiter.api.Assertions.*; + +class ChaveUtilTest { + + private static final String CNPJ = "10732644000128"; + private static final String MODELO_NFE = "55"; + private static final String TIPO_EMISSAO = "1"; + private static final LocalDateTime DATA_EMISSAO = LocalDateTime.of(2024, 3, 15, 10, 30, 0); + + // ------------------------------------------------------------------------- + // completarComZerosAEsquerda + // ------------------------------------------------------------------------- + + @Test + void completarComZerosAEsquerda_stringMenorQueAlvo_adicionaZeros() { + assertEquals("00042", ChaveUtil.completarComZerosAEsquerda("42", 5)); + } + + @Test + void completarComZerosAEsquerda_stringExataAoTamanho_naoAltera() { + assertEquals("12345", ChaveUtil.completarComZerosAEsquerda("12345", 5)); + } + + @Test + void completarComZerosAEsquerda_stringMaiorQueAlvo_naoAltera() { + assertEquals("123456", ChaveUtil.completarComZerosAEsquerda("123456", 3)); + } + + @Test + void completarComZerosAEsquerda_stringVazia_retornaSoZeros() { + assertEquals("000", ChaveUtil.completarComZerosAEsquerda("", 3)); + } + + @Test + void completarComZerosAEsquerda_tamanhoUm_retornaUmDigito() { + assertEquals("5", ChaveUtil.completarComZerosAEsquerda("5", 1)); + } + + // ------------------------------------------------------------------------- + // getChaveNF + // ------------------------------------------------------------------------- + + @Test + void getChaveNF_retornaChaveComPrefixoNFe() { + ChaveUtil chave = new ChaveUtil(EstadosEnum.GO, CNPJ, MODELO_NFE, 1, 1, TIPO_EMISSAO, "12345678", DATA_EMISSAO); + assertTrue(chave.getChaveNF().startsWith("NFe")); + } + + @Test + void getChaveNF_retornaTamanhoCorreto() { + // "NFe" (3) + 43 dígitos da chave + 1 dígito verificador = 47 chars + ChaveUtil chave = new ChaveUtil(EstadosEnum.SP, CNPJ, MODELO_NFE, 1, 92756, TIPO_EMISSAO, "12345678", DATA_EMISSAO); + assertEquals(47, chave.getChaveNF().length()); + } + + @Test + void getChaveNF_conteudoNaoNulo() { + ChaveUtil chave = new ChaveUtil(EstadosEnum.MG, CNPJ, MODELO_NFE, 1, 1, TIPO_EMISSAO, "00000001", DATA_EMISSAO); + assertNotNull(chave.getChaveNF()); + } + + // ------------------------------------------------------------------------- + // getDigitoVerificador + // ------------------------------------------------------------------------- + + @Test + void getDigitoVerificador_retornaUmDigito() { + ChaveUtil chave = new ChaveUtil(EstadosEnum.GO, CNPJ, MODELO_NFE, 1, 1, TIPO_EMISSAO, "12345678", DATA_EMISSAO); + assertEquals(1, chave.getDigitoVerificador().length()); + } + + @Test + void getDigitoVerificador_consistenteComChave() { + ChaveUtil chave = new ChaveUtil(EstadosEnum.GO, CNPJ, MODELO_NFE, 1, 1, TIPO_EMISSAO, "12345678", DATA_EMISSAO); + String chaveCompleta = chave.getChaveNF(); // "NFe" + 43 dígitos + dv + String dvDaChave = chaveCompleta.substring(chaveCompleta.length() - 1); + assertEquals(dvDaChave, chave.getDigitoVerificador()); + } + + @Test + void getDigitoVerificador_diferentes_numerosNfe_geramChavesDiferentes() { + ChaveUtil chave1 = new ChaveUtil(EstadosEnum.GO, CNPJ, MODELO_NFE, 1, 100, TIPO_EMISSAO, "12345678", DATA_EMISSAO); + ChaveUtil chave2 = new ChaveUtil(EstadosEnum.GO, CNPJ, MODELO_NFE, 1, 200, TIPO_EMISSAO, "12345678", DATA_EMISSAO); + assertNotEquals(chave1.getChaveNF(), chave2.getChaveNF()); + } + + @Test + void getDigitoVerificador_diferentesEstados_geramChavesDiferentes() { + ChaveUtil chaveGO = new ChaveUtil(EstadosEnum.GO, CNPJ, MODELO_NFE, 1, 1, TIPO_EMISSAO, "12345678", DATA_EMISSAO); + ChaveUtil chaveSP = new ChaveUtil(EstadosEnum.SP, CNPJ, MODELO_NFE, 1, 1, TIPO_EMISSAO, "12345678", DATA_EMISSAO); + assertNotEquals(chaveGO.getChaveNF(), chaveSP.getChaveNF()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/EpecUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/EpecUtilTest.java new file mode 100644 index 00000000..5fe7fe21 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/EpecUtilTest.java @@ -0,0 +1,111 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.Evento; +import br.com.swconsultoria.nfe.dom.EventoEpec; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.dom.enuns.EventosEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envEpec.TEnvEvento; +import br.com.swconsultoria.nfe.schema.envEpec.TEvento; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class EpecUtilTest { + + private static final String CHAVE = "52230309158456000159550010000731791567812345"; + private static final String CNPJ = "09158456000159"; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.GO); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setZoneId(ZoneId.of("America/Sao_Paulo")); + } + + private Evento novoEpec() { + EventoEpec epecDetalhe = new EventoEpec(); + epecDetalhe.setTipoNF("1"); + epecDetalhe.setIeEmitente("104282215"); + epecDetalhe.setEstadoDestinatario(EstadosEnum.SP); + epecDetalhe.setCnpjDestinatario("08944957000360"); + epecDetalhe.setvNF("1000.00"); + epecDetalhe.setvICMS("0.00"); + epecDetalhe.setvST("0.00"); + + Evento e = new Evento(); + e.setChave(CHAVE); + e.setCnpj(CNPJ); + e.setDataEvento(LocalDateTime.of(2024, 2, 28, 15, 30, 0)); + e.setEventoEpec(epecDetalhe); + return e; + } + + @Test + void montaEpec_unico_retornaTEnvEvento() throws NfeException { + TEnvEvento resultado = EpecUtil.montaEpec(novoEpec(), config); + assertNotNull(resultado); + assertEquals(1, resultado.getEvento().size()); + } + + @Test + void montaEpec_tpEvento_ehEpec() throws NfeException { + TEnvEvento resultado = EpecUtil.montaEpec(novoEpec(), config); + TEvento.InfEvento info = resultado.getEvento().get(0).getInfEvento(); + assertEquals(EventosEnum.EPEC.getCodigo(), info.getTpEvento()); + } + + @Test + void montaEpec_chaveNFe_preenchida() throws NfeException { + TEnvEvento resultado = EpecUtil.montaEpec(novoEpec(), config); + assertEquals(CHAVE, resultado.getEvento().get(0).getInfEvento().getChNFe()); + } + + @Test + void montaEpec_idComecaComID() throws NfeException { + TEnvEvento resultado = EpecUtil.montaEpec(novoEpec(), config); + assertTrue(resultado.getEvento().get(0).getInfEvento().getId().startsWith("ID")); + } + + @Test + void montaEpec_descEvento_epec() throws NfeException { + TEnvEvento resultado = EpecUtil.montaEpec(novoEpec(), config); + assertEquals("EPEC", resultado.getEvento().get(0).getInfEvento().getDetEvento().getDescEvento()); + } + + @Test + void montaEpec_lote_retornaMultiplosEventos() throws NfeException { + List lista = new ArrayList<>(); + lista.add(novoEpec()); + lista.add(novoEpec()); + + TEnvEvento resultado = EpecUtil.montaEpec(lista, config); + assertEquals(2, resultado.getEvento().size()); + } + + @Test + void montaEpec_loteAcimaDe20_lancaExcecao() { + List lista = new ArrayList<>(); + for (int i = 0; i < 21; i++) lista.add(novoEpec()); + + assertThrows(NfeException.class, () -> EpecUtil.montaEpec(lista, config)); + } + + @Test + void montaEpec_ambiente_preenchido() throws NfeException { + TEnvEvento resultado = EpecUtil.montaEpec(novoEpec(), config); + assertEquals(AmbienteEnum.HOMOLOGACAO.getCodigo(), + resultado.getEvento().get(0).getInfEvento().getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/InutilizacaoUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/InutilizacaoUtilTest.java new file mode 100644 index 00000000..7a1ac238 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/InutilizacaoUtilTest.java @@ -0,0 +1,100 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.schema_4.inutNFe.TInutNFe; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; + +import static org.junit.jupiter.api.Assertions.*; + +class InutilizacaoUtilTest { + + private static final String CNPJ = "09158456000159"; + private static final String JUSTIFICATIVA = "Numero de NF-e inutilizado por falha de sistema"; + + private ConfiguracoesNfe config; + private final LocalDateTime dataInut = LocalDateTime.of(2024, 5, 20, 8, 0, 0); + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.GO); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setZoneId(ZoneId.of("America/Sao_Paulo")); + } + + @Test + void montaInutilizacao_retornaTInutNFe() { + TInutNFe resultado = InutilizacaoUtil.montaInutilizacao( + DocumentoEnum.NFE, CNPJ, 1, 100, 110, JUSTIFICATIVA, dataInut, config); + + assertNotNull(resultado); + assertNotNull(resultado.getInfInut()); + } + + @Test + void montaInutilizacao_id_comecaComID() { + TInutNFe resultado = InutilizacaoUtil.montaInutilizacao( + DocumentoEnum.NFE, CNPJ, 1, 100, 110, JUSTIFICATIVA, dataInut, config); + + assertTrue(resultado.getInfInut().getId().startsWith("ID")); + } + + @Test + void montaInutilizacao_serieFormatada3digitos() { + TInutNFe resultado = InutilizacaoUtil.montaInutilizacao( + DocumentoEnum.NFE, CNPJ, 5, 1, 1, JUSTIFICATIVA, dataInut, config); + + // ID contains zero-padded serie + String id = resultado.getInfInut().getId(); + assertTrue(id.contains("005"), "ID deve conter serie com 3 digitos: " + id); + } + + @Test + void montaInutilizacao_numeroFormatado9digitos() { + TInutNFe resultado = InutilizacaoUtil.montaInutilizacao( + DocumentoEnum.NFE, CNPJ, 1, 42, 50, JUSTIFICATIVA, dataInut, config); + + String id = resultado.getInfInut().getId(); + assertTrue(id.contains("000000042"), "ID deve conter nNFIni com 9 digitos: " + id); + assertTrue(id.contains("000000050"), "ID deve conter nNFFin com 9 digitos: " + id); + } + + @Test + void montaInutilizacao_justificativa_preenchida() { + TInutNFe resultado = InutilizacaoUtil.montaInutilizacao( + DocumentoEnum.NFE, CNPJ, 1, 1, 1, JUSTIFICATIVA, dataInut, config); + + assertEquals(JUSTIFICATIVA, resultado.getInfInut().getXJust()); + } + + @Test + void montaInutilizacao_cnpj_preenchido() { + TInutNFe resultado = InutilizacaoUtil.montaInutilizacao( + DocumentoEnum.NFE, CNPJ, 1, 1, 1, JUSTIFICATIVA, dataInut, config); + + assertEquals(CNPJ, resultado.getInfInut().getCNPJ()); + } + + @Test + void montaInutilizacao_xServ_inutilizar() { + TInutNFe resultado = InutilizacaoUtil.montaInutilizacao( + DocumentoEnum.NFE, CNPJ, 1, 1, 1, JUSTIFICATIVA, dataInut, config); + + assertEquals("INUTILIZAR", resultado.getInfInut().getXServ()); + } + + @Test + void montaInutilizacao_ambiente_homologacao() { + TInutNFe resultado = InutilizacaoUtil.montaInutilizacao( + DocumentoEnum.NFE, CNPJ, 1, 1, 1, JUSTIFICATIVA, dataInut, config); + + assertEquals(AmbienteEnum.HOMOLOGACAO.getCodigo(), resultado.getInfInut().getTpAmb()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/ManifestacaoUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/ManifestacaoUtilTest.java new file mode 100644 index 00000000..5a3a539a --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/ManifestacaoUtilTest.java @@ -0,0 +1,122 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; +import br.com.swconsultoria.nfe.dom.Evento; +import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; +import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum; +import br.com.swconsultoria.nfe.dom.enuns.ManifestacaoEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envConfRecebto.TEnvEvento; +import br.com.swconsultoria.nfe.schema.envConfRecebto.TEvento; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class ManifestacaoUtilTest { + + private static final String CHAVE = "52230309158456000159550010000731791567812345"; + private static final String CNPJ = "09158456000159"; + + private ConfiguracoesNfe config; + + @BeforeEach + void setUp() { + config = new ConfiguracoesNfe(); + config.setEstado(EstadosEnum.GO); + config.setAmbiente(AmbienteEnum.HOMOLOGACAO); + config.setZoneId(ZoneId.of("America/Sao_Paulo")); + } + + private Evento novoEvento(ManifestacaoEnum tipo) { + Evento e = new Evento(); + e.setChave(CHAVE); + e.setCnpj(CNPJ); + e.setTipoManifestacao(tipo); + e.setSequencia(1); + e.setDataEvento(LocalDateTime.of(2024, 4, 1, 12, 0, 0)); + return e; + } + + @Test + void montaManifestacao_confirmacao_retornaTEnvEvento() throws NfeException { + TEnvEvento resultado = ManifestacaoUtil.montaManifestacao( + novoEvento(ManifestacaoEnum.CONFIRMACAO_DA_OPERACAO), config); + assertNotNull(resultado); + assertEquals(1, resultado.getEvento().size()); + } + + @Test + void montaManifestacao_tpEvento_confirmacao() throws NfeException { + TEnvEvento resultado = ManifestacaoUtil.montaManifestacao( + novoEvento(ManifestacaoEnum.CONFIRMACAO_DA_OPERACAO), config); + TEvento.InfEvento info = resultado.getEvento().get(0).getInfEvento(); + assertEquals(ManifestacaoEnum.CONFIRMACAO_DA_OPERACAO.getCodigo(), info.getTpEvento()); + } + + @Test + void montaManifestacao_ciencia_tpEvento() throws NfeException { + TEnvEvento resultado = ManifestacaoUtil.montaManifestacao( + novoEvento(ManifestacaoEnum.CIENCIA_DA_OPERACAO), config); + assertEquals(ManifestacaoEnum.CIENCIA_DA_OPERACAO.getCodigo(), + resultado.getEvento().get(0).getInfEvento().getTpEvento()); + } + + @Test + void montaManifestacao_desconhecimento_tpEvento() throws NfeException { + TEnvEvento resultado = ManifestacaoUtil.montaManifestacao( + novoEvento(ManifestacaoEnum.DESCONHECIMENTO_DA_OPERACAO), config); + assertEquals(ManifestacaoEnum.DESCONHECIMENTO_DA_OPERACAO.getCodigo(), + resultado.getEvento().get(0).getInfEvento().getTpEvento()); + } + + @Test + void montaManifestacao_operacaoNaoRealizada_comJustificativa() throws NfeException { + Evento e = novoEvento(ManifestacaoEnum.OPERACAO_NAO_REALIZADA); + e.setMotivo("Mercadoria nao recebida"); + + TEnvEvento resultado = ManifestacaoUtil.montaManifestacao(e, config); + TEvento.InfEvento.DetEvento det = resultado.getEvento().get(0).getInfEvento().getDetEvento(); + assertEquals("Mercadoria nao recebida", det.getXJust()); + } + + @Test + void montaManifestacao_sequenciaZero_usaUm() throws NfeException { + Evento e = novoEvento(ManifestacaoEnum.CONFIRMACAO_DA_OPERACAO); + e.setSequencia(0); // deve ser corrigido para 1 + + TEnvEvento resultado = ManifestacaoUtil.montaManifestacao(e, config); + assertEquals("1", resultado.getEvento().get(0).getInfEvento().getNSeqEvento()); + } + + @Test + void montaManifestacao_lote_retornaMultiplosEventos() throws NfeException { + List lista = new ArrayList<>(); + lista.add(novoEvento(ManifestacaoEnum.CONFIRMACAO_DA_OPERACAO)); + lista.add(novoEvento(ManifestacaoEnum.CIENCIA_DA_OPERACAO)); + + TEnvEvento resultado = ManifestacaoUtil.montaManifestacao(lista, config); + assertEquals(2, resultado.getEvento().size()); + } + + @Test + void montaManifestacao_loteAcimaDe20_lancaExcecao() { + List lista = new ArrayList<>(); + for (int i = 0; i < 21; i++) + lista.add(novoEvento(ManifestacaoEnum.CIENCIA_DA_OPERACAO)); + + assertThrows(NfeException.class, () -> ManifestacaoUtil.montaManifestacao(lista, config)); + } + + @Test + void montaManifestacao_chaveNFe_preenchida() throws NfeException { + TEnvEvento resultado = ManifestacaoUtil.montaManifestacao( + novoEvento(ManifestacaoEnum.CONFIRMACAO_DA_OPERACAO), config); + assertEquals(CHAVE, resultado.getEvento().get(0).getInfEvento().getChNFe()); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/ObjetoUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/ObjetoUtilTest.java new file mode 100644 index 00000000..9d007faa --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/ObjetoUtilTest.java @@ -0,0 +1,157 @@ +package br.com.swconsultoria.nfe.util; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +class ObjetoUtilTest { + + // ------------------------------------------------------------------------- + // verifica(T) + // ------------------------------------------------------------------------- + + @Test + void verifica_null_retornaVazio() { + Optional result = ObjetoUtil.verifica(null); + assertFalse(result.isPresent()); + } + + @Test + void verifica_stringVazia_retornaVazio() { + assertFalse(ObjetoUtil.verifica("").isPresent()); + } + + @Test + void verifica_stringBrancos_retornaVazio() { + assertFalse(ObjetoUtil.verifica(" ").isPresent()); + } + + @Test + void verifica_stringNull_retornaVazio() { + assertFalse(ObjetoUtil.verifica("null").isPresent()); + } + + @Test + void verifica_stringNullCaseInsensitive_retornaVazio() { + assertFalse(ObjetoUtil.verifica("NULL").isPresent()); + } + + @Test + void verifica_stringValida_retornaPresente() { + Optional result = ObjetoUtil.verifica("valor"); + assertTrue(result.isPresent()); + assertEquals("valor", result.get()); + } + + @Test + void verifica_colecaoVazia_retornaVazio() { + assertFalse(ObjetoUtil.verifica(Collections.emptyList()).isPresent()); + } + + @Test + void verifica_colecaoComElementos_retornaPresente() { + assertTrue(ObjetoUtil.verifica(Arrays.asList("a", "b")).isPresent()); + } + + // ------------------------------------------------------------------------- + // getBigDecimalOrZero(String) + // ------------------------------------------------------------------------- + + @Test + void getBigDecimalOrZero_null_retornaZero() { + assertEquals(BigDecimal.ZERO, ObjetoUtil.getBigDecimalOrZero(null)); + } + + @Test + void getBigDecimalOrZero_stringVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, ObjetoUtil.getBigDecimalOrZero("")); + } + + @Test + void getBigDecimalOrZero_stringInvalida_retornaZero() { + assertEquals(BigDecimal.ZERO, ObjetoUtil.getBigDecimalOrZero("abc")); + } + + @Test + void getBigDecimalOrZero_valorValido_retornaValor() { + assertEquals(new BigDecimal("1.50"), ObjetoUtil.getBigDecimalOrZero("1.50")); + } + + @Test + void getBigDecimalOrZero_valorInteiro_retornaValor() { + assertEquals(new BigDecimal("100"), ObjetoUtil.getBigDecimalOrZero("100")); + } + + // ------------------------------------------------------------------------- + // getOrZero(BigDecimal) + // ------------------------------------------------------------------------- + + @Test + void getOrZero_null_retornaZero() { + assertEquals(BigDecimal.ZERO, ObjetoUtil.getOrZero(null)); + } + + @Test + void getOrZero_valorPositivo_retornaValor() { + BigDecimal valor = new BigDecimal("25.99"); + assertEquals(valor, ObjetoUtil.getOrZero(valor)); + } + + @Test + void getOrZero_zero_retornaZero() { + assertEquals(BigDecimal.ZERO, ObjetoUtil.getOrZero(BigDecimal.ZERO)); + } + + // ------------------------------------------------------------------------- + // getValor2Casas(BigDecimal) + // ------------------------------------------------------------------------- + + @Test + void getValor2Casas_null_retornaZeroFormatado() { + assertEquals("0.00", ObjetoUtil.getValor2Casas(null)); + } + + @Test + void getValor2Casas_negativo_retornaZeroFormatado() { + assertEquals("0.00", ObjetoUtil.getValor2Casas(new BigDecimal("-1"))); + } + + @Test + void getValor2Casas_arredondaHalfUp() { + assertEquals("1.24", ObjetoUtil.getValor2Casas(new BigDecimal("1.235"))); + } + + @Test + void getValor2Casas_valorExato() { + assertEquals("13.00", ObjetoUtil.getValor2Casas(new BigDecimal("13"))); + } + + // ------------------------------------------------------------------------- + // getValor4Casas(BigDecimal) + // ------------------------------------------------------------------------- + + @Test + void getValor4Casas_null_retornaZeroFormatado() { + assertEquals("0.0000", ObjetoUtil.getValor4Casas(null)); + } + + @Test + void getValor4Casas_negativo_retornaZeroFormatado() { + assertEquals("0.0000", ObjetoUtil.getValor4Casas(new BigDecimal("-0.01"))); + } + + @Test + void getValor4Casas_arredondaHalfUp() { + assertEquals("5.0140", ObjetoUtil.getValor4Casas(new BigDecimal("5.01395"))); + } + + @Test + void getValor4Casas_valorExato() { + assertEquals("1.0000", ObjetoUtil.getValor4Casas(BigDecimal.ONE)); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/RetornoUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/RetornoUtilTest.java new file mode 100644 index 00000000..d9d7f372 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/RetornoUtilTest.java @@ -0,0 +1,221 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.dom.enuns.StatusEnum; +import br.com.swconsultoria.nfe.exception.NfeException; +import br.com.swconsultoria.nfe.schema.envEventoCancNFe.TRetEnvEvento; +import br.com.swconsultoria.nfe.schema.envEventoCancNFe.TRetEvento; +import br.com.swconsultoria.nfe.schema_4.consReciNFe.TProtNFe; +import br.com.swconsultoria.nfe.schema_4.consReciNFe.TRetConsReciNFe; +import br.com.swconsultoria.nfe.schema_4.enviNFe.TRetEnviNFe; +import br.com.swconsultoria.nfe.schema_4.inutNFe.TRetInutNFe; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class RetornoUtilTest { + + // ------------------------------------------------------------------------- + // isRetornoAssincrono + // ------------------------------------------------------------------------- + + @Test + void isRetornoAssincrono_loteRecebido_retornaTrue() throws NfeException { + TRetEnviNFe retorno = criaRetEnviNFe(StatusEnum.LOTE_RECEBIDO.getCodigo(), "Lote recebido"); + assertTrue(RetornoUtil.isRetornoAssincrono(retorno)); + } + + @Test + void isRetornoAssincrono_loteProcessado_retornaFalse() throws NfeException { + TRetEnviNFe retorno = criaRetEnviNFeComProt( + StatusEnum.LOTE_PROCESSADO.getCodigo(), "Lote processado", + StatusEnum.AUTORIZADO.getCodigo(), "Autorizado"); + assertFalse(RetornoUtil.isRetornoAssincrono(retorno)); + } + + @Test + void isRetornoAssincrono_cStatErrado_lancaExcecao() { + TRetEnviNFe retorno = criaRetEnviNFe("999", "Erro generico"); + assertThrows(NfeException.class, () -> RetornoUtil.isRetornoAssincrono(retorno)); + } + + // ------------------------------------------------------------------------- + // validaSincrono + // ------------------------------------------------------------------------- + + @Test + void validaSincrono_autorizado_naoLancaExcecao() { + TRetEnviNFe retorno = criaRetEnviNFeComProt( + StatusEnum.LOTE_PROCESSADO.getCodigo(), "Lote processado", + StatusEnum.AUTORIZADO.getCodigo(), "Autorizado o uso da NF-e"); + assertDoesNotThrow(() -> RetornoUtil.validaSincrono(retorno)); + } + + @Test + void validaSincrono_autorizadoForaPrazo_naoLancaExcecao() { + TRetEnviNFe retorno = criaRetEnviNFeComProt( + StatusEnum.LOTE_PROCESSADO.getCodigo(), "Lote processado", + StatusEnum.AUTORIZADO_FORA_PRAZO.getCodigo(), "Autorizado fora do prazo"); + assertDoesNotThrow(() -> RetornoUtil.validaSincrono(retorno)); + } + + @Test + void validaSincrono_cStatEnvelopeErrado_lancaExcecao() { + TRetEnviNFe retorno = criaRetEnviNFe("999", "Servico indisponivel"); + assertThrows(NfeException.class, () -> RetornoUtil.validaSincrono(retorno)); + } + + @Test + void validaSincrono_cStatProtocoloErrado_lancaExcecao() { + TRetEnviNFe retorno = criaRetEnviNFeComProt( + StatusEnum.LOTE_PROCESSADO.getCodigo(), "Lote processado", + "204", "Duplicidade de NF-e"); + assertThrows(NfeException.class, () -> RetornoUtil.validaSincrono(retorno)); + } + + // ------------------------------------------------------------------------- + // validaAssincrono + // ------------------------------------------------------------------------- + + @Test + void validaAssincrono_loteProcessadoAutorizado_naoLancaExcecao() { + TRetConsReciNFe retorno = criaRetConsReciNFe( + StatusEnum.LOTE_PROCESSADO.getCodigo(), "Lote processado", + StatusEnum.AUTORIZADO.getCodigo(), "Autorizado"); + assertDoesNotThrow(() -> RetornoUtil.validaAssincrono(retorno)); + } + + @Test + void validaAssincrono_loteEmProcessamento_lancaExcecao() { + TRetConsReciNFe retorno = new TRetConsReciNFe(); + retorno.setCStat(StatusEnum.LOTE_EM_PROCESSAMENTO.getCodigo()); + retorno.setXMotivo("Lote em processamento"); + assertThrows(NfeException.class, () -> RetornoUtil.validaAssincrono(retorno)); + } + + @Test + void validaAssincrono_protocoloComErro_lancaExcecao() { + TRetConsReciNFe retorno = criaRetConsReciNFe( + StatusEnum.LOTE_PROCESSADO.getCodigo(), "Lote processado", + "204", "Duplicidade de NF-e"); + assertThrows(NfeException.class, () -> RetornoUtil.validaAssincrono(retorno)); + } + + // ------------------------------------------------------------------------- + // validaCancelamento + // ------------------------------------------------------------------------- + + @Test + void validaCancelamento_eventoVinculado_naoLancaExcecao() { + TRetEnvEvento retorno = criaRetEnvEvento( + StatusEnum.LOTE_EVENTO_PROCESSADO.getCodigo(), + StatusEnum.EVENTO_VINCULADO.getCodigo()); + assertDoesNotThrow(() -> RetornoUtil.validaCancelamento(retorno)); + } + + @Test + void validaCancelamento_cancelamentoForaPrazo_naoLancaExcecao() { + TRetEnvEvento retorno = criaRetEnvEvento( + StatusEnum.LOTE_EVENTO_PROCESSADO.getCodigo(), + StatusEnum.CANCELAMENTO_FORA_PRAZO.getCodigo()); + assertDoesNotThrow(() -> RetornoUtil.validaCancelamento(retorno)); + } + + @Test + void validaCancelamento_envelopeErrado_lancaExcecao() { + TRetEnvEvento retorno = criaRetEnvEvento("999", StatusEnum.EVENTO_VINCULADO.getCodigo()); + assertThrows(NfeException.class, () -> RetornoUtil.validaCancelamento(retorno)); + } + + @Test + void validaCancelamento_eventoErrado_lancaExcecao() { + TRetEnvEvento retorno = criaRetEnvEvento( + StatusEnum.LOTE_EVENTO_PROCESSADO.getCodigo(), "999"); + assertThrows(NfeException.class, () -> RetornoUtil.validaCancelamento(retorno)); + } + + // ------------------------------------------------------------------------- + // validaInutilizacao + // ------------------------------------------------------------------------- + + @Test + void validaInutilizacao_inutilizado_naoLancaExcecao() { + TRetInutNFe retorno = new TRetInutNFe(); + TRetInutNFe.InfInut infInut = new TRetInutNFe.InfInut(); + infInut.setCStat(StatusEnum.INUTILIZADO.getCodigo()); + infInut.setXMotivo("Inutilizacao de numero de NF-e homologada"); + retorno.setInfInut(infInut); + + assertDoesNotThrow(() -> RetornoUtil.validaInutilizacao(retorno)); + } + + @Test + void validaInutilizacao_cStatErrado_lancaExcecao() { + TRetInutNFe retorno = new TRetInutNFe(); + TRetInutNFe.InfInut infInut = new TRetInutNFe.InfInut(); + infInut.setCStat("999"); + infInut.setXMotivo("Erro"); + retorno.setInfInut(infInut); + + assertThrows(NfeException.class, () -> RetornoUtil.validaInutilizacao(retorno)); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private TRetEnviNFe criaRetEnviNFe(String cStat, String xMotivo) { + TRetEnviNFe retorno = new TRetEnviNFe(); + retorno.setCStat(cStat); + retorno.setXMotivo(xMotivo); + return retorno; + } + + private TRetEnviNFe criaRetEnviNFeComProt(String cStatEnvelope, String xMotivoEnvelope, + String cStatProt, String xMotivoProt) { + TRetEnviNFe retorno = criaRetEnviNFe(cStatEnvelope, xMotivoEnvelope); + + br.com.swconsultoria.nfe.schema_4.enviNFe.TProtNFe protNFe = + new br.com.swconsultoria.nfe.schema_4.enviNFe.TProtNFe(); + br.com.swconsultoria.nfe.schema_4.enviNFe.TProtNFe.InfProt infProt = + new br.com.swconsultoria.nfe.schema_4.enviNFe.TProtNFe.InfProt(); + infProt.setCStat(cStatProt); + infProt.setXMotivo(xMotivoProt); + protNFe.setInfProt(infProt); + retorno.setProtNFe(protNFe); + + return retorno; + } + + private TRetConsReciNFe criaRetConsReciNFe(String cStatEnvelope, String xMotivoEnvelope, + String cStatProt, String xMotivoProt) { + TRetConsReciNFe retorno = new TRetConsReciNFe(); + retorno.setCStat(cStatEnvelope); + retorno.setXMotivo(xMotivoEnvelope); + + TProtNFe protNFe = new TProtNFe(); + TProtNFe.InfProt infProt = new TProtNFe.InfProt(); + infProt.setCStat(cStatProt); + infProt.setXMotivo(xMotivoProt); + infProt.setChNFe("52240310732644000128550010000000011234567890"); + protNFe.setInfProt(infProt); + retorno.getProtNFe().add(protNFe); + + return retorno; + } + + private TRetEnvEvento criaRetEnvEvento(String cStatEnvelope, String cStatEvento) { + TRetEnvEvento retorno = new TRetEnvEvento(); + retorno.setCStat(cStatEnvelope); + retorno.setXMotivo("Lote de Evento Processado"); + + TRetEvento retEvento = new TRetEvento(); + TRetEvento.InfEvento infEvento = new TRetEvento.InfEvento(); + infEvento.setCStat(cStatEvento); + infEvento.setXMotivo("Evento registrado"); + infEvento.setChNFe("52240310732644000128550010000000011234567890"); + retEvento.setInfEvento(infEvento); + retorno.getRetEvento().add(retEvento); + + return retorno; + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/XmlImpostoUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/XmlImpostoUtilTest.java new file mode 100644 index 00000000..101e59b1 --- /dev/null +++ b/src/test/java/br/com/swconsultoria/nfe/util/XmlImpostoUtilTest.java @@ -0,0 +1,247 @@ +package br.com.swconsultoria.nfe.util; + +import br.com.swconsultoria.nfe.schema_4.enviNFe.ObjectFactory; +import br.com.swconsultoria.nfe.schema_4.enviNFe.TNFe.InfNFe.Det.Imposto.*; +import br.com.swconsultoria.nfe.schema_4.enviNFe.TNFe.InfNFe.Det.Imposto.COFINS.COFINSAliq; +import br.com.swconsultoria.nfe.schema_4.enviNFe.TNFe.InfNFe.Det.Imposto.COFINS.COFINSQtde; +import br.com.swconsultoria.nfe.schema_4.enviNFe.TNFe.InfNFe.Det.Imposto.PIS.PISAliq; +import br.com.swconsultoria.nfe.schema_4.enviNFe.TNFe.InfNFe.Det.Imposto.PIS.PISQtde; +import org.junit.jupiter.api.Test; + +import javax.xml.bind.JAXBElement; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class XmlImpostoUtilTest { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + // ------------------------------------------------------------------------- + // getVPIS + // ------------------------------------------------------------------------- + + @Test + void getVPIS_listaVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVPIS(Collections.emptyList())); + } + + @Test + void getVPIS_pisAliq_retornaValor() { + PIS pis = new PIS(); + PISAliq pisAliq = new PISAliq(); + pisAliq.setVPIS("16.81"); + pis.setPISAliq(pisAliq); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoPIS(pis)); + + assertEquals(new BigDecimal("16.81"), XmlImpostoUtil.getVPIS(impostos)); + } + + @Test + void getVPIS_pisQtde_retornaValor() { + PIS pis = new PIS(); + PISQtde pisQtde = new PISQtde(); + pisQtde.setVPIS("5.00"); + pis.setPISQtde(pisQtde); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoPIS(pis)); + + assertEquals(new BigDecimal("5.00"), XmlImpostoUtil.getVPIS(impostos)); + } + + @Test + void getVPIS_tipoErrado_retornaZero() { + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoICMS(new ICMS())); + + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVPIS(impostos)); + } + + // ------------------------------------------------------------------------- + // getVCOFINS + // ------------------------------------------------------------------------- + + @Test + void getVCOFINS_listaVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVCOFINS(Collections.emptyList())); + } + + @Test + void getVCOFINS_cofinsAliq_retornaValor() { + COFINS cofins = new COFINS(); + COFINSAliq cofinsAliq = new COFINSAliq(); + cofinsAliq.setVCOFINS("77.41"); + cofins.setCOFINSAliq(cofinsAliq); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoCOFINS(cofins)); + + assertEquals(new BigDecimal("77.41"), XmlImpostoUtil.getVCOFINS(impostos)); + } + + @Test + void getVCOFINS_cofinsQtde_retornaValor() { + COFINS cofins = new COFINS(); + COFINSQtde cofinsQtde = new COFINSQtde(); + cofinsQtde.setVCOFINS("10.00"); + cofins.setCOFINSQtde(cofinsQtde); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoCOFINS(cofins)); + + assertEquals(new BigDecimal("10.00"), XmlImpostoUtil.getVCOFINS(impostos)); + } + + // ------------------------------------------------------------------------- + // getVICMS + // ------------------------------------------------------------------------- + + @Test + void getVICMS_listaVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVICMS(Collections.emptyList())); + } + + @Test + void getVICMS_icms00_retornaValor() { + ICMS icms = new ICMS(); + ICMS.ICMS00 icms00 = new ICMS.ICMS00(); + icms00.setVICMS("208.63"); + icms.setICMS00(icms00); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoICMS(icms)); + + assertEquals(new BigDecimal("208.63"), XmlImpostoUtil.getVICMS(impostos)); + } + + @Test + void getVICMS_icms10_retornaValor() { + ICMS icms = new ICMS(); + ICMS.ICMS10 icms10 = new ICMS.ICMS10(); + icms10.setVICMS("100.00"); + icms.setICMS10(icms10); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoICMS(icms)); + + assertEquals(new BigDecimal("100.00"), XmlImpostoUtil.getVICMS(impostos)); + } + + @Test + void getVICMS_semVICMSPreenchido_retornaZero() { + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoICMS(new ICMS())); + + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVICMS(impostos)); + } + + // ------------------------------------------------------------------------- + // getVICMSUFDest + // ------------------------------------------------------------------------- + + @Test + void getVICMSUFDest_listaVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVICMSUFDest(Collections.emptyList())); + } + + @Test + void getVICMSUFDest_comValor_retornaValor() { + ICMSUFDest icmsUfDest = new ICMSUFDest(); + icmsUfDest.setVICMSUFDest("45.00"); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoICMSUFDest(icmsUfDest)); + + assertEquals(new BigDecimal("45.00"), XmlImpostoUtil.getVICMSUFDest(impostos)); + } + + // ------------------------------------------------------------------------- + // getVFCP + // ------------------------------------------------------------------------- + + @Test + void getVFCP_listaVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVFCP(Collections.emptyList())); + } + + @Test + void getVFCP_icms00ComFCP_retornaValor() { + ICMS icms = new ICMS(); + ICMS.ICMS00 icms00 = new ICMS.ICMS00(); + icms00.setVFCP("12.50"); + icms.setICMS00(icms00); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoICMS(icms)); + + assertEquals(new BigDecimal("12.50"), XmlImpostoUtil.getVFCP(impostos)); + } + + // ------------------------------------------------------------------------- + // getVFCPUFDest + // ------------------------------------------------------------------------- + + @Test + void getVFCPUFDest_listaVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVFCPUFDest(Collections.emptyList())); + } + + @Test + void getVFCPUFDest_comValor_retornaValor() { + ICMSUFDest icmsUfDest = new ICMSUFDest(); + icmsUfDest.setVFCPUFDest("8.00"); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoICMSUFDest(icmsUfDest)); + + assertEquals(new BigDecimal("8.00"), XmlImpostoUtil.getVFCPUFDest(impostos)); + } + + // ------------------------------------------------------------------------- + // getVICMSMono + // ------------------------------------------------------------------------- + + @Test + void getVICMSMono_listaVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVICMSMono(Collections.emptyList())); + } + + @Test + void getVICMSMono_icms02_retornaValor() { + ICMS icms = new ICMS(); + ICMS.ICMS02 icms02 = new ICMS.ICMS02(); + icms02.setVICMSMono("30.00"); + icms.setICMS02(icms02); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoICMS(icms)); + + assertEquals(new BigDecimal("30.00"), XmlImpostoUtil.getVICMSMono(impostos)); + } + + // ------------------------------------------------------------------------- + // getVISSQN + // ------------------------------------------------------------------------- + + @Test + void getVISSQN_listaVazia_retornaZero() { + assertEquals(BigDecimal.ZERO, XmlImpostoUtil.getVISSQN(Collections.emptyList())); + } + + @Test + void getVISSQN_comValor_retornaValor() { + ISSQN issqn = new ISSQN(); + issqn.setVISSQN("99.99"); + + List> impostos = new ArrayList<>(); + impostos.add(FACTORY.createTNFeInfNFeDetImpostoISSQN(issqn)); + + assertEquals(new BigDecimal("99.99"), XmlImpostoUtil.getVISSQN(impostos)); + } +} diff --git a/src/test/java/br/com/swconsultoria/nfe/util/XmlNfeUtilTest.java b/src/test/java/br/com/swconsultoria/nfe/util/XmlNfeUtilTest.java index 44fcb810..44603095 100644 --- a/src/test/java/br/com/swconsultoria/nfe/util/XmlNfeUtilTest.java +++ b/src/test/java/br/com/swconsultoria/nfe/util/XmlNfeUtilTest.java @@ -98,4 +98,84 @@ void deveLancarExcecaoQuandoXmlEhVazio() { assertEquals("XML de entrada está vazio.", exception.getMessage()); } + // ------------------------------------------------------------------------- + // objectToXml / xmlToObject + // ------------------------------------------------------------------------- + + @Test + void objectToXml_retornaXmlComDeclaracaoETagRaiz() throws Exception { + br.com.swconsultoria.nfe.schema_4.consStatServ.TRetConsStatServ obj = + new br.com.swconsultoria.nfe.schema_4.consStatServ.TRetConsStatServ(); + obj.setCStat("107"); + obj.setXMotivo("Servico em Operacao"); + + String xml = XmlNfeUtil.objectToXml(obj); + + assertTrue(xml.startsWith("" + + "2GO4.0107" + + "Servico em Operacao52" + + "2024-01-01T10:00:00-03:00"; + + br.com.swconsultoria.nfe.schema_4.consStatServ.TRetConsStatServ obj = + XmlNfeUtil.xmlToObject(xml, br.com.swconsultoria.nfe.schema_4.consStatServ.TRetConsStatServ.class); + + assertNotNull(obj); + assertEquals("107", obj.getCStat()); + assertEquals("Servico em Operacao", obj.getXMotivo()); + } + + // ------------------------------------------------------------------------- + // dataNfe + // ------------------------------------------------------------------------- + + @Test + void dataNfe_comZoneId_retornaFormatoISO() { + java.time.LocalDateTime dt = java.time.LocalDateTime.of(2024, 3, 15, 10, 30, 0); + java.time.ZoneId zone = java.time.ZoneId.of("America/Sao_Paulo"); + + String resultado = XmlNfeUtil.dataNfe(dt, zone); + + assertNotNull(resultado); + assertTrue(resultado.startsWith("2024-03-15T10:30:00")); + } + + @Test + void dataNfe_zoneIdNulo_usaFallback() { + java.time.LocalDateTime dt = java.time.LocalDateTime.of(2024, 6, 1, 8, 0, 0); + assertNotNull(XmlNfeUtil.dataNfe(dt, null)); + } + + // ------------------------------------------------------------------------- + // gZipToXml + // ------------------------------------------------------------------------- + + @Test + void gZipToXml_descomprimeBytesGzip() throws Exception { + String conteudo = "teste"; + java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); + try (java.util.zip.GZIPOutputStream gos = new java.util.zip.GZIPOutputStream(baos)) { + gos.write(conteudo.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + } + + String resultado = XmlNfeUtil.gZipToXml(baos.toByteArray()); + assertEquals(conteudo, resultado); + } + + @Test + void gZipToXml_bytesNulos_retornaVazio() throws Exception { + assertEquals("", XmlNfeUtil.gZipToXml(null)); + } + + @Test + void gZipToXml_bytesVazios_retornaVazio() throws Exception { + assertEquals("", XmlNfeUtil.gZipToXml(new byte[0])); + } + } From b47d980d1cc1f066db98fed73f4c7db9853ec768 Mon Sep 17 00:00:00 2001 From: SamuelOliveira Date: Thu, 19 Mar 2026 11:58:04 -0300 Subject: [PATCH 4/7] Adicionado Novo cacert --- .gitignore | 2 ++ README.md | 10 +++++++--- pom.xml | 13 +++++++++++-- .../com/swconsultoria/nfe/dom/ConfiguracoesNfe.java | 4 ++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 88ba55d3..c21e08a1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ target/ .idea/ *.iml /target/ +/.github/*.md +show, \ No newline at end of file diff --git a/README.md b/README.md index c02730e8..5dc21dd8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Java-NFe [![MIT License](https://img.shields.io/github/license/Samuel-Oliveira/Java_NFe.svg) ](https://github.com/Samuel-Oliveira/Java_NFe/blob/master/LICENSE) [![Maven Central](https://img.shields.io/maven-central/v/br.com.swconsultoria/java-nfe.svg?label=Maven%20Central)](https://search.maven.org/artifact/br.com.swconsultoria/java-nfe/4.00.50/jar) +# Java-NFe [![MIT License](https://img.shields.io/github/license/Samuel-Oliveira/Java_NFe.svg) ](https://github.com/Samuel-Oliveira/Java_NFe/blob/master/LICENSE) [![Maven Central](https://img.shields.io/maven-central/v/br.com.swconsultoria/java-nfe.svg?label=Maven%20Central)](https://search.maven.org/artifact/br.com.swconsultoria/java-nfe/4.00.51/jar) [![Coverage Status](https://coveralls.io/repos/github/Samuel-Oliveira/Java_NFe/badge.svg?branch=master)](https://coveralls.io/github/Samuel-Oliveira/Java_NFe?branch=master) [![Testes Unitários](https://img.shields.io/badge/testes%20unit%C3%A1rios-206-blue)](src/test/java/br/com/swconsultoria/nfe) Biblioteca Java para consumo do WebService de NFe/NFCe ### Powered by @@ -22,7 +22,7 @@ Para Iniciar : br.com.swconsultoria java-nfe - 4.00.50 + 4.00.51 ``` @@ -34,7 +34,7 @@ repositories { } } dependencies { - implementation "br.com.swconsultoria:java-nfe:4.00.50" + implementation "br.com.swconsultoria:java-nfe:4.00.51" } ``` @@ -44,6 +44,10 @@ ________________________________________________________________________________ # Historico de Versões +## v4.00.51 - 19/03/2026 - Schemas PL.010b (v1.30) +- Adicionado Teste Unitarios +- Atualizado Cacert + ## v4.00.50 - 16/02/2026 - Schemas PL.010b (v1.30) - Ajustes Impressao Danfe diff --git a/pom.xml b/pom.xml index 91a86447..5d6db058 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ br.com.swconsultoria java-nfe - 4.00.50 + 4.00.51 Java_NFe Api java para consumo do webService de nota fiscal eletronica https://github.com/Samuel-Oliveira/Java_NFe @@ -31,7 +31,7 @@ 1.8 - 3.13 + 3.14 4.4.6 2.3.1 2.3.1 @@ -279,6 +279,15 @@ true + + + org.eluder.coveralls + coveralls-maven-plugin + 4.3.0 + + paGe4qkZvPNJtvxqY8NaJN5ImZO56RqB6 + + diff --git a/src/main/java/br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java b/src/main/java/br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java index 2140c6ff..131bd422 100644 --- a/src/main/java/br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java +++ b/src/main/java/br/com/swconsultoria/nfe/dom/ConfiguracoesNfe.java @@ -109,8 +109,8 @@ public static ConfiguracoesNfe criarConfiguracoes(EstadosEnum estado, AmbienteEn log.info(String.format("JAVA-NFE | Samuel Oliveira | samuel@swconsultoria.com.br " + "| VERSAO=%s | DATA_VERSAO=%s | PASTA_SCHEMAS=%s | AMBIENTE=%s | ESTADO=%s", - "4.00.50", - "16/02/2026", + "4.00.51", + "19/03/2026", pastaSchemas, ambiente, estado.getNome().toUpperCase())); From 52658a4962851ab329865333c7839ccbb7bfc82d Mon Sep 17 00:00:00 2001 From: SamuelOliveira Date: Thu, 19 Mar 2026 12:19:04 -0300 Subject: [PATCH 5/7] Correcao de IBSCBS Test --- README.md | 2 +- .../com/swconsultoria/nfe/exemplos/IbsCbsTest.java | 13 +++++++++++-- src/test/resources/IbsCbs.xml | 2 +- src/test/resources/IbsCbsDiferimento.xml | 2 +- src/test/resources/IbsCbsMonofasico.xml | 2 +- src/test/resources/IbsCbsRegular.xml | 2 +- src/test/resources/TesteXml.xml | 2 +- 7 files changed, 17 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5dc21dd8..941c836d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Java-NFe [![MIT License](https://img.shields.io/github/license/Samuel-Oliveira/Java_NFe.svg) ](https://github.com/Samuel-Oliveira/Java_NFe/blob/master/LICENSE) [![Maven Central](https://img.shields.io/maven-central/v/br.com.swconsultoria/java-nfe.svg?label=Maven%20Central)](https://search.maven.org/artifact/br.com.swconsultoria/java-nfe/4.00.51/jar) [![Coverage Status](https://coveralls.io/repos/github/Samuel-Oliveira/Java_NFe/badge.svg?branch=master)](https://coveralls.io/github/Samuel-Oliveira/Java_NFe?branch=master) [![Testes Unitários](https://img.shields.io/badge/testes%20unit%C3%A1rios-206-blue)](src/test/java/br/com/swconsultoria/nfe) +# Java-NFe [![MIT License](https://img.shields.io/github/license/Samuel-Oliveira/Java_NFe.svg) ](https://github.com/Samuel-Oliveira/Java_NFe/blob/master/LICENSE) [![Maven Central](https://img.shields.io/maven-central/v/br.com.swconsultoria/java-nfe.svg?label=Maven%20Central)](https://search.maven.org/artifact/br.com.swconsultoria/java-nfe/4.00.51/jar) [![Coverage Status](https://coveralls.io/repos/github/Samuel-Oliveira/Java_NFe/badge.svg?branch=master)](https://coveralls.io/github/Samuel-Oliveira/Java_NFe?branch=master) Biblioteca Java para consumo do WebService de NFe/NFCe ### Powered by diff --git a/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTest.java b/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTest.java index 296cefda..41db4832 100644 --- a/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTest.java +++ b/src/test/java/br/com/swconsultoria/nfe/exemplos/IbsCbsTest.java @@ -1,5 +1,7 @@ package br.com.swconsultoria.nfe.exemplos; +import br.com.swconsultoria.certificado.Certificado; +import br.com.swconsultoria.certificado.CertificadoService; import br.com.swconsultoria.nfe.Nfe; import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe; import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum; @@ -19,6 +21,9 @@ import javax.xml.namespace.QName; import java.io.IOException; import java.math.BigDecimal; +import java.net.URI; +import java.nio.file.Paths; +import java.util.Objects; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -125,7 +130,7 @@ private static TEnviNFe addTotaisIbsCbs(IbsCbsUtil ibsCbsUtil, TEnviNFe enviNFe, TIBSCBSMonoTot totaisIbsCsb = ibsCbsUtil.preencheTotaisIbsCsb(); enviNFe.getNFe().get(0).getInfNFe().getTotal().setIBSCBSTot(totaisIbsCsb); - return Nfe.montaNfe(config, enviNFe, true); + return Nfe.montaNfe(config, enviNFe, false); } private static String getIbsCbsJson() throws IOException { @@ -138,7 +143,11 @@ private static TEnviNFe getEnviNFe() throws IOException { } private static ConfiguracoesNfe getConfiguracoesNfe() throws Exception { - return ConfiguracaoTeste.iniciaConfiguracoes(EstadosEnum.GO, AmbienteEnum.HOMOLOGACAO); + URI uri = Objects.requireNonNull(IbsCbsTest.class.getClassLoader() + .getResource("NAO_UTILIZE.pfx")) + .toURI(); + Certificado certificado = CertificadoService.certificadoPfx(Paths.get(uri).toString(), "123456"); + return ConfiguracoesNfe.criarConfiguracoes(EstadosEnum.GO, AmbienteEnum.HOMOLOGACAO, certificado, null); } } diff --git a/src/test/resources/IbsCbs.xml b/src/test/resources/IbsCbs.xml index 953cb6ff..f66e3927 100644 --- a/src/test/resources/IbsCbs.xml +++ b/src/test/resources/IbsCbs.xml @@ -1 +1 @@ -113544039674VENDA DE PRODUÇÃO55112452026-01-12T11:27:13-03:0011353780011311100Bridi.4.0.3410732644000128ALUMINIO SUL DESC RESID IND EIRELIRODOVIA JOSE DE CARVALHOS/NFUNIL3537800PIEDADESP181700001058Brasil1532996276526082602118356558703000275BENTOMAR INDUSTRIA E COMERCIO DE MINERIOS LTDARUA 4331FERRAZ3543907RIO CLAROSP135080001058Brasil193539127315871243791161SEM GTINPO COM ALUMINIO INDUSTRIAL NAO LAMELAR760310005101KG1.000100.00100.00SEM GTINKG1.000100.001020333.3367.0018.0012.0099950100.002.603.000188.000.650.570188.003.002.6400000000184.790.10000.080.00000.000.080.90000.7667.0012.000.000.000.000.000.000.000.000.000.000.000.00100.000.000.000.000.003.000.000.572.640.00103.0084.790.000.000.080.000.000.000.080.000.000.000.000.760.000.00103.8490011.03Base de Cálculo do ICMS Reduzida conforme Art.15 do Anexo II do RICMSY58yC1c4Rx9N0msxhzbVb0DU3w0=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 \ No newline at end of file +113544039674VENDA DE PRODUÇÃO55112452026-01-12T11:27:13-03:0011353780011311100Bridi.4.0.3499999999999999ALUMINIO SUL DESC RESID IND EIRELIRODOVIA JOSE DE CARVALHOS/NFUNIL3537800PIEDADESP181700001058Brasil1532996276526082602118356558703000275BENTOMAR INDUSTRIA E COMERCIO DE MINERIOS LTDARUA 4331FERRAZ3543907RIO CLAROSP135080001058Brasil193539127315871243791161SEM GTINPO COM ALUMINIO INDUSTRIAL NAO LAMELAR760310005101KG1.000100.00100.00SEM GTINKG1.000100.001020333.3367.0018.0012.0099950100.002.603.000188.000.650.570188.003.002.6400000000184.790.10000.080.00000.000.080.90000.7667.0012.000.000.000.000.000.000.000.000.000.000.000.00100.000.000.000.000.003.000.000.572.640.00103.0084.790.000.000.080.000.000.000.080.000.000.000.000.760.000.00103.8490011.03Base de Cálculo do ICMS Reduzida conforme Art.15 do Anexo II do RICMSiwYcsB6cCjrHE2rATM0IwbAlKqo=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 \ No newline at end of file diff --git a/src/test/resources/IbsCbsDiferimento.xml b/src/test/resources/IbsCbsDiferimento.xml index 172fdb40..fc545bbe 100644 --- a/src/test/resources/IbsCbsDiferimento.xml +++ b/src/test/resources/IbsCbsDiferimento.xml @@ -1 +1 @@ -113544039674VENDA DE PRODUÇÃO55112452026-01-12T11:27:13-03:0011353780011311100Bridi.4.0.3410732644000128ALUMINIO SUL DESC RESID IND EIRELIRODOVIA JOSE DE CARVALHOS/NFUNIL3537800PIEDADESP181700001058Brasil1532996276526082602118356558703000275BENTOMAR INDUSTRIA E COMERCIO DE MINERIOS LTDARUA 4331FERRAZ3543907RIO CLAROSP135080001058Brasil193539127315871243791161SEM GTINPO COM ALUMINIO INDUSTRIAL NAO LAMELAR760310005101KG1.000100.00100.00SEM GTINKG1.000100.001020333.3367.0018.0012.0099950100.002.603.000188.000.650.570188.003.002.6451551500184.790.1000100.00000.0360.00000.04000.000.0000100.00000.0060.00000.00000.000.000.9000100.00000.3160.00000.36000.0067.0012.000.000.000.000.000.000.000.000.000.000.000.00100.000.000.000.000.003.000.000.572.640.00103.0084.790.030.000.000.000.000.000.000.000.000.310.000.000.000.00103.0090011.03Base de Cálculo do ICMS Reduzida conforme Art.15 do Anexo II do RICMS/wZ1P50RYVhs4Bd1JyIlAFH+LY4=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 \ No newline at end of file +113544039674VENDA DE PRODUÇÃO55112452026-01-12T11:27:13-03:0011353780011311100Bridi.4.0.3499999999999999ALUMINIO SUL DESC RESID IND EIRELIRODOVIA JOSE DE CARVALHOS/NFUNIL3537800PIEDADESP181700001058Brasil1532996276526082602118356558703000275BENTOMAR INDUSTRIA E COMERCIO DE MINERIOS LTDARUA 4331FERRAZ3543907RIO CLAROSP135080001058Brasil193539127315871243791161SEM GTINPO COM ALUMINIO INDUSTRIAL NAO LAMELAR760310005101KG1.000100.00100.00SEM GTINKG1.000100.001020333.3367.0018.0012.0099950100.002.603.000188.000.650.570188.003.002.6451551500184.790.1000100.00000.0360.00000.04000.000.0000100.00000.0060.00000.00000.000.000.9000100.00000.3160.00000.36000.0067.0012.000.000.000.000.000.000.000.000.000.000.000.00100.000.000.000.000.003.000.000.572.640.00103.0084.790.030.000.000.000.000.000.000.000.000.310.000.000.000.00103.0090011.03Base de Cálculo do ICMS Reduzida conforme Art.15 do Anexo II do RICMS90ioDn5W07CN9m1Ajc/sj3e+TtM=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 \ No newline at end of file diff --git a/src/test/resources/IbsCbsMonofasico.xml b/src/test/resources/IbsCbsMonofasico.xml index 507faa4a..177ef1a5 100644 --- a/src/test/resources/IbsCbsMonofasico.xml +++ b/src/test/resources/IbsCbsMonofasico.xml @@ -1 +1 @@ -113544039674VENDA DE PRODUÇÃO55112452026-01-12T11:27:13-03:0011353780011311100Bridi.4.0.3410732644000128ALUMINIO SUL DESC RESID IND EIRELIRODOVIA JOSE DE CARVALHOS/NFUNIL3537800PIEDADESP181700001058Brasil1532996276526082602118356558703000275BENTOMAR INDUSTRIA E COMERCIO DE MINERIOS LTDARUA 4331FERRAZ3543907RIO CLAROSP135080001058Brasil193539127315871243791161SEM GTINPO COM ALUMINIO INDUSTRIAL NAO LAMELAR760310005101KG1.000100.00100.00SEM GTINKG1.000100.001020333.3367.0018.0012.0099950100.002.603.000188.000.650.570188.003.002.646206200061.00000.000.000.000.000.000.0067.0012.000.000.000.000.000.000.000.000.000.000.000.00100.000.000.000.000.003.000.000.572.640.00103.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.00103.0090011.03Base de Cálculo do ICMS Reduzida conforme Art.15 do Anexo II do RICMS3v8Vobtq42/Bge87f6IW+SPVt0s=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 \ No newline at end of file +113544039674VENDA DE PRODUÇÃO55112452026-01-12T11:27:13-03:0011353780011311100Bridi.4.0.3499999999999999ALUMINIO SUL DESC RESID IND EIRELIRODOVIA JOSE DE CARVALHOS/NFUNIL3537800PIEDADESP181700001058Brasil1532996276526082602118356558703000275BENTOMAR INDUSTRIA E COMERCIO DE MINERIOS LTDARUA 4331FERRAZ3543907RIO CLAROSP135080001058Brasil193539127315871243791161SEM GTINPO COM ALUMINIO INDUSTRIAL NAO LAMELAR760310005101KG1.000100.00100.00SEM GTINKG1.000100.001020333.3367.0018.0012.0099950100.002.603.000188.000.650.570188.003.002.646206200061.00000.000.000.000.000.000.0067.0012.000.000.000.000.000.000.000.000.000.000.000.00100.000.000.000.000.003.000.000.572.640.00103.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.00103.0090011.03Base de Cálculo do ICMS Reduzida conforme Art.15 do Anexo II do RICMS5a+GoQw7bId3FOqKlwtxxA5a2F4=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 \ No newline at end of file diff --git a/src/test/resources/IbsCbsRegular.xml b/src/test/resources/IbsCbsRegular.xml index 67617f12..a5dd13da 100644 --- a/src/test/resources/IbsCbsRegular.xml +++ b/src/test/resources/IbsCbsRegular.xml @@ -1 +1 @@ -113544039674VENDA DE PRODUÇÃO55112452026-01-12T11:27:13-03:0011353780011311100Bridi.4.0.3410732644000128ALUMINIO SUL DESC RESID IND EIRELIRODOVIA JOSE DE CARVALHOS/NFUNIL3537800PIEDADESP181700001058Brasil1532996276526082602118356558703000275BENTOMAR INDUSTRIA E COMERCIO DE MINERIOS LTDARUA 4331FERRAZ3543907RIO CLAROSP135080001058Brasil193539127315871243791161SEM GTINPO COM ALUMINIO INDUSTRIAL NAO LAMELAR760310005101KG1.000100.00100.00SEM GTINKG1.000100.001020333.3367.0018.0012.0099950100.002.603.000188.000.650.570188.003.002.6455055000184.790.00000.000.00000.000.000.00000.000000000010.10000.080.00000.000.90000.7667.0012.000.000.000.000.000.000.000.000.000.000.000.00100.000.000.000.000.003.000.000.572.640.00103.0084.790.000.000.000.000.000.000.000.000.000.000.000.000.000.00103.0090011.03Base de Cálculo do ICMS Reduzida conforme Art.15 do Anexo II do RICMSoqwiOUseitPSyMzfV33cP4BRKdg=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 \ No newline at end of file +113544039674VENDA DE PRODUÇÃO55112452026-01-12T11:27:13-03:0011353780011311100Bridi.4.0.3499999999999999ALUMINIO SUL DESC RESID IND EIRELIRODOVIA JOSE DE CARVALHOS/NFUNIL3537800PIEDADESP181700001058Brasil1532996276526082602118356558703000275BENTOMAR INDUSTRIA E COMERCIO DE MINERIOS LTDARUA 4331FERRAZ3543907RIO CLAROSP135080001058Brasil193539127315871243791161SEM GTINPO COM ALUMINIO INDUSTRIAL NAO LAMELAR760310005101KG1.000100.00100.00SEM GTINKG1.000100.001020333.3367.0018.0012.0099950100.002.603.000188.000.650.570188.003.002.6455055000184.790.00000.000.00000.000.000.00000.000000000010.10000.080.00000.000.90000.7667.0012.000.000.000.000.000.000.000.000.000.000.000.00100.000.000.000.000.003.000.000.572.640.00103.0084.790.000.000.000.000.000.000.000.000.000.000.000.000.000.00103.0090011.03Base de Cálculo do ICMS Reduzida conforme Art.15 do Anexo II do RICMStHE8fyHqixaezaQmkHgZxd+9Hxs=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 \ No newline at end of file diff --git a/src/test/resources/TesteXml.xml b/src/test/resources/TesteXml.xml index 1658262d..c8c22d75 100644 --- a/src/test/resources/TesteXml.xml +++ b/src/test/resources/TesteXml.xml @@ -26,7 +26,7 @@ Bridi.4.0.34 - 10732644000128 + 99999999999999 ALUMINIO SUL DESC RESID IND EIRELI RODOVIA JOSE DE CARVALHO From 9d684f47c99ef8c9e6c89316ef5184ba1e5b16eb Mon Sep 17 00:00:00 2001 From: Jair Maia Diniz Date: Thu, 9 Apr 2026 16:26:55 -0300 Subject: [PATCH 6/7] [SKYW-1751] Update to version 4.00.51 --- pom-base.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom-base.xml b/pom-base.xml index 19f41efb..dafc6fae 100644 --- a/pom-base.xml +++ b/pom-base.xml @@ -3,7 +3,7 @@ br.com.swconsultoria java-nfe - 4.00.49-${versao}-SNAPSHOT + 4.00.51-${versao}-SNAPSHOT Java_NFe Api java para consumo do webService de nota fiscal eletronica https://github.com/Samuel-Oliveira/Java_NFe @@ -31,7 +31,7 @@ 1.8 - 3.13 + 3.14 4.4.6 2.3.1 2.3.1 From ec2aca7cd1fa2d95bc30ed3d0c0fbfcf6951f2c6 Mon Sep 17 00:00:00 2001 From: Jair Maia Diniz Date: Fri, 10 Apr 2026 10:10:32 -0300 Subject: [PATCH 7/7] [SKYW-1751] XSD file update --- schemas/leiauteNFe_v4.00.xsd | 114 +++++++++++++-- schemas/nfe_v4.00.xsd | 22 ++- schemas/xmldsig-core-schema_v1.01.xsd | 194 +++++++++++++------------- 3 files changed, 209 insertions(+), 121 deletions(-) diff --git a/schemas/leiauteNFe_v4.00.xsd b/schemas/leiauteNFe_v4.00.xsd index 7393b031..28079674 100644 --- a/schemas/leiauteNFe_v4.00.xsd +++ b/schemas/leiauteNFe_v4.00.xsd @@ -18,9 +18,7 @@ - + @@ -211,7 +209,13 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e - Tipo de Nota de Débito + Tipo de Nota de Débito: +01=Transferência de créditos para Cooperativas; +02=Anulação de Crédito por Saídas Imunes/Isentas; +03=Débitos de notas fiscais não processadas na apuração; +04=Multa e juros; +05=Transferência de crédito de sucessão. + @@ -503,7 +507,7 @@ Preencher com "2B", quando se tratar de Cupom Fiscal emitido por máqu - + Chave de acesso da NF-e de antecipação de pagamento @@ -2557,13 +2561,15 @@ ambiente. - Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros;12-Fomento agropecuário + Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros; 10=Deficiente Condutor (Convênio ICMS 38/12); 11=Deficiente Não Condutor (Convênio ICMS 38/12); 12-Fomento agropecuário + + @@ -3397,11 +3403,39 @@ Informar o motivo da desoneração: Percentual de redução da BC + + + Código de Benefício Fiscal na UF aplicado ao item quando houver RBC. + + + + + + + + Alíquota do ICMS + + + + Valor do ICMS da Operação + + + + + Percentual do diferemento + + + + + Valor do ICMS da diferido + + + Valor do ICMS @@ -3424,6 +3458,23 @@ Informar o motivo da desoneração: + + + + Percentual do diferimento do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP) diferido. + + + + + Valor efetivo do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + @@ -3571,12 +3622,14 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o Tributação pelo ICMS 10 - Tributada e com cobrança do ICMS por substituição tributária; +20 – Redução de base de cálculo 90 – Outros. + @@ -3695,6 +3748,43 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o Sigla da UF para qual é devido o ICMS ST da operação. + + + Grupo desoneração + + + + Valor do ICMS de desoneração + + + + + Motivo da desoneração do ICMS:9-Outros;10=Deficiente Condutor (Convênio ICMS 38/12) 11=Deficiente Não Condutor (Convênio ICMS 38/12) + + + + + + + + + + + + + Indica se o valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd): +0=Valor do ICMS desonerado (vICMSDeson) não deduz do valor do item (vProd) / total da NF-e; +1=Valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd) / total da NF-e. + + + + + + + + + + @@ -6520,16 +6610,16 @@ tipo de ato concessório: - - - - - + + + + + @@ -7578,4 +7668,4 @@ alterado para tamanho variavel 1-4. (NT2011/004) - \ No newline at end of file + diff --git a/schemas/nfe_v4.00.xsd b/schemas/nfe_v4.00.xsd index c934ca2b..b8e3dd25 100644 --- a/schemas/nfe_v4.00.xsd +++ b/schemas/nfe_v4.00.xsd @@ -1,12 +1,10 @@ - - - - - - - Nota Fiscal Eletrônica - - - + + + + + + + Nota Fiscal Eletrônica + + + diff --git a/schemas/xmldsig-core-schema_v1.01.xsd b/schemas/xmldsig-core-schema_v1.01.xsd index 65daee9a..f7dc8dc6 100644 --- a/schemas/xmldsig-core-schema_v1.01.xsd +++ b/schemas/xmldsig-core-schema_v1.01.xsd @@ -1,98 +1,98 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file