Nota Fiscal Eletrônica em Java.
Comunicador de nota fiscal e nota fiscal do consumidor da fazenda.
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.
Possuímos um grupo de WhatsApp para discussões sobre o desenvolvimento da lib: https://chat.whatsapp.com/LFmqpkoiIYc6Zy3d4TnZGU
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.
com.github.wmixvideo
nfe
${latest.release}
Para acessar a lista de versões disponíveis, acesse a página de release aqui no github.
git clone https://github.com/wmixvideo/nfe
mvn clean installBasicamente 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.
…KeyStore keyStoreCert = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keyStoreCert.load(null, null);
Enumeration 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((>=Java8), e então fazer o load com a respectivo alias escolhido e sua senha.
Considere para os exemplos abaixo que config seja uma instância da implementação da interface NFeConfig.
NFStatusServicoConsultaRetorno retorno = new WSFacade(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 operacaoPopule os dados do lote a ser enviado para o Sefaz:
NFLoteEnvio lote = new NFLoteEnvio();
// setando os dados do loteFaça o envio do lote através do facade:
final NFLoteEnvioRetorno retorno = new WSFacade(config).enviaLote(lote);Faça a correção da nota através do facade:
final NFEnviaEventoRetorno retorno = new WSFacade(config).corrigeNota(chaveDeAcessoDaNota, textoCorrecao, sequencialEventoDaNota);Faça o cancelamento da nota através do facade:
final NFCancelamentoRetornoDados retorno = new WSFacade(config).cancelaNota(chaveDeAcessoDaNota, protocoloDaNota, motivoCancelaamento);Faça a consulta da nota através do facade:
final NFDistribuicaoIntRetorno retorno = new WSFacade(config).consultarDistribuicaoDFe(cnpj, uf, chaveAcesso, nsu, ultNsu);Faça a consulta do CTe através do CTDistribuicaoInt:
final CTDistribuicaoInt distDFeInt = new CTDistribuicaoInt();
distDFeInt.setVersao("1.00");
distDFeInt.setAmbiente(isTeste() ? DFAmbiente.HOMOLOGACAO : DFAmbiente.PRODUCAO);
distDFeInt.setUnidadeFederativaAutor(DFUnidadeFederativa.valueOf("SC"));
distDFeInt.setCnpj("60436332000145");
distDFeInt.setDistribuicao(new CTDistribuicaoNSU().setUltimoNSU("000000000036552");
final String retornoConsulta = WSDistribuicaoCTe.consultar(distDFeInt, new NFeConfig());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
NFLoteEnvio lote = new NFLoteEnvio();
// setando os dados do lote
...
// Obtendo o xml do objeto
String xmlGerado = lote.toString();Existe uma classe que pode receber um File/String e converter para um objeto NFNota, faça da seguinte forma:
final NFNota nota = new DFPersister().read(NFNota.class, xmlNota);
final NFNotaProcessada notaProcessada = new DFPersister().read(NFNotaProcessada.class, xmlNotaProcessada);Ou desabilitando o modo estrito (habilitado por padrão):
final NFNota nota = new DFPersister(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:
final List 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:
…| 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:
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:
public static void main(String args[]){
try {
FileUtils.writeByteArrayToFile(new File("/tmp/producao.cacerts"), DFCadeiaCertificados.geraCadeiaCertificados(DFAmbiente.PRODUCAO, "senha"));
FileUtils.writeByteArrayToFile(new File("/tmp/homologacao.cacerts"), DFCadeiaCertificados.geraCadeiaCertificados(DFAmbiente.HOMOLOGACAO, "senha"));
} catch (Exception e) {
e.printStackTrace();
}
}No open issues yet, or sync has not completed.