private List<Dados54> getDados54() {
    List<Dados54> ld54 = new ArrayList<>();
    for (EcfNotaEletronica nfe : nfes) {
      try {
        if (nfe.getEcfNotaEletronicaStatus().equals(ENotaStatus.AUTORIZADO.toString())
            || nfe.getEcfNotaEletronicaStatus().equals(ENotaStatus.CANCELADO.toString())) {
          // pega a NFe
          String xml = nfe.getEcfNotaEletronicaXml();
          int I = xml.indexOf("<infNFe");
          int F = xml.indexOf("</NFe>") + 6;
          String texto = "<NFe xmlns=\"http://www.portalfiscal.inf.br/nfe\">" + xml.substring(I, F);
          TNFe tnfe = NFe.xmlToObj(texto, TNFe.class);

          for (TNFe.InfNFe.Det det : tnfe.getInfNFe().getDet()) {
            // encontro o produto
            IFiltro filtro;
            if (det.getProd().getCEAN().equals("")) {
              filtro = new FiltroNumero("prodProdutoId", ECompara.IGUAL, det.getProd().getCProd());
            } else {
              filtro = new FiltroTexto("prodProdutoBarra", ECompara.IGUAL, det.getProd().getCEAN());
            }
            ProdProduto prod = (ProdProduto) service.selecionar(new ProdProduto(), filtro);

            Dados54 d54 = new Dados54();
            d54.setCnpj(nfe.getSisCliente().getSisClienteDoc());
            d54.setModelo(55);
            d54.setSerie(Util.getConfig().get("nfe.serie"));
            d54.setNumero(nfe.getEcfNotaEletronicaNumero());
            d54.setCfop(Integer.valueOf(det.getProd().getCFOP()));
            if (prod.getProdProdutoCstCson().length() == 3) {
              d54.setCst(prod.getProdProdutoCstCson());
            } else {
              d54.setCst(prod.getProdProdutoOrigem() + prod.getProdProdutoCstCson());
            }
            d54.setNumero(Integer.valueOf(det.getNItem()));
            d54.setCodigo(prod.getId() + "");
            d54.setQtd(Double.valueOf(det.getProd().getQCom()));
            d54.setValor(Double.valueOf(det.getProd().getVProd()));
            double desc =
                det.getProd().getVDesc() == null ? 0.00 : Double.valueOf(det.getProd().getVDesc());
            d54.setDesconto(desc);
            d54.setBase_icms(prod.getProdProdutoIcms() > 0 ? d54.getValor() : 0.00);
            d54.setBase_icmsST(0.00);
            d54.setValor_ipi(0.00);
            d54.setAliq_icms(prod.getProdProdutoIcms());

            Util.normaliza(d54);
            ld54.add(d54);
          }
        }
      } catch (Exception ex) {
        continue;
      }
    }

    return ld54;
  }
  private List<Dados74> getDados74() {
    List<Dados74> ld74 = new ArrayList<>();

    for (ProdProduto prod : estoque) {
      Dados74 d74 = new Dados74();
      d74.setData(fim);
      d74.setCodigo(prod.getId() + "");
      d74.setQtd(prod.getProdProdutoEstoque());
      d74.setValor(prod.getProdProdutoPreco());
      d74.setPosse("1");
      d74.setCnpj(emp.getSisEmpresaCnpj());
      d74.setIe(emp.getSisEmpresaIe());
      d74.setUf(emp.getSisMunicipio().getSisEstado().getSisEstadoSigla());

      Util.normaliza(d74);
      ld74.add(d74);
    }

    return ld74;
  }
 /**
  * Costrutor informando os dados do produto e quantidade.
  *
  * @param produto referencia para o produto selecionado.
  * @param quantidade a quantidade total vendida.
  */
 public EcfVendaProduto(ProdProduto produto, Double quantidade, String barra) {
   this(0);
   this.prodProduto = produto;
   this.prodEmbalagem = produto.getProdEmbalagem();
   this.ecfVendaProdutoBarra = barra;
   this.ecfVendaProdutoCstCson = produto.getProdProdutoCstCson();
   this.ecfVendaProdutoTributacao = produto.getProdProdutoTributacao();
   this.ecfVendaProdutoIcms = produto.getProdProdutoIcms();
   this.ecfVendaProdutoIssqn = produto.getProdProdutoIssqn();
   this.ecfVendaProdutoQuantidade = quantidade;
   this.ecfVendaProdutoBruto = produto.getProdProdutoPreco();
   this.ecfVendaProdutoDesconto = 0.00;
   this.ecfVendaProdutoAcrescimo = 0.00;
   this.ecfVendaProdutoLiquido = produto.getProdProdutoPreco();
   this.ecfVendaProdutoTotal = quantidade * produto.getProdProdutoPreco();
 }
  private List<Dados75> getDados75() {
    List<Dados75> ld75 = new ArrayList<>();

    for (ProdProduto prod : estoque) {
      Dados75 d75 = new Dados75();
      d75.setInicio(inicio);
      d75.setFim(fim);
      d75.setCodigo(prod.getId() + "");
      d75.setNcm(prod.getProdProdutoNcm());
      d75.setDescricao(prod.getProdProdutoDescricao());
      d75.setUnd(prod.getProdEmbalagem().getProdEmbalagemNome());
      d75.setAliq_ipi(0.00);
      d75.setAliq_icms(prod.getProdProdutoIcms());
      d75.setReducao(0.00);
      d75.setBase_icmsST(0.00);

      Util.normaliza(d75);
      ld75.add(d75);
    }

    return ld75;
  }
 public String getEcfVendaProdutoCodigo() {
   return ecfVendaProdutoBarra == null || ecfVendaProdutoBarra.equals("")
       ? Util.formataNumero(prodProduto.getProdProdutoId(), 6, 0, false)
       : ecfVendaProdutoBarra;
 }
  @Override
  public void executar() throws OpenPdvException {
    // ajustando a data fim para documento, pois o mesmo usa datetime
    Calendar cal = Calendar.getInstance();
    cal.setTime(fim);
    cal.add(Calendar.DAY_OF_MONTH, 1);
    fim = cal.getTime();

    // recupera as nfes emitidas no periodo
    FiltroData fd1 = new FiltroData("ecfNotaEletronicaData", ECompara.MAIOR_IGUAL, inicio);
    FiltroData fd2 = new FiltroData("ecfNotaEletronicaData", ECompara.MENOR, fim);
    GrupoFiltro gp1 = new GrupoFiltro(EJuncao.E, new IFiltro[] {fd1, fd2});
    EcfNotaEletronica ene = new EcfNotaEletronica();
    ene.setOrdemDirecao(EDirecao.ASC);
    nfes = service.selecionar(ene, 0, 0, gp1);

    // recupera as notas emitidas no periodo
    FiltroData fd3 = new FiltroData("ecfNotaData", ECompara.MAIOR_IGUAL, inicio);
    FiltroData fd4 = new FiltroData("ecfNotaData", ECompara.MENOR, fim);
    GrupoFiltro gp2 = new GrupoFiltro(EJuncao.E, new IFiltro[] {fd3, fd4});
    EcfNota en = new EcfNota();
    en.setOrdemDirecao(EDirecao.ASC);
    notas = service.selecionar(en, 0, 0, gp2);

    // recupera as leituras Z no periodo
    FiltroData fd7 = new FiltroData("ecfZMovimento", ECompara.MAIOR_IGUAL, inicio);
    FiltroData fd8 = new FiltroData("ecfZMovimento", ECompara.MENOR, fim);
    GrupoFiltro gf4 = new GrupoFiltro(EJuncao.E, new IFiltro[] {fd7, fd8});
    EcfZ ez = new EcfZ();
    ez.setOrdemDirecao(EDirecao.ASC);
    zs = service.selecionar(ez, 0, 0, gf4);

    // recupera os produtos com estoque maior que zero
    FiltroNumero fn = new FiltroNumero("prodProdutoEstoque", ECompara.DIFERENTE, 0);
    ProdProduto pp = new ProdProduto();
    pp.setCampoOrdem("prodProdutoId");
    estoque = service.selecionar(pp, 0, 0, fn);

    Sintegra sintegra = new Sintegra();
    // Dados 10
    sintegra.setDados10(getDados10());
    // Dados 11
    sintegra.setDados11(getDados11());
    // Dados 50
    sintegra.setDados50(getDados50());
    // Dados 54
    sintegra.setDados54(getDados54());
    // Dados 60M
    sintegra.setDados60M(getDados60M());
    // Dados 60R
    sintegra.setDados60R(getDados60R());
    // Dados 61
    sintegra.setDados61(getDados61());
    // Dados 61R
    sintegra.setDados61R(getDados61R());
    // Dados 74
    sintegra.setDados74(getDados74());
    // Dados 75
    sintegra.setDados75(getDados75());
    // Dados 90 e gerado internamento pelo PAF

    try {
      // gerar o arquivo
      path = PAF.gerarVendasPeriodo(sintegra);
    } catch (Exception ex) {
      throw new OpenPdvException(ex);
    }
  }