- Notifications
You must be signed in to change notification settings - Fork0
Nota Fiscal Eletrônica em Java. Compativel com Java 1.8
License
dennnisk/nfe-jdk-1.8
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
pom.xml Alterado para 4.0.38-JDK18 e removido o diretório padrão de publicação para um repositório interno.
Comunicador de nota fiscal e nota fiscal do consumidor dafazenda.
Este é um projeto colaborativo, sinta-se à vontade em usar e colaborar com o mesmo.
Antes de submeter um pull request, verifique a estrutura seguida pelo projeto e procure incluir no mesmo testes unitários que garantam que a funcionalidade funciona como o esperado.
Antes de começar a implementar, é altamente recomendável a leitura da documentação oficial que o governo disponibiliza emhttp://www.nfe.fazenda.gov.br/portal
Caso não possua conhecimento técnico para criar notas fiscais, um profissional da área (como um contador) pode lhe auxiliar.
<dependency> <groupId>com.github.wmixvideo</groupId> <artifactId>nfe</artifactId> <version>${latest.release}</version></dependency>
Para acessar a lista de versões disponíveis, acesse a página de releaseaqui no github.
git clone https://github.com/wmixvideo/nfe mvn clean install
Basicamente você precisará de uma implementação deNFeConfig (exemplificado abaixo), com informações de tipo de emissão, certificadosdigitais, e uma instância daWsFacade, essa classe tem a responsabilidade de fazer a ponte entre o seu sistema e acomunicação com os webservices da Sefaz.
// Exemplo de configuracao para acesso aos serviços da Sefaz.publicclassNFeConfigTesteextendsNFeConfig {privateKeyStorekeyStoreCertificado =null;privateKeyStorekeyStoreCadeia =null;@OverridepublicDFUnidadeFederativagetCUF() {returnDFUnidadeFederativa.SC; }@OverridepublicStringgetCertificadoSenha() {return"senha_certificado"; }@OverridepublicStringgetCadeiaCertificadosSenha() {return"senha_cadeia"; }@OverridepublicKeyStoregetCertificadoKeyStore()throwsKeyStoreException {if (this.keyStoreCertificado ==null) {this.keyStoreCertificado =KeyStore.getInstance("PKCS12");try (InputStreamcertificadoStream =newFileInputStream("/tmp/certificado.pfx")) {this.keyStoreCertificado.load(certificadoStream,this.getCertificadoSenha().toCharArray()); }catch (CertificateException |NoSuchAlgorithmException |IOExceptione) {this.keyStoreCadeia =null;thrownewKeyStoreException("Nao foi possibel montar o KeyStore com a cadeia de certificados",e); } }returnthis.keyStoreCertificado; }@OverridepublicKeyStoregetCadeiaCertificadosKeyStore()throwsKeyStoreException {if (this.keyStoreCadeia ==null) {this.keyStoreCadeia =KeyStore.getInstance("JKS");try (InputStreamcadeia =newFileInputStream("/tmp/cadeia.jks")) {this.keyStoreCadeia.load(cadeia,this.getCadeiaCertificadosSenha().toCharArray()); }catch (CertificateException |NoSuchAlgorithmException |IOExceptione) {this.keyStoreCadeia =null;thrownewKeyStoreException("Nao foi possibel montar o KeyStore com o certificado",e); } }returnthis.keyStoreCadeia; }}
KeyStorekeyStoreCert =KeyStore.getInstance("Windows-MY","SunMSCAPI");keyStoreCert.load(null,null);Enumeration<String>aliasEnum =keyStoreCert.aliases();
Após isso é necessário algum método para o usuário escolher entre um destes alias,talvez por meio de um JOptionPane(<java7)ou de um ChoiceDialog(>=Java8), e então fazer o load com a respectivo alias escolhido e sua senha.
Considere para os exemplos abaixo queconfig seja uma instância da implementação da interfaceNFeConfig.
NFStatusServicoConsultaRetornoretorno =newWSFacade(config).consultaStatus(DFUnidadeFederativa.SC,DFModelo.NFE);System.out.println(retorno.getStatus());System.out.println(retorno.getMotivo());
O Resultado será (caso o webservice responsável por SC esteja OK):
107Servico em operacao
Popule os dados do lote a ser enviado para o Sefaz:
NFLoteEnviolote =newNFLoteEnvio();// setando os dados do lote
Faça o envio do lote através do facade:
finalNFLoteEnvioRetornoretorno =newWSFacade(config).enviaLote(lote);
Faça a correção da nota através do facade:
finalNFEnviaEventoRetornoretorno =newWSFacade(config).corrigeNota(chaveDeAcessoDaNota,textoCorrecao,sequencialEventoDaNota);
Faça o cancelamento da nota através do facade:
finalNFCancelamentoRetornoDadosretorno =newWSFacade(config).cancelaNota(chaveDeAcessoDaNota,protocoloDaNota,motivoCancelaamento);
Faça a consulta da nota através do facade:
finalNFDistribuicaoIntRetornoretorno =newWSFacade(config).consultarDistribuicaoDFe(cnpj,uf,chaveAcesso,nsu,ultNsu);
Qualquer objeto que seja uma representação XML do documento NFe, pode ser obtido seu XML de forma fácil bastando chamar o métodotoString, por exemplo, para conseguir o XML do lote, invoque o toString
NFLoteEnviolote =newNFLoteEnvio();// setando os dados do lote...// Obtendo o xml do objetoStringxmlGerado =lote.toString();
Existe uma classe que pode receber um File/String e converter para um objeto NFNota, faça da seguinte forma:
finalNFNotanota =newDFPersister().read(NFNota.class,xmlNota);finalNFNotaProcessadanotaProcessada =newDFPersister().read(NFNotaProcessada.class,xmlNotaProcessada);
Ou desabilitando o modo estrito (habilitado por padrão):
finalNFNotanota =newDFPersister(false).read(NFNota.class,xmlNota);
Você precisará armazenar as notas autorizadas por questões legais e também para a geração do DANFE, uma forma de fazer é armazenar o xml das notas ao enviar o lote:
finalList<NFNota>notas =lote.getNotas();// Armazena os xmls das notas...
Ao fazer a consulta do lote, crie um objeto do tipoNFNotaProcessada e adicione o protocolo da nota correspondente, além da nota assinada:
// Carregue o xml da nota do local que foi armazenadofinalStringxmlNotaRecuperada;// Assine a notafinalStringxmlNotaRecuperadaAssinada =newAssinaturaDigital(config).assinarDocumento(xmlNotaRecuperada);// Converta para objeto javafinalNFNotanotaRecuperadaAssinada =newDFPersister().read(NFNota.class,xmlNotaRecuperadaAssinada);// Crie o objeto NFNotaProcessadafinalNFNotaProcessadanotaProcessada =newNFNotaProcessada();notaProcessada.setVersao(newBigDecimal(NFeConfig.VERSAO_NFE));notaProcessada.setProtocolo(protocolo);notaProcessada.setNota(notaRecuperadaAssinada);// Obtenha o xml da nota com protocoloStringxmlNotaProcessadaPeloSefaz =notaProcessada.toString();
- Possui validação de campos a nível de código;
- Valida o XML de envio de lote através dos xsd's disponibilizados pela Sefaz;
- Gera o XML dos objetos de maneira simples, invocando o metodo toString() dá conta do recado.
- Suporta diferentes TimeZones, com a implementacao do devido metodo na classe de configuração (DFConfig e suas subclasses).
Serviço | Status |
---|---|
Envio lote | Estável |
Consulta lote | Estável |
Consulta status | Estável |
Consulta nota | Estável |
Download nota | Estável |
Corrige nota | Estável |
Cancela nota | Estável |
Inutiliza nota | Estável |
Consulta cadastro | Estável |
Manifestação de destinatário | Estável |
JDK >= 1.8
Maven >= 3.x
Para usar os serviços da nota fiscal são necessários dois certificados:
- O certificado do cliente que será utilizado para assinar as notas e comunicar com o fisco (fornecido por uma entidade certificadora);
- A cadeia de certificados da SEFAZ que queremos acesso;
Os certificados são um ponto crítico já que estes tem validade de apenas um ano (certificado cliente).Além disso as SEFAZ vem trocando suas cadeias de certificado a cada atualização. Dessa forma se surgirem erros de SSL vale a pena verificar se existem novas atualizações de certificados.Para gerar a cadeia de certificados, disponibilizamos um pequeno helper que baixa os certificados das SEFAZ e gera o arquivo automaticamente:
publicstaticvoidmain(Stringargs[]){try {FileUtils.writeByteArrayToFile(newFile("/tmp/producao.cacerts"),DFCadeiaCertificados.geraCadeiaCertificados(DFAmbiente.PRODUCAO,"senha"));FileUtils.writeByteArrayToFile(newFile("/tmp/homologacao.cacerts"),DFCadeiaCertificados.geraCadeiaCertificados(DFAmbiente.HOMOLOGACAO,"senha")); }catch (Exceptione) {e.printStackTrace(); }}
About
Nota Fiscal Eletrônica em Java. Compativel com Java 1.8
Resources
License
Stars
Watchers
Forks
Packages0
Languages
- Java100.0%