/**
   * < <Descrição do método>>
   *
   * @param bairros Description of the Parameter
   * @param bairroParametros Description of the Parameter
   * @return Descrição do retorno
   * @exception RelatorioVazioException Descrição da exceção
   */
  @SuppressWarnings("unchecked")
  public Object executar() throws TarefaException {

    // valor de retorno
    byte[] retorno = null;

    // ------------------------------------
    //		Integer idFuncionalidadeIniciada = this.getIdFuncionalidadeIniciada();
    // ------------------------------------

    Collection<Integer> idsClientes = (Collection<Integer>) getParametro("idsClientes");
    Cliente clienteInformado = (Cliente) getParametro("clienteInformado");
    Usuario usuarioLogado = (Usuario) getParametro("usuarioLogado");

    int tipoFormatoRelatorio = (Integer) getParametro("tipoFormatoRelatorio");

    // coleção de beans do relatório
    List relatorioBeans = new ArrayList();

    Fachada fachada = Fachada.getInstancia();

    Collection<RelatorioCertidaoNegativaClienteBean> colecao =
        fachada.pesquisarRelatorioCertidaoNegativaCliente(idsClientes, clienteInformado);

    // se a coleção de parâmetros da analise não for vazia
    if (colecao != null && !colecao.isEmpty()) {
      // adiciona o bean a coleção
      relatorioBeans.addAll(colecao);
    }
    // __________________________________________________________________

    // Parâmetros do relatório
    Map parametros = new HashMap();

    // adiciona os parâmetros do relatório
    // adiciona o laudo da análise

    SistemaParametro sistemaParametro = fachada.pesquisarParametrosDoSistema();

    Date dataAtual = new Date();

    parametros.put("imagem", sistemaParametro.getImagemRelatorio());

    String nomeRelatorio = ConstantesRelatorios.RELATORIO_CERTIDAO_NEGATIVA_CLIENTE;

    if (sistemaParametro
        .getCodigoEmpresaFebraban()
        .equals(SistemaParametro.CODIGO_EMPRESA_FEBRABAN_CAEMA)) {

      parametros.put(
          "textoCertidaoNegativa",
          "Pelo presente instrumento certificamos, para fins de direito, que revendo os nossos controles, não encontramos débitos referente(s) ao(s) imóvel(eis) acima especificado(s) até a presente data: "
              + Util.formatarData(dataAtual)
              + ".");

      parametros.put(
          "validade",
          "IMPORTANTE: Qualquer rasura tornará nulo o efeito desta certidão, que tem validade de 60 dias.");
      parametros.put("atendente", usuarioLogado.getNomeUsuario());
      parametros.put("nomeEmpresa", "COMPANHIA DE SANEAMENTO AMBIENTAL DO MARANHÃO");
      parametros.put("cnpjEmpresa", Util.formatarCnpj(sistemaParametro.getCnpjEmpresa()));
      parametros.put(
          "inscricaoEstadual",
          Util.formatarInscricaoEstadualCaema(sistemaParametro.getInscricaoEstadual()));
      parametros.put("nomeRelatorio", "CERTIDÃO NEGATIVA DE DÉBITOS POR CLIENTE");
      nomeRelatorio = ConstantesRelatorios.RELATORIO_CERTIDAO_NEGATIVA_CLIENTE_CAEMA;

    } else {

      parametros.put(
          "textoCertidaoNegativa",
          "Pelo presente instrumento certificamos, para fins de direito, que revendo os nossos controles, não encontramos débitos referente(s) ao(s) imóvel(eis) acima especificado(s) até a presente data: "
              + Util.formatarData(dataAtual)
              + ".");

      parametros.put(
          "validade",
          "IMPORTANTE: Qualquer rasura tornará nulo o efeito desta certidão, que tem validade de 60 dias.");
      parametros.put("atendente", usuarioLogado.getNomeUsuario());
      parametros.put("nomeEmpresa", sistemaParametro.getNomeEmpresa());
      parametros.put("cnpjEmpresa", Util.formatarCnpj(sistemaParametro.getCnpjEmpresa()));
      parametros.put("inscricaoEstadual", sistemaParametro.getInscricaoEstadual());
      parametros.put("nomeRelatorio", "CERTIDÃO NEGATIVA DE DÉBITOS POR CLIENTE");
    }

    // cria uma instância do dataSource do relatório
    RelatorioDataSource ds = new RelatorioDataSource(relatorioBeans);

    retorno = gerarRelatorio(nomeRelatorio, parametros, ds, tipoFormatoRelatorio);

    // ------------------------------------
    // Grava o relatório no sistema
    //		try {
    //			persistirRelatorioConcluido(retorno, Relatorio.CERTIDAO_NEGATIVA,
    //					idFuncionalidadeIniciada);
    //		} catch (ControladorException e) {
    //			e.printStackTrace();
    //			throw new TarefaException("Erro ao gravar relatório no sistema", e);
    //		}
    // ------------------------------------

    // retorna o relatório gerado
    return retorno;
  }
  public Object executar() throws TarefaException {

    System.out.println("********************************************");
    System.out.println("ENTROU NO EXECUTAR RELATORIO ORDEM DE FISCALIZACAO ");
    System.out.println("********************************************");

    byte[] retorno = null;

    // ------------------------------------
    Integer idFuncionalidadeIniciada = this.getIdFuncionalidadeIniciada();
    // ------------------------------------

    int tipoFormatoRelatorio = (Integer) getParametro("tipoFormatoRelatorio");

    String nomeArquivo = (String) getParametro("nomeArquivo");
    String nomeArquivoZip = nomeArquivo + ".zip";

    // Quantidade de ordens de fiscalização que serão geradas por arquivo compactado
    final int quantidadeRegistros = 1000;

    List colecaoOrdemFiscalizacao = (ArrayList) getParametro("colecaoOrdemFiscalizacao");

    if (colecaoOrdemFiscalizacao != null && !colecaoOrdemFiscalizacao.isEmpty()) {

      ZipOutputStream zos = null;
      File compactadoTipo = new File(nomeArquivoZip);

      try {
        zos = new ZipOutputStream(new FileOutputStream(compactadoTipo));
      } catch (IOException e) {
        e.printStackTrace();
        throw new TarefaException("Erro ao gerar o arquivo zip", e);
      }

      Fachada fachada = Fachada.getInstancia();
      SistemaParametro sistemaParametro = fachada.pesquisarParametrosDoSistema();

      boolean flagTerminou = false;

      // Quantidade total de ordens que serão geradas
      int totalOrdemFiscalizacao = colecaoOrdemFiscalizacao.size();

      int quantidadeOrdemFiscalizacao = 0;
      int parte = 1;

      while (!flagTerminou) {

        List relatorioBeans = new ArrayList();

        for (int i = 0; i < quantidadeRegistros; i++) {

          int index = quantidadeOrdemFiscalizacao;

          RelatorioOrdemFiscalizacaoBean relatorioOrdemFiscalizacaoBean =
              (RelatorioOrdemFiscalizacaoBean) colecaoOrdemFiscalizacao.get(index);

          relatorioBeans.add(relatorioOrdemFiscalizacaoBean);

          quantidadeOrdemFiscalizacao++;

          if (quantidadeOrdemFiscalizacao == totalOrdemFiscalizacao) {
            break;
          }
        }

        if (quantidadeOrdemFiscalizacao == totalOrdemFiscalizacao) {
          flagTerminou = true;
        }

        // Parâmetros do relatório
        Map parametros = new HashMap();

        parametros.put("imagem", sistemaParametro.getImagemRelatorio());
        parametros.put("nomeCompletoEmpresa", sistemaParametro.getNomeEmpresa());
        parametros.put("nomeEmpresa", sistemaParametro.getNomeAbreviadoEmpresa());
        parametros.put("cnpjEmpresa", Util.formatarCnpj(sistemaParametro.getCnpjEmpresa()));
        parametros.put("inscricaoEmpresa", "");

        // cria uma instância do dataSource do relatório
        RelatorioDataSource ds = new RelatorioDataSource(relatorioBeans);

        System.out.println("******************************************");
        System.out.println("GERA RELATORIO ORDEM FISCALIZACAO (Parte " + parte + ") - PDF");
        System.out.println("*******************************************");

        retorno =
            gerarRelatorio(
                ConstantesRelatorios.RELATORIO_ORDEM_FISCALIZACAO,
                parametros,
                ds,
                tipoFormatoRelatorio);

        // ------------------------------------
        // Grava o relatório no sistema
        try {

          System.out.println("***********************************************");
          System.out.println("COLOCA NO ZIP O RELATORIO ORDEM FISCALIZACAO (Parte " + parte + ")");
          System.out.println("***********************************************");

          File leitura = new File(nomeArquivo + "-Parte-" + parte + ".pdf");

          FileOutputStream out = new FileOutputStream(leitura.getAbsolutePath());

          out.write(retorno);
          out.close();

          parte++;

          ZipUtil.adicionarArquivo(zos, leitura);

          leitura.delete();

        } catch (IOException e) {
          e.printStackTrace();
          throw new TarefaException("Erro ao gravar relatório no diretorio", e);
        }
      }
      try {
        System.out.println("**************");
        System.out.println("FINALIZA O ZIP");
        System.out.println("**************");

        zos.close();
      } catch (IOException e) {
        e.printStackTrace();
        throw new TarefaException("Erro ao fechar o zip do relatorio", e);
      }
    }

    // ------------------------------------
    // Grava o relatório no sistema
    try {

      RelatorioPadraoBatch relatorio = new RelatorioPadraoBatch(Usuario.USUARIO_BATCH);

      relatorio.addParametro("titulo", "RELATÓRIO ORDEM FISCALIZAÇÃO");
      relatorio.addParametro("tipoFormatoRelatorio", TarefaRelatorio.TIPO_PDF);
      relatorio.addParametro("nomeArquivo", nomeArquivoZip);

      byte[] relatorioGerado = (byte[]) relatorio.executar();

      persistirRelatorioConcluido(
          relatorioGerado, Relatorio.RELATORIO_ORDEM_FISCALIZACAO, idFuncionalidadeIniciada);
    } catch (ControladorException e) {
      e.printStackTrace();
      throw new TarefaException("Erro ao gravar relatório no sistema", e);
    }

    // retorna o relatório gerado
    return retorno;
  }