private List<Dados61R> getDados61R() {
    List<Dados61R> ld61r = new ArrayList<>();

    // agrupando as notas por mes+ano+id do produto
    Map<String, List<EcfNotaProduto>> mensal = new HashMap<>();
    for (EcfNota nota : notas) {
      String mesAno = Util.formataData(nota.getEcfNotaData(), "MMyyyy");
      for (EcfNotaProduto np : nota.getEcfNotaProdutos()) {
        String chave = mesAno + "-" + np.getProdProduto().getId();
        List<EcfNotaProduto> lista = mensal.get(chave);
        if (lista == null) {
          lista = new ArrayList<>();
          lista.add(np);
          mensal.put(chave, lista);
        } else {
          lista.add(np);
        }
      }
    }

    // gerando os valores do mes/ano por produto
    for (Entry<String, List<EcfNotaProduto>> entry : mensal.entrySet()) {
      double qtd = 0.00;
      double bruto = 0.00;
      char trib = 0;
      double aliq = 0.00;

      // soma os valores
      for (EcfNotaProduto np : entry.getValue()) {
        qtd += np.getEcfNotaProdutoQuantidade();
        bruto += np.getEcfNotaProdutoBruto();
        trib = np.getProdProduto().getProdProdutoTributacao();
        aliq = np.getProdProduto().getProdProdutoIcms();
      }

      Dados61R d61r = new Dados61R();
      d61r.setMesAno(Integer.valueOf(entry.getKey().substring(0, 6)));
      d61r.setCodigo(entry.getKey() + "");
      d61r.setQtd(qtd);
      d61r.setBruto(bruto);
      if (trib == 'T') {
        d61r.setBase_icms(bruto);
        d61r.setAliq_icms(aliq);
      }

      Util.normaliza(d61r);
      ld61r.add(d61r);
    }

    return ld61r;
  }
  private List<Dados61> getDados61() {
    List<Dados61> ld61 = new ArrayList<>();

    // agrupando as notas por dia+serie+subserie
    Map<String, List<EcfNota>> grupo = new HashMap<>();
    for (EcfNota nota : notas) {
      String chave =
          Util.formataData(nota.getEcfNotaData(), "ddMMyyyy")
              + nota.getEcfNotaSerie()
              + nota.getEcfNotaSubserie();
      List<EcfNota> lista = grupo.get(chave);
      if (lista == null) {
        lista = new ArrayList<>();
        lista.add(nota);
        grupo.put(chave, lista);
      } else {
        lista.add(nota);
      }
    }

    // soma os valores agrupados
    for (Entry<String, List<EcfNota>> entry : grupo.entrySet()) {
      Dados61 d61 = new Dados61();

      for (EcfNota nota : entry.getValue()) {
        d61.setData(nota.getEcfNotaData());
        d61.setModelo(2);
        d61.setSerie(nota.getEcfNotaSerie());
        d61.setSubserie(nota.getEcfNotaSubserie());
        if (nota.getEcfNotaNumero() < d61.getNumInicial()) {
          d61.setNumInicial(nota.getEcfNotaNumero());
        }
        if (nota.getEcfNotaNumero() > d61.getNumFinal()) {
          d61.setNumFinal(nota.getEcfNotaNumero());
        }
        if (!nota.isEcfNotaCancelada()) {
          d61.setValorTotal(d61.getValorTotal() + nota.getEcfNotaLiquido());
          double base_icms = 0.00;
          double valor_icms = 0.00;
          double isento = 0.00;
          double aliq = 0.00;
          for (EcfNotaProduto np : nota.getEcfNotaProdutos()) {
            if (np.getProdProduto().getProdProdutoTributacao() == 'T') {
              base_icms += np.getEcfNotaProdutoLiquido();
              valor_icms +=
                  (np.getEcfNotaProdutoLiquido() * np.getProdProduto().getProdProdutoIcms() / 100);
              aliq = np.getProdProduto().getProdProdutoIcms();
            } else if (np.getProdProduto().getProdProdutoTributacao() == 'I'
                || np.getProdProduto().getProdProdutoTributacao() == 'N') {
              isento += np.getEcfNotaProdutoLiquido();
            }
          }
          d61.setBase_icms(base_icms);
          d61.setValor_icms(valor_icms);
          d61.setValor_isento(isento);
          d61.setOutras(0.00);
          d61.setAliq_icms(aliq);
        }
      }

      Util.normaliza(d61);
      ld61.add(d61);
    }

    return ld61;
  }