Gerador NFe 2.0 em Arquivo Texto

E ai pessoal tudo certo?

Bom desta vez eu estou criando um tópico não para ser ajudado, mas para ajudar, desenvolvi algo simples e gostaria de compartilhar com o pessoal, fiz um gerador de arquivo texto para NFe, a única coisa que será preciso fazer é fornecer as informações da nota e ele ira gerar a estrutura da NFe em uma String e a partir dessa String é só gravar o arquivo texto, esse gerador é da versão 2.0 da NFe, vou postar aqui o .jar e um exemplo de uso.

***NotaFiscal nf eh minha classe responsável pelo armazenamento dos dados da nota fiscal no banco

Para preencher corretamente os campos é aconselhavel que use o manual de integração do contribuinte a partir da página 107, disponivel no link abaixo:

http://www.fazenda.gov.br/confaz/confaz/Atos/Atos_Cotepe/2009/Manual_NFe_v401_2009-11-04.pdf

os campos das classe segue a Identificação encontrada neste manual por exemplo:

//02 é o ID do campo //Versao é o nome do campo a.setA02Versao("2.00");

Também é aconselhável que use Manual de layout TXT-NF-e v 2.0.0, para ir verificando os campos porque tem alguns campos que não devem ser informados no arquivo texto da nfe um exemplo é o A03 Id deve ser apenas informado no XML.

o Layout do txt esta no link abaixo:
http://www.emissornfehom.fazenda.sp.gov.br/v2/docs/[Emissor_NF-e]_Manual_de_layout_TXT-NF-e_v2.0.0.pdf

private void gerarCabecalho(){
        cabecalho = "NOTA FISCAL|"
                   +"QTDE DE NOTAS"
                   +System.getProperty ("line.separator");;
    }
private Nfe_Icms gerarTributacao(Tributacao tri, String origem, double vlrBcSt, double icmsSt){
        
        Nfe_Icms n = new Nfe_Icms();


        if (tri.getTriCodigo()==500){

            n.setN11Orig(origem);
            n.setN12ACSosn(String.valueOf(tri.getTriCodigo()));
            n.setN26Vbcstret(formatarDouble(vlrBcSt).replace(",", "."));
            n.setN27Vicmsstret(formatarDouble(icmsSt).replace(",", "."));

        }else if (tri.getTriCodigo()==300 || tri.getTriCodigo()==400){

            n.setN11Orig(origem);
            n.setN12ACSosn(String.valueOf(tri.getTriCodigo()));
        }

        return n;
    }
private void gerarCorpo(NotaFiscal nf){
        Nfe_Dados a = new Nfe_Dados();
        Nfe_Identificacao b = new Nfe_Identificacao();
        Nfe_IdentificacaoEmitente c = new Nfe_IdentificacaoEmitente();
        Nfe_IdentificacaoDestinario e = new Nfe_IdentificacaoDestinario();
        Nfe_ProdutosServicos i = new Nfe_ProdutosServicos();
        Nfe_Icms n = new Nfe_Icms();
        Nfe_Pis q = new Nfe_Pis();
        Nfe_Confins s = new Nfe_Confins();
        Nfe_Issqn u = new Nfe_Issqn();
        Nfe_ValoresTotais w = new Nfe_ValoresTotais();
        Nfe_InformacoesTransporte x = new Nfe_InformacoesTransporte();
        Nfe_InformacoesAdicionais z = new Nfe_InformacoesAdicionais();


        ConstruirTxt build = new ConstruirTxt();

        //GRUPO A


        a.setA02Versao("2.00");
        a.setA03Id("NFe");
        corpo += build.NfeDados(a);


        //GRUPO B


        b.setB02Cuf("35");
        
        b.setB04Natop(nf.getNfNatureza());
        b.setB11Tpnf(nf.getNfTipoDocumento().toString());
        b.setB05Indpag(nf.getNfFormaPagto().toString());


        b.setB06Mod("55");
        b.setB07Serie("1");
        b.setB08Nnf(String.valueOf(nf.getNfCodigo()));
        if (nf.getNfDtemissao()!=null)
            b.setB09Demi(new SimpleDateFormat("yyyy-MM-dd").format(nf.getNfDtemissao()));
        if (nf.getNfDtsaida()!=null)
            b.setB10Dsaient(new SimpleDateFormat("yyyy-MM-dd").format(nf.getNfDtsaida()));
        b.setB12Cmunfg("3541406");
        b.setB21Tpimp("1");
        b.setB22Tpemis("1");
        b.setB24Tpamb("1");
        b.setB25Finnfe("1");
        b.setB26Procemi("3");

        corpo += build.NfeIdentificacao(b);


        //GRUPO C


        c.setC02Cnpj("00000000000000");
        c.setC17Ie("00000000000");
        c.setC19Im("00000");
        c.setC20Cnae("0000000");
        c.setC03Xnome("NOME DA EMPRESA");
        c.setC06Xlgr("RUA PEDRO DE OLIVEIRA COSTA");
        c.setC07Nro("000");
        c.setC09Bairro("CENTRO");
        c.setC10Cmun("1234569");
        c.setC11Xmun("MUNICIPIO");
        c.setC12Uf("SP");
        c.setC13Cep("000000000");
        c.setC14Cpais("1058");
        c.setC15Xpais("BRASIL");
        c.setC21Crt("1");

        corpo += build.NfeIdentificacaoEmitente(c);

        Cidades cid;

        //GRUPO E

        
        e.setE04Xnome(nf.getNfNomecliente());

        if (nf.getNfTipopessoa()=='J'){
            e.setE02Cnpj(nf.getNfDocumento());
        }else{
            e.setE03Cpf(nf.getNfDocumento());
        }
        
        cid = (Cidades) sessao.get(Cidades.class, nf.getCidadesByCidCliente().getCidCodigo());
        Estados uf = (Estados) sessao.get(Estados.class, cid.getEstados().getEstCodigo());
        e.setE06Xlgr(nf.getNfEndereco());
        e.setE07Nro(String.valueOf(nf.getNfNumero()));
        e.setE09Xbairro(nf.getNfBairro());
        e.setE10Cmun(String.valueOf(cid.getCidCodigo()));
        e.setE11Xmun(cid.getCidDescricao());
        e.setE12Uf(uf.getEstSigla());
        e.setE14Cpais("1058");
        e.setE15Xpais("BRASIL");
        if (nf.getNfIsento()!='S')
            e.setE17Ie(nf.getNfIe());

        corpo += build.NfeIdentificacaoDestinario(e);

        int nItem = 1;

        Produtos prod = null;
        Tributacao tri = null;
        double totIcmsSt = 0;
        double totBcSt = 0;
        double totProd = 0;
        double totDesc = 0;
        double totBc = 0;
        double totIcms = 0;
        double totIss = 0;
        double totBcServico = 0;
        double totIpi = 0;
        double totServ = 0;


        String hql = "from ProdutosNotaFiscal where id.nfCodigo = "+nf.getNfCodigo();
        List list = ManipularHQL.executeHQLQuery(hql,sessao);
        sessao = HibernateUtil.getSessionFactory().openSession();
        sessao.beginTransaction();
        for (Object obj : list){
            ProdutosNotaFiscal pnf = (ProdutosNotaFiscal)obj;
            prod = (Produtos) sessao.get(Produtos.class, pnf.getProdutos().getProCodigo());


            //GRUPO H


            i.setH02Nitem(String.valueOf(nItem++));


            //GRUPO I

            double desconto = 0;

            if (nf.getNfDescontosProdutos()!=null)
                desconto = nf.getNfDescontosProdutos();

            i.setI02Cprod(String.valueOf(prod.getProCodigo()));
            i.setI03Cean(prod.getProEan().replace("-", ""));
            i.setI04Xprod(prod.getProDescricao());
            i.setI05Ncm(prod.getProNbm());
            i.setI08Cfop(nf.getNfCfop().toString());
            i.setI09Ucom(prod.getProUnidcomercial());
            i.setI10Qcom(formatarDouble(pnf.getPnfQtde()).replace(",", ".")+"00");
            i.setI10aVuncom(formatarDouble(pnf.getPnfVlr()).replace(",", ".")+"00");
            i.setI11Vprod(formatarDouble((pnf.getPnfQtde() * pnf.getPnfVlr() )).replace(",", "."));
            i.setI12Ceantrib(prod.getProEan().replace("-", ""));
            i.setI13Utrib(prod.getProUnidcomercial());
            i.setI14Qtrib(formatarDouble(pnf.getPnfQtde()).replace(",", ".")+"00");
            i.setI14aVuntrib(formatarDouble(pnf.getPnfVlr()).replace(",", ".")+"00");
//            i.setI17Vdesc(formatarDouble(desconto).replace(",", ".")+"00");
            i.setI17bIndtot("1");

            corpo += build.NfeProdutosServicos(i);


            //GRUPO N


            tri = pnf.getTributacao();

            double bcSt = 0;
            double icmsSt = 0;

            if (pnf.getPnfBcst()!=null){
                bcSt = pnf.getPnfBcst();
            }

            if (pnf.getPnfIcmsst()!=null){
                icmsSt = pnf.getPnfIcmsst();
            }

            n = gerarTributacao2(tri, pnf.getPnfOrigem().toString(), bcSt, icmsSt);

            corpo += build.NfeIcms(n);

            totBcSt += bcSt;
            totIcmsSt += icmsSt;
            totProd += pnf.getPnfQtde()*pnf.getPnfVlr();
            totDesc = desconto;


            //GRUPO Q


            q.setQ06Cst("99");
            q.setQ07Vbc("0.00");
            q.setQ08Ppis("0.00");
            q.setQ10Qbcprod("0.00");
            q.setQ11Valiqprod("0.00");
            q.setQ09Vpis("0.00");

            corpo += build.NfePis(q);

            //LINHA S


            s.setS06Cst("99");
            s.setS07Vbc("0.00");
            s.setS08Pconfins("0.00");
            s.setS09Qbcprod("0.00");
            s.setS10Valiqprod("0.00");
            s.setS11Vconfins("0.00");


            corpo += build.NfeConfins(s);
        }
//            totProd += totIcmsSt;

            hql = "from ServicosNotaFiscal where id.nfCodigo = "+nf.getNfCodigo();
            list = ManipularHQL.executeHQLQuery(hql,sessao);
            sessao = HibernateUtil.getSessionFactory().openSession();
            sessao.beginTransaction();
            for (Object obj : list){
                ServicosNotaFiscal snf = (ServicosNotaFiscal)obj;
                Servicos ser = (Servicos) sessao.get(Servicos.class, snf.getServicos().getSerCodigo());


                //GRUPO H


                i.setH02Nitem(String.valueOf(nItem++));


                //GRUPO I

                double desconto = 0;

                if (nf.getNfDescontosServicos()!=null)
                    desconto = nf.getNfDescontosProdutos();

                i.setI02Cprod(String.valueOf(ser.getSerCodigo()));
                i.setI04Xprod(ser.getSerDescricao());
                i.setI05Ncm("99");
                i.setI08Cfop(nf.getNfCfop().toString());
                i.setI09Ucom("SERVIC");
                i.setI10Qcom("1.0000");
                i.setI10aVuncom(formatarDouble(snf.getSnfVlr()).replace(",", ".")+"00");
                i.setI11Vprod(formatarDouble(snf.getSnfVlr()).replace(",", "."));
                i.setI13Utrib("SERVIC");
                i.setI14Qtrib("1.0000");
                i.setI14aVuntrib(formatarDouble(snf.getSnfVlr()).replace(",", ".")+"00");
                i.setI17bIndtot("1");
                
                corpo += build.NfeProdutosServicos(i);


                //GRUPO U

                double bc = 0;
                double aliquota = 0;
                double iss = 0;

                if (snf.getSnfBc()!=null){
                    bc = snf.getSnfBc();
                }

                if (snf.getSnfAliquota()!=null){
                    aliquota = snf.getSnfAliquota();
                }

                if (snf.getSnfIssqn()!=null){
                    iss = snf.getSnfIssqn();
                }

                u.setU02Vbc(formatarDouble(bc).replace(",", "."));
                u.setU03Valiq(formatarDouble(aliquota).replace(",", "."));
                u.setU04Vissqn(formatarDouble(iss).replace(",", "."));
                u.setU05Cmunfg(String.valueOf(snf.getCidades().getCidCodigo()));
                u.setU06Clistserv(snf.getSnfListaservico().toString());
                u.setU07Csittrib(snf.getSnfTributacao().toString());

                corpo += build.NfeIssqn(u);
                
                totIss += iss;
                totBcServico += bc;
                totServ += snf.getSnfVlr();
                totDesc = desconto;

                //GRUPO Q


                q.setQ06Cst("99");
                q.setQ07Vbc("0.00");
                q.setQ08Ppis("0.00");
                q.setQ10Qbcprod("0.00");
                q.setQ11Valiqprod("0.00");
                q.setQ09Vpis("0.00");

                corpo += build.NfePis(q);

                //LINHA S


                s.setS06Cst("99");
                s.setS07Vbc("0.00");
                s.setS08Pconfins("0.00");
                s.setS09Qbcprod("0.00");
                s.setS10Valiqprod("0.00");
                s.setS11Vconfins("0.00");


                corpo += build.NfeConfins(s);
            }


        //GRUPO W


        w.setW03Vbc(formatarDouble(totBc).replace(",", "."));
        w.setW04Vicms(formatarDouble(totIcms).replace(",", "."));
        w.setW05Vbcst(formatarDouble(totBcSt).replace(",", "."));
        w.setW06Vst(formatarDouble(totIcmsSt).replace(",", "."));
        w.setW07Vprod(formatarDouble(totProd).replace(",", "."));
        w.setW10Vdesc(formatarDouble(totDesc).replace(",", "."));
        w.setW16Vnf(formatarDouble(totProd+totServ-totDesc).replace(",", "."));

        if (totIss>0){
            w.setW18Vserv(formatarDouble(totServ).replace(",", "."));
            w.setW19Vbc(formatarDouble(totBcServico).replace(",", "."));
            w.setW20Viss(formatarDouble(totIss).replace(",", "."));
            w.setW21Vpis("0.00");
            w.setW22Vconfins("0.00");
        }

        corpo += build.NfeValoresTotais(w);

        //GRUPO X


        x.setX02Modfrete(nf.getNfModalidadefrete().toString());
        
        if (nf.getNfTransTipopessoa()=='F'){
            x.setX05Cpf(nf.getNfTransDocumento());
        }else{
            x.setX04Cnpj(nf.getNfTransDocumento());
        }
        x.setX06Xnome(nf.getNfTransportador());

        String endereco = "";
        if (nf.getNfTransEndereco()!=null && !nf.getNfTransEndereco().isEmpty()){
            endereco = String.valueOf(nf.getNfTransEndereco());
            
            if (nf.getNfTransNumero()!=null){
                endereco += ", "+String.valueOf(nf.getNfTransNumero());
            }
            if (nf.getNfTransBairro()!=null && !nf.getNfTransBairro().isEmpty()){
                endereco += ", "+nf.getNfTransBairro();
            }
        }
        String cidade = "";
        String estado = "";
        if (nf.getCidadesByCidTransporte()!=null){
            cidade = String.valueOf(nf.getCidadesByCidTransporte().getCidDescricao());
            estado = nf.getCidadesByCidTransporte().getEstados().getEstSigla();
        }

        x.setX08Xender(endereco);
        x.setX09Xmun(cidade);
        x.setX10Uf(estado);

        corpo += build.NfeInformacoesTransporte(x);


        //GRUPO Z


        z.setZ03Infcpl("DOCUMENTO EMITIDO POR ME OU EPP OPTANTE PELO SIMPLES NACIONAL,NÃO GERA DIREITO A CRÉDITO FISCAL DE IPI.");
        corpo += build.NfeInformacoesAdicionais(z);

    }

Muito bom Vinny!

Eu estou envolvindo com NF-SE (nota fiscal de serviço).

Excelente essa sua contribuição, eu precisei fazer mas como na época eu tinha urgência urgentíssima não tive tempo de criar esse processo, acabei gerando um XML (com um certificado “falso”) e o usuário autentica no Emissor do SEFAZ, agora vou ver como posso utilizar sua idéia.

Muito obrigado.

Obrigado, qualquer dúvida sobre como usar é só postar aqui!

Estou usando a sua biblioteca porem o registro B (Dados da Nota) não está gerando os campos B03 e B05 mesmo que eu os preencha, tens o fonte disponível em algum repositório?