Skip to content

Latest commit

History

1,518 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nota Fiscal Eletrônica

Comunicador de nota fiscal e nota fiscal do consumidor da fazenda.
Build StatusCoverage StatusMaven CentralApache 2.0 License

Atenção

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 usar

Antes de começar a implementar, é altamente recomendável a leitura da documentação oficial que o governo disponibiliza em http://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.

Instalação

Diretamente pelo Maven

<dependency>
<groupId>com.github.wmixvideo</groupId>
<artifactId>nfe</artifactId>
<version>3.0.2</version>
</dependency>

Fazendo o clone do projeto (última versão em desenvolvimento)

  1. Faça o clone do projeto com o comando:
 git clone https://github.com/wmixvideo/nfe
  1. Faça uma instalação local do projeto:
  • Rodando os testes:
     mvn clean install -Dgpg.skip=true
  • Sem rodar os testes:
     mvn clean install -DskipTests=true -Dgpg.skip=true
  1. Inclua no POM de seu projeto a dependência gerada pelo comando acima:
<dependency>
<groupId>com.github.wmixvideo</groupId>
<artifactId>nfe</artifactId>
<version>3.0.3-SNAPSHOT</version>
</dependency>
  • Onde <version>3.0.2-SNAPSHOT</version> é a versão atual do projeto definido no arquivo pom.xml

Como usar

Basicamente você precisará de uma implementação de NFeConfig (exemplificado abaixo), com informações de tipo de emissão, certificados digitais, e uma instância da WsFacade, essa classe tem a responsabilidade de fazer a ponte entre o seu sistema e a comunicação com os webservices da Sefaz.

// Exemplo de configuracao para acesso aos serviços da Sefaz.publicclassNFeConfigTesteextendsNFeConfig {
privateKeyStorekeyStoreCertificado = null;
privateKeyStorekeyStoreCadeia = null;
@OverridepublicNFUnidadeFederativagetCUF() {
returnNFUnidadeFederativa.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;
}
}

Configurar pelo repositório de certificados do Windows:

Carregando os alias disponíveis(certificados instalados) no Windows:

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.

Alguns exemplos

Considere para os exemplos abaixo que config seja uma instância da implementação da interface NFeConfig.

Status dos webservices

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):

107
Servico em operacao

Envio do lote para o sefaz

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);

Corrige nota

Faça a correção da nota através do facade:

finalNFEnviaEventoRetornoretorno = newWSFacade(config).corrigeNota(chaveDeAcessoDaNota, textoCorrecao, sequencialEventoDaNota);

Cancela nota

Faça o cancelamento da nota através do facade:

finalNFEnviaEventoRetornoretorno = newWSFacade(config).cancelaNota(chaveDeAcessoDaNota, protocoloDaNota, motivoCancelaamento);

Consulta nota por chave de acesso ou NSU

Faça a consulta da nota através do facade:

finalNFDistribuicaoIntRetornoretorno = newWSFacade(config).consultarDistribuicaoDFe(cnpj, uf, chaveAcesso, nsu, ultNsu);

Convertendo objetos Java em XML

Qualquer objeto que seja uma representação XML do documento NFe, pode ser obtido seu XML de forma fácil bastando chamar o método toString, 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();

Convertendo nota XML em Java

Existe uma classe que pode receber um File/String e converter para um objeto NFNota, faça da seguinte forma:

finalNFNotanota = newNotaParser().notaParaObjeto(xmlNota);

Ou para uma nota já processada:

finalNFNotaProcessadanotaProcessada = newNotaParser().notaProcessadaParaObjeto(xmlNota);

Armazenando notas autorizadas

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 tipo NFNotaProcessada 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 = newNotaParser().notaParaObjeto(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();

Funcionalidades

  • 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ços disponíveis

ServiçoStatus
Envio loteEstável
Consulta loteEstável
Consulta statusEstável
Consulta notaEstável
Download notaEstável
Corrige notaEstável
Cancela notaEstável
Inutiliza notaEstável
Consulta cadastroEstável
Manifestação de destinatárioEstável

Requisitos

JDK >= 1.8
Maven >= 3.x

Criação do Java KeyStore (JKS)

Para usar os serviços da nota fiscal são necessários dois certificados:

  1. O certificado do cliente que será utilizado para assinar as notas e comunicar com o fisco (fornecido por uma entidade certificadora);
  2. 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"), NFGeraCadeiaCertificados.geraCadeiaCertificados(NFAmbiente.PRODUCAO, "senha"));
FileUtils.writeByteArrayToFile(newFile("/tmp/homologacao.cacerts"), NFGeraCadeiaCertificados.geraCadeiaCertificados(NFAmbiente.HOMOLOGACAO, "senha"));
} catch (Exceptione) {
e.printStackTrace();
}
}

Licença

Apache 2.0

Dúvidas?

O projeto da NFe brasileira é relativamente complexo e propenso a dúvidas.
Portanto, em caso de dúvidas, use o nosso canal do Disqus.

About

Nota Fiscal Eletrônica em Java.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages