SkillAgentSearch skills...

Nfe

Nota Fiscal Eletrônica em Java.

Install / Use

/learn @wmixvideo/Nfe
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Nota Fiscal Eletrônica

Comunicador de nota fiscal e nota fiscal do consumidor da fazenda.<br/> Java CI Coverage Status Maven Central Apache 2.0 License

Atenção

Este é um projeto colaborativo, sinta-se à vontade em usar e colaborar com o mesmo.<br/>

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 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>${latest.release}</version>
</dependency>

Para acessar a lista de versões disponíveis, acesse a página de release aqui no github.

Diretamente pelo código fonte (última versão em desenvolvimento)

   git clone https://github.com/wmixvideo/nfe
   mvn clean install

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.
public class NFeConfigTeste extends NFeConfig {

    private KeyStore keyStoreCertificado = null;
    private KeyStore keyStoreCadeia = null;

    @Override
    public DFUnidadeFederativa getCUF() {
        return DFUnidadeFederativa.SC;
    }

    @Override
    public String getCertificadoSenha() {
        return "senha_certificado";
    }

    @Override
    public String getCadeiaCertificadosSenha() {
        return "senha_cadeia";
    }

    @Override
    public KeyStore getCertificadoKeyStore() throws KeyStoreException {
        if (this.keyStoreCertificado == null) {
            this.keyStoreCertificado = KeyStore.getInstance("PKCS12");
            try (InputStream certificadoStream = new FileInputStream("/tmp/certificado.pfx")) {
                this.keyStoreCertificado.load(certificadoStream, this.getCertificadoSenha().toCharArray());
            } catch (CertificateException | NoSuchAlgorithmException | IOException e) {
                this.keyStoreCadeia = null;
                throw new KeyStoreException("Nao foi possibel montar o KeyStore com a cadeia de certificados", e);
            }
        }
        return this.keyStoreCertificado;
    }

    @Override
    public KeyStore getCadeiaCertificadosKeyStore() throws KeyStoreException {
        if (this.keyStoreCadeia == null) {
            this.keyStoreCadeia = KeyStore.getInstance("JKS");
            try (InputStream cadeia = new FileInputStream("/tmp/cadeia.jks")) {
                this.keyStoreCadeia.load(cadeia, this.getCadeiaCertificadosSenha().toCharArray());
            } catch (CertificateException | NoSuchAlgorithmException | IOException e) {
                this.keyStoreCadeia = null;
                throw new KeyStoreException("Nao foi possibel montar o KeyStore com o certificado", e);
            }
        }
        return this.keyStoreCadeia;
    }
}

Configurar pelo repositório de certificados do Windows:

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

KeyStore keyStoreCert = 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<String>(>=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

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 operacao

Envio do lote para o sefaz

Popule os dados do lote a ser enviado para o Sefaz:

NFLoteEnvio lote = new NFLoteEnvio();
// setando os dados do lote

Faça o envio do lote através do facade:

final NFLoteEnvioRetorno retorno = new WSFacade(config).enviaLote(lote);

Corrige nota

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

final NFEnviaEventoRetorno retorno = new WSFacade(config).corrigeNota(chaveDeAcessoDaNota, textoCorrecao, sequencialEventoDaNota);

Cancela nota

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

final NFCancelamentoRetornoDados retorno = new WSFacade(config).cancelaNota(chaveDeAcessoDaNota, protocoloDaNota, motivoCancelaamento);

Consulta nota por chave de acesso ou NSU

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

final NFDistribuicaoIntRetorno retorno = new WSFacade(config).consultarDistribuicaoDFe(cnpj, uf, chaveAcesso, nsu, ultNsu);

Consulta CTe

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

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

NFLoteEnvio lote = new NFLoteEnvio();
// setando os dados do lote
...

// Obtendo o xml do objeto
String xmlGerado = 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:

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

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:

final List<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 armazenado
final String xmlNotaRecuperada;
// Assine a nota
final String xmlNotaRecuperadaAssinada = new AssinaturaDigital(config).assinarDocumento(xmlNotaRecuperada);
// Converta para objeto java
final NFNota notaRecuperadaAssinada = new DFPersister().read(NFNota.class, xmlNotaRecuperadaAssinada);
// Crie o objeto NFNotaProcessada
final NFNotaProcessada notaProcessada = new NFNotaProcessada();
notaProcessada.setVersao(new BigDecimal(NFeConfig.VERSAO_NFE));
notaProcessada.setProtocolo(protocolo);
notaProcessada.setNota(notaRecuperadaAssinada);
// Obtenha o xml da nota com protocolo
String xmlNotaProcessadaPeloSefaz = 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ç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 |

Requisitos

JDK >= 1.8<br> 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 (forneci

Related Skills

View on GitHub
GitHub Stars747
CategoryDevelopment
Updated3d ago
Forks404

Languages

Java

Security Score

100/100

Audited on Mar 27, 2026

No findings