/**
   * [UC00] Atualizar Gerência Regional
   *
   * <p>Este caso de uso permite alterar uma valor de uma Gerência Regional
   *
   * @author Thiago Tenório, Ivan Sérgio
   * @date 02/10/2007, 11/06/2007
   * @param actionMapping
   * @param actionForm
   * @param httpServletRequest
   * @param httpServletResponse
   * @return
   */
  public ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    // Seta o mapeamento de retorno
    ActionForward retorno = actionMapping.findForward("atualizarGerenciaRegional");

    HttpSession sessao = httpServletRequest.getSession(false);

    AtualizarGerenciaRegionalActionForm atualizarGerenciaRegionalActionForm =
        (AtualizarGerenciaRegionalActionForm) actionForm;

    String removerEndereco = (String) httpServletRequest.getParameter("removerEndereco");
    String objetoConsulta = (String) httpServletRequest.getParameter("objetoConsulta");

    FiltroGerenciaRegional filtroGerenciaRegional = new FiltroGerenciaRegional();

    // Remove o endereco informado.
    if (removerEndereco != null && !removerEndereco.trim().equalsIgnoreCase("")) {

      if (sessao.getAttribute("colecaoEnderecos") != null) {
        Collection enderecos = (Collection) sessao.getAttribute("colecaoEnderecos");
        if (!enderecos.isEmpty()) {
          enderecos.remove(enderecos.iterator().next());
        }
      }
    } else {
      if (httpServletRequest.getParameter("menu") != null) {
        atualizarGerenciaRegionalActionForm.setGerenciaRegionalID("");
        atualizarGerenciaRegionalActionForm.setNome("");
        atualizarGerenciaRegionalActionForm.setNomeAbreviado("");
      }

      Fachada fachada = Fachada.getInstancia();

      String idGerenciaRegional = null;

      if (httpServletRequest.getParameter("idRegistroAtualizacao") != null
          && !httpServletRequest.getParameter("idRegistroAtualizacao").equals("")) {
        sessao.removeAttribute("gerenciaRegional");
        sessao.removeAttribute("colecaoGerenciaRegionalTela");
      }

      // Verifica se veio do filtrar ou do manter
      if (httpServletRequest.getParameter("manter") != null) {
        sessao.setAttribute("manter", true);
      } else if (httpServletRequest.getParameter("filtrar") != null) {
        sessao.removeAttribute("manter");
      }

      // Usado para o botao Voltar
      if (sessao.getAttribute("gerenciaRegional") != null) {
        // Definindo a volta do botão Voltar p Filtrar Localidade
        sessao.setAttribute("voltar", "manter");
      } else {
        sessao.setAttribute("voltar", "filtrar");
      }

      if (objetoConsulta != null && !objetoConsulta.trim().equalsIgnoreCase("")) {
        switch (Integer.parseInt(objetoConsulta)) {

            // Gerente da Localidade
          case 1:
            this.pesquisarCliente(atualizarGerenciaRegionalActionForm);
            break;

          default:
            break;
        }
      }

      // Verifica se o servicoCobrancaValor já está na sessão, em caso
      // afirmativo
      // significa que o usuário já entrou na tela e apenas selecionou algum
      // item que deu um reload na tela e em caso negativo significa que ele
      // está entrando pela primeira vez
      if (sessao.getAttribute("colecaoGerenciaRegionalTela") == null) {
        if (sessao.getAttribute("gerenciaRegional") != null) {
          GerenciaRegional gerenciaRegional =
              (GerenciaRegional) sessao.getAttribute("gerenciaRegional");

          sessao.setAttribute("idGerenciaRegional", gerenciaRegional.getId().toString());
          sessao.setAttribute("gerenciaRegional", gerenciaRegional);

          atualizarGerenciaRegionalActionForm.setGerenciaRegionalID(
              gerenciaRegional.getId().toString());
          atualizarGerenciaRegionalActionForm.setNome(gerenciaRegional.getNome());

          atualizarGerenciaRegionalActionForm.setCnpjGerenciaRegional(
              gerenciaRegional.getCnpjGerenciaRegional());

          atualizarGerenciaRegionalActionForm.setNomeAbreviado(gerenciaRegional.getNomeAbreviado());
          atualizarGerenciaRegionalActionForm.setTelefone(gerenciaRegional.getFone());
          atualizarGerenciaRegionalActionForm.setRamal(gerenciaRegional.getRamalFone());
          atualizarGerenciaRegionalActionForm.setFax(gerenciaRegional.getFax());
          atualizarGerenciaRegionalActionForm.setEmail(gerenciaRegional.getEmail());

          if (gerenciaRegional.getCliente() != null && !gerenciaRegional.getCliente().equals("")) {
            atualizarGerenciaRegionalActionForm.setIdCliente(
                gerenciaRegional.getCliente().getId().toString());
            atualizarGerenciaRegionalActionForm.setNomeCliente(
                gerenciaRegional.getCliente().getNome());
          }

          if (gerenciaRegional.getIndicadorUso() != null) {
            atualizarGerenciaRegionalActionForm.setIndicadorUso(
                gerenciaRegional.getIndicadorUso().toString());
          } else {
            // Seta como Ativo
            Short indicadorUso = 1;
            gerenciaRegional.setIndicadorUso(indicadorUso);
            atualizarGerenciaRegionalActionForm.setIndicadorUso(
                gerenciaRegional.getIndicadorUso().toString());
          }

          Collection colecaoEnderecos = null;

          if (gerenciaRegional.getEnderecoFormatado() != null) {
            colecaoEnderecos = new ArrayList();
            Localidade endereco = new Localidade();

            endereco.setLogradouroCep(gerenciaRegional.getLogradouroCep());
            endereco.setLogradouroBairro(gerenciaRegional.getLogradouroBairro());
            endereco.setComplementoEndereco(gerenciaRegional.getComplementoEndereco());
            endereco.setNumeroImovel(gerenciaRegional.getNumeroImovel());
            endereco.setEnderecoReferencia(gerenciaRegional.getEnderecoReferencia());

            colecaoEnderecos.add(endereco);
            sessao.setAttribute("colecaoEnderecos", colecaoEnderecos);
          }

          sessao.setAttribute("gerenciaRegionalAtualizar", gerenciaRegional);
          sessao.removeAttribute("gerenciaRegional");

        } else if ((httpServletRequest.getParameter("desfazer") != null
                && httpServletRequest.getParameter("desfazer").equalsIgnoreCase("S"))
            || httpServletRequest.getParameter("idRegistroAtualizacao") != null) {

          GerenciaRegional gerenciaRegional = null;

          idGerenciaRegional = null;

          if (httpServletRequest.getParameter("idRegistroAtualizacao") == null
              || httpServletRequest.getParameter("idRegistroAtualizacao").equals("")) {
            gerenciaRegional = (GerenciaRegional) sessao.getAttribute("gerenciaRegional");
          } else {
            idGerenciaRegional = (String) httpServletRequest.getParameter("idRegistroAtualizacao");
            sessao.setAttribute("idRegistroAtualizacao", idGerenciaRegional);
          }

          if (idGerenciaRegional == null) {
            gerenciaRegional = (GerenciaRegional) sessao.getAttribute("gerenciaRegionalAtualizar");
            idGerenciaRegional = gerenciaRegional.getId().toString();
          }

          if (idGerenciaRegional != null) {

            filtroGerenciaRegional.adicionarCaminhoParaCarregamentoEntidade("enderecoReferencia");
            filtroGerenciaRegional.adicionarCaminhoParaCarregamentoEntidade(
                "logradouroCep.logradouro.logradouroTipo");
            filtroGerenciaRegional.adicionarCaminhoParaCarregamentoEntidade(
                "logradouroCep.logradouro.logradouroTitulo");
            filtroGerenciaRegional.adicionarCaminhoParaCarregamentoEntidade(
                "logradouroBairro.bairro.municipio.unidadeFederacao");
            filtroGerenciaRegional.adicionarCaminhoParaCarregamentoEntidade("logradouroCep.cep");
            filtroGerenciaRegional.adicionarCaminhoParaCarregamentoEntidade("cliente");

            filtroGerenciaRegional.adicionarParametro(
                new ParametroSimples(FiltroGerenciaRegional.ID, idGerenciaRegional));

            Collection<GerenciaRegional> colecaoGerenciaRegional =
                fachada.pesquisar(filtroGerenciaRegional, GerenciaRegional.class.getName());

            if (colecaoGerenciaRegional == null || colecaoGerenciaRegional.isEmpty()) {
              throw new ActionServletException("atencao.atualizacao.timestamp");
            }
            httpServletRequest.setAttribute("colecaoGerenciaRegional", colecaoGerenciaRegional);
            gerenciaRegional = (GerenciaRegional) colecaoGerenciaRegional.iterator().next();
          }

          atualizarGerenciaRegionalActionForm.setGerenciaRegionalID(
              gerenciaRegional.getId().toString());
          atualizarGerenciaRegionalActionForm.setNome(gerenciaRegional.getNome());
          atualizarGerenciaRegionalActionForm.setNomeAbreviado(gerenciaRegional.getNomeAbreviado());
          atualizarGerenciaRegionalActionForm.setTelefone(gerenciaRegional.getFone());
          atualizarGerenciaRegionalActionForm.setRamal(gerenciaRegional.getRamalFone());
          atualizarGerenciaRegionalActionForm.setFax(gerenciaRegional.getFax());
          atualizarGerenciaRegionalActionForm.setEmail(gerenciaRegional.getEmail());

          if (gerenciaRegional.getCliente() != null) {
            atualizarGerenciaRegionalActionForm.setIdCliente(
                gerenciaRegional.getCliente().getId().toString());
            atualizarGerenciaRegionalActionForm.setNomeCliente(
                gerenciaRegional.getCliente().getNome());
          }

          if (gerenciaRegional.getIndicadorUso() != null) {
            atualizarGerenciaRegionalActionForm.setIndicadorUso(
                gerenciaRegional.getIndicadorUso().toString());
          } else {
            // Seta como Ativo
            Short indicadorUso = 1;
            gerenciaRegional.setIndicadorUso(indicadorUso);
            atualizarGerenciaRegionalActionForm.setIndicadorUso(
                gerenciaRegional.getIndicadorUso().toString());
          }

          sessao.setAttribute("gerenciaRegionalAtualizar", gerenciaRegional);

          if (gerenciaRegional.getEnderecoFormatado() != null) {
            Collection colecaoEnderecos = new ArrayList();
            Localidade endereco = new Localidade();

            endereco.setLogradouroCep(gerenciaRegional.getLogradouroCep());
            endereco.setLogradouroBairro(gerenciaRegional.getLogradouroBairro());
            endereco.setComplementoEndereco(gerenciaRegional.getComplementoEndereco());
            endereco.setNumeroImovel(gerenciaRegional.getNumeroImovel());
            endereco.setEnderecoReferencia(gerenciaRegional.getEnderecoReferencia());

            colecaoEnderecos.add(endereco);
            sessao.setAttribute("colecaoEnderecos", colecaoEnderecos);
          }
        }
      }
    }

    httpServletRequest.setAttribute(
        "colecaoGerenciaRegionalTela", sessao.getAttribute("colecaoGerenciaRegionalTipoValorTela"));

    // Codigo Cliente
    if (atualizarGerenciaRegionalActionForm.getIdCliente() != null
        && !atualizarGerenciaRegionalActionForm.getIdCliente().equals("")
        && atualizarGerenciaRegionalActionForm.getNomeCliente() != null
        && !atualizarGerenciaRegionalActionForm.getNomeCliente().equals("")) {

      httpServletRequest.setAttribute("gerenteLocalidadeEncontrado", "true");
    }

    return retorno;
  }
  /**
   * < <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
   */
  public Object executar() throws TarefaException {

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

    Integer idGerenciaRegional = (Integer) getParametro("idGerenciaRegional");
    Integer idUnidadeNegocio = (Integer) getParametro("idUnidadeNegocio");
    Integer idLocalidadeInicial = (Integer) getParametro("idLocalidadeInicial");
    Integer idLocalidadeFinal = (Integer) getParametro("idLocalidadeFinal");
    Integer idSetorComercialInicial = (Integer) getParametro("idSetorComercialInicial");
    Integer idSetorComercialFinal = (Integer) getParametro("idSetorComercialFinal");
    Integer idImovel = (Integer) getParametro("idImovelPerfil");
    Integer selecionar = (Integer) getParametro("selecionar");
    Integer referencia = (Integer) getParametro("referencia");
    Integer idImovelPerfil = (Integer) getParametro("idImovelPerfil");
    int tipoFormatoRelatorio = (Integer) getParametro("tipoFormatoRelatorio");

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

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

    Fachada fachada = Fachada.getInstancia();

    RelatorioAnaliseImovelCorporativoGrandeBean relatorioBean = null;

    Collection colecaoRelatorioAnaliseImovelCorporativoGrandeHelper =
        fachada.pesquisarDadosRelatorioAnaliseImovelCorporativoGrande(
            idGerenciaRegional,
            idUnidadeNegocio,
            idLocalidadeInicial,
            idLocalidadeFinal,
            idSetorComercialInicial,
            idSetorComercialFinal,
            referencia,
            idImovel,
            selecionar);

    // se a coleção de parâmetros da analise não for vazia
    if (colecaoRelatorioAnaliseImovelCorporativoGrandeHelper != null
        && !colecaoRelatorioAnaliseImovelCorporativoGrandeHelper.isEmpty()) {

      // coloca a coleção de parâmetros da analise no iterator
      Iterator colecaoRelatorioAnaliseImovelCorporativoGrandeHelperIterator =
          colecaoRelatorioAnaliseImovelCorporativoGrandeHelper.iterator();

      // laço para criar a coleção de parâmetros da analise
      while (colecaoRelatorioAnaliseImovelCorporativoGrandeHelperIterator.hasNext()) {

        GerarRelatorioAnaliseImovelCorporativoGrandeHelper helper =
            (GerarRelatorioAnaliseImovelCorporativoGrandeHelper)
                colecaoRelatorioAnaliseImovelCorporativoGrandeHelperIterator.next();

        // Faz as validações dos campos necessáriose e formata a String
        // para a forma como irá aparecer no relatório

        // Gerência Regional
        String gerenciaRegional = "";

        if (helper.getIdGerenciaRegional() != null) {
          gerenciaRegional =
              helper.getIdGerenciaRegional() + " - " + helper.getNomeGerenciaRegional();
        }

        // Unidade de Negócio
        String unidadeNegocio = "";

        if (helper.getIdUnidadeNegocio() != null) {
          unidadeNegocio = helper.getIdUnidadeNegocio() + " - " + helper.getNomeUnidadeNegocio();
        }

        // Localidade
        String localidade = "";

        if (helper.getIdLocalidade() != null) {
          localidade = helper.getIdLocalidade() + " - " + helper.getNomeLocalidade();
        }

        // Setor Comercial
        String setorComercial = "";
        String idSetorComercial = "";

        if (helper.getIdSetorComercial() != null) {
          setorComercial = helper.getCodigoSetorComercial().toString();
          idSetorComercial = helper.getIdSetorComercial().toString();
        }

        // Imóvel, Endereço e Categoria
        String matriculaImovel = "";
        String endereco = "";
        String inscricao = "";

        if (helper.getIdImovel() != null) {
          matriculaImovel = helper.getIdImovel().toString();
          Imovel imovel = new Imovel();
          imovel.setId(helper.getIdImovel());
          endereco = fachada.pesquisarEndereco(helper.getIdImovel());
          inscricao = fachada.pesquisarInscricaoImovel(helper.getIdImovel());
        }

        // Capacidade do Hidrômetro
        String capacidadeHidrometro = "";

        if (helper.getCapacidadeHidrometro() != null) {
          capacidadeHidrometro = helper.getCapacidadeHidrometro();
        }

        String consumoMedio = "";

        if (helper.getConsumoMedio() != null) {
          consumoMedio = helper.getConsumoMedio().toString();
        }

        String consumoFaturado = "";

        if (helper.getConsumoFaturado() != null) {
          consumoFaturado = helper.getConsumoFaturado().toString();
        }

        String tipoLigacao = "";

        if (helper.getIdTipoLigacao() != null) {
          if (helper.getIdTipoLigacao().equals(1)) {
            tipoLigacao = "ÁGUA";
          } else {
            tipoLigacao = "ESGOTO";
          }
        }

        relatorioBean =
            new RelatorioAnaliseImovelCorporativoGrandeBean(

                // Unidade de Negócio
                unidadeNegocio,

                // Gerência Regional
                gerenciaRegional,

                // Localidade
                localidade,

                // Id do Setor Comercial
                idSetorComercial,

                // Setor Comercial
                setorComercial,

                // Inscrição
                inscricao,

                // Imóvel
                matriculaImovel,

                // Endereço
                endereco,

                // Capacidade do Hidrômetro
                capacidadeHidrometro,

                // Consumo Médio
                consumoMedio,

                // Consumo Faturado
                consumoFaturado,

                // Tipo de ligação
                tipoLigacao);

        // adiciona o bean a coleção
        relatorioBeans.add(relatorioBean);
      }
    }
    // __________________________________________________________________

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

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

    parametros.put("mesAno", Util.formatarAnoMesParaMesAno(referencia));

    if (idUnidadeNegocio != null) {
      FiltroUnidadeNegocio filtroUnidadeNegocio = new FiltroUnidadeNegocio();
      filtroUnidadeNegocio.adicionarParametro(
          new ParametroSimples(FiltroUnidadeNegocio.ID, idUnidadeNegocio));
      Collection colecaoUnidadeNegocio =
          fachada.pesquisar(filtroUnidadeNegocio, UnidadeNegocio.class.getName());
      UnidadeNegocio unidadeNegocio =
          (UnidadeNegocio) Util.retonarObjetoDeColecao(colecaoUnidadeNegocio);
      parametros.put(
          "unidadeNegocio", unidadeNegocio.getNomeAbreviado() + "-" + unidadeNegocio.getNome());
    } else {
      parametros.put("unidadeNegocio", "");
    }

    if (idLocalidadeInicial != null) {
      FiltroLocalidade filtroLocalidadeInicial = new FiltroLocalidade();
      filtroLocalidadeInicial.adicionarParametro(
          new ParametroSimples(FiltroLocalidade.ID, idLocalidadeInicial));
      Collection colecaoLocalidadeInicial =
          fachada.pesquisar(filtroLocalidadeInicial, Localidade.class.getName());
      Localidade localidadeInicial =
          (Localidade) Util.retonarObjetoDeColecao(colecaoLocalidadeInicial);
      parametros.put(
          "localidadeInicial", localidadeInicial.getId() + "-" + localidadeInicial.getDescricao());

    } else {
      parametros.put("localidadeInicial", "");
    }

    if (idLocalidadeInicial != null) {
      FiltroLocalidade filtroLocalidadeFinal = new FiltroLocalidade();
      filtroLocalidadeFinal.adicionarParametro(
          new ParametroSimples(FiltroLocalidade.ID, idLocalidadeInicial));
      Collection colecaoLocalidadeFinal =
          fachada.pesquisar(filtroLocalidadeFinal, Localidade.class.getName());
      Localidade localidadeFinal = (Localidade) Util.retonarObjetoDeColecao(colecaoLocalidadeFinal);
      parametros.put(
          "localidadeFinal", localidadeFinal.getId() + "-" + localidadeFinal.getDescricao());

    } else {
      parametros.put("localidadeFinal", "");
    }

    if (idGerenciaRegional != null) {
      FiltroGerenciaRegional filtroGerenciaRegional = new FiltroGerenciaRegional();
      filtroGerenciaRegional.adicionarParametro(
          new ParametroSimples(FiltroGerenciaRegional.ID, idGerenciaRegional));
      Collection colecaoGerenciaRegional =
          fachada.pesquisar(filtroGerenciaRegional, GerenciaRegional.class.getName());
      GerenciaRegional gerenciaRegional =
          (GerenciaRegional) Util.retonarObjetoDeColecao(colecaoGerenciaRegional);
      parametros.put(
          "gerenciaRegional",
          gerenciaRegional.getNomeAbreviado() + "-" + gerenciaRegional.getNome());
    } else {
      parametros.put("gerenciaRegional", "");
    }

    if (idSetorComercialInicial != null) {
      FiltroSetorComercial filtroSetorComercialInicial = new FiltroSetorComercial();
      filtroSetorComercialInicial.adicionarParametro(
          new ParametroSimples(FiltroSetorComercial.ID, idSetorComercialInicial));
      Collection colecaoSetorComercialInicial =
          fachada.pesquisar(filtroSetorComercialInicial, SetorComercial.class.getName());
      SetorComercial setorComercialInicial =
          (SetorComercial) Util.retonarObjetoDeColecao(colecaoSetorComercialInicial);
      parametros.put(
          "setorComercialInicial",
          setorComercialInicial.getId() + "-" + setorComercialInicial.getDescricao());
    } else {
      parametros.put("setorComercialInicial", "");
    }

    if (idSetorComercialInicial != null) {
      FiltroSetorComercial filtroSetorComercialFinal = new FiltroSetorComercial();
      filtroSetorComercialFinal.adicionarParametro(
          new ParametroSimples(FiltroSetorComercial.ID, idSetorComercialInicial));
      Collection colecaoSetorComercialFinal =
          fachada.pesquisar(filtroSetorComercialFinal, SetorComercial.class.getName());
      SetorComercial setorComercialFinal =
          (SetorComercial) Util.retonarObjetoDeColecao(colecaoSetorComercialFinal);
      parametros.put(
          "setorComercialFinal",
          setorComercialFinal.getId() + "-" + setorComercialFinal.getDescricao());
    } else {
      parametros.put("setorComercialFinal", "");
    }

    if (idImovelPerfil != null) {
      FiltroImovelPerfil filtroImovelPerfil = new FiltroImovelPerfil();
      filtroImovelPerfil.adicionarParametro(
          new ParametroSimples(FiltroImovelPerfil.ID, idImovelPerfil));
      Collection colecaoImovelPerfil =
          fachada.pesquisar(filtroImovelPerfil, ImovelPerfil.class.getName());
      ImovelPerfil imovelPerfil = (ImovelPerfil) Util.retonarObjetoDeColecao(colecaoImovelPerfil);
      parametros.put(
          "imovelPerfil", "ANÁLISE DO IMÓVEIS " + imovelPerfil.getDescricao().toUpperCase() + "S");
    } else {
      parametros.put("imovelPerfil", "");
    }

    parametros.put("tipoFormatoRelatorio", "R0887");

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

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

    // ------------------------------------
    // Grava o relatório no sistema
    try {
      persistirRelatorioConcluido(
          retorno, Relatorio.ANALISE_IMOVEL_CORPORATIVO_GRANDE, 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 ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    // Seta o mapeamento de retorno
    ActionForward retorno = null;

    httpServletRequest.setAttribute("telaSucessoRelatorio", true);

    HttpSession sessao = httpServletRequest.getSession(false);

    Usuario usuario = (Usuario) sessao.getAttribute("usuarioLogado");

    // Form
    GerarRelatorioReligacaoClientesInadiplentesForm form =
        (GerarRelatorioReligacaoClientesInadiplentesForm) actionForm;

    FiltrarRelatorioReligacaoClientesInadiplentesHelper helper =
        new FiltrarRelatorioReligacaoClientesInadiplentesHelper();

    String tipoRelatorio = httpServletRequest.getParameter("tipoRelatorio");

    Fachada fachada = Fachada.getInstancia();

    boolean peloMenosUmParametroInformado = false;

    // Gerência Regional
    String gerenciaRegional = " -- ";
    if (form.getGerenciaRegionalID() != null && !form.getGerenciaRegionalID().equals("-1")) {

      helper.setGerenciaRegional(new Integer(form.getGerenciaRegionalID()));

      FiltroGerenciaRegional filtroGerenciaRegional = new FiltroGerenciaRegional();
      filtroGerenciaRegional.adicionarParametro(
          new ParametroSimples(FiltroGerenciaRegional.ID, form.getGerenciaRegionalID()));

      filtroGerenciaRegional.adicionarParametro(
          new ParametroSimples(
              FiltroGerenciaRegional.INDICADOR_USO, ConstantesSistema.INDICADOR_USO_ATIVO));

      // Retorna gerenciaRegional
      colecaoPesquisa = fachada.pesquisar(filtroGerenciaRegional, GerenciaRegional.class.getName());

      if (colecaoPesquisa == null || colecaoPesquisa.isEmpty()) {

        throw new ActionServletException("atencao.gerenciaRegional_inexistente");
      }

      GerenciaRegional objetoGerenciaRegional =
          (GerenciaRegional) Util.retonarObjetoDeColecao(colecaoPesquisa);
      gerenciaRegional = objetoGerenciaRegional.getNome();

      peloMenosUmParametroInformado = true;
    }

    // Unidade de Negócio
    String unidadeNegocio = " -- ";
    if (form.getUnidadeNegocioID() != null && !form.getUnidadeNegocioID().equals("-1")) {

      helper.setUnidadeNegocio(new Integer(form.getUnidadeNegocioID()));

      FiltroUnidadeNegocio filtroUnidadeNegocio = new FiltroUnidadeNegocio();
      filtroUnidadeNegocio.adicionarParametro(
          new ParametroSimples(FiltroUnidadeNegocio.ID, form.getUnidadeNegocioID()));

      filtroUnidadeNegocio.adicionarParametro(
          new ParametroSimples(
              FiltroUnidadeNegocio.INDICADOR_USO, ConstantesSistema.INDICADOR_USO_ATIVO));

      // Retorna Unidade de Negócio
      colecaoPesquisa = fachada.pesquisar(filtroUnidadeNegocio, UnidadeNegocio.class.getName());

      if (colecaoPesquisa == null || colecaoPesquisa.isEmpty()) {

        throw new ActionServletException("atencao.unidade_negocio.inexistente");
      }

      UnidadeNegocio objetoUnidadeNegocio =
          (UnidadeNegocio) Util.retonarObjetoDeColecao(colecaoPesquisa);
      unidadeNegocio = objetoUnidadeNegocio.getNome();

      peloMenosUmParametroInformado = true;
    }

    // Localidade
    String localidade = " -- ";
    if (form.getLocalidadeID() != null && !form.getLocalidadeID().equals("")) {

      helper.setLocalidade(new Integer(form.getLocalidadeID()));
      peloMenosUmParametroInformado = true;

      if (form.getNomeLocalidade() == null || form.getNomeLocalidade().equals("")) {

        FiltroLocalidade filtroLocalidade = new FiltroLocalidade();
        filtroLocalidade.adicionarParametro(
            new ParametroSimples(FiltroLocalidade.ID, form.getLocalidadeID()));

        filtroLocalidade.adicionarParametro(
            new ParametroSimples(
                FiltroLocalidade.INDICADORUSO, ConstantesSistema.INDICADOR_USO_ATIVO));

        // Retorna Localidade
        colecaoPesquisa = fachada.pesquisar(filtroLocalidade, Localidade.class.getName());

        if (colecaoPesquisa == null || colecaoPesquisa.isEmpty()) {

          throw new ActionServletException("pesquisa.localidade.inexistente");
        }

        Localidade objetoLocalidade = (Localidade) Util.retonarObjetoDeColecao(colecaoPesquisa);
        localidade = objetoLocalidade.getDescricao();

      } else {

        localidade = form.getNomeLocalidade();
      }
    }

    // Setor Comercial
    String setorComercial = " -- ";
    if ((form.getSetorComercialID() != null && !form.getSetorComercialID().equals(""))
        || form.getSetorComercialCD() != null && !form.getSetorComercialCD().equals("")) {

      if (form.getSetorComercialID() != null && !form.getSetorComercialID().equals("")) {

        setorComercial = form.getNomeSetorComercial();
        helper.setSetorComercial(new Integer(form.getSetorComercialID()));
        peloMenosUmParametroInformado = true;
      } else {

        localidadeID = (String) form.getLocalidadeID();

        if (localidadeID == null || localidadeID.equals("")) {

          throw new ActionServletException("atencao.localidade_nao_informada");
        }

        setorComercialCD = (String) form.getSetorComercialCD();

        FiltroSetorComercial filtroSetorComercial = new FiltroSetorComercial();

        filtroSetorComercial.adicionarParametro(
            new ParametroSimples(FiltroSetorComercial.ID_LOCALIDADE, localidadeID));

        filtroSetorComercial.adicionarParametro(
            new ParametroSimples(FiltroSetorComercial.CODIGO_SETOR_COMERCIAL, setorComercialCD));

        // Retorna setorComercial
        colecaoPesquisa = fachada.pesquisar(filtroSetorComercial, SetorComercial.class.getName());

        if (colecaoPesquisa == null || colecaoPesquisa.isEmpty()) {

          throw new ActionServletException("atencao.processo.setorComercialNaoCadastrada");
        }

        SetorComercial objetoSetorComercial =
            (SetorComercial) Util.retonarObjetoDeColecao(colecaoPesquisa);

        setorComercial = objetoSetorComercial.getDescricao();
        helper.setSetorComercial(objetoSetorComercial.getId());
        peloMenosUmParametroInformado = true;
      }
    }

    // Cliente
    String cliente = " -- ";
    if (form.getClienteID() != null && !form.getClienteID().equals("")) {

      if (form.getNomeCliente() == null || form.getNomeCliente().equals("")) {

        FiltroCliente filtroCliente = new FiltroCliente();
        filtroCliente.adicionarParametro(
            new ParametroSimples(FiltroCliente.ID, form.getClienteID()));

        filtroCliente.adicionarParametro(
            new ParametroSimples(
                FiltroCliente.INDICADOR_USO, ConstantesSistema.INDICADOR_USO_ATIVO));

        // Retorna Cliente
        colecaoPesquisa = fachada.pesquisar(filtroCliente, Cliente.class.getName());

        if (colecaoPesquisa == null || colecaoPesquisa.isEmpty()) {

          throw new ActionServletException("atencao.cliente.inexistente");
        }

        Cliente objetoCliente = (Cliente) Util.retonarObjetoDeColecao(colecaoPesquisa);
        cliente = objetoCliente.getDescricao();

      } else {

        cliente = form.getNomeCliente();
      }

      helper.setCliente(new Integer(form.getClienteID()));
      peloMenosUmParametroInformado = true;
    }

    // Usuário
    String nomeUsuario = " -- ";
    if (form.getUsuarioID() != null && !form.getUsuarioID().equals("")) {

      if (form.getNomeUsuario() == null || form.getNomeUsuario().equals("")) {

        FiltroUsuario filtroUsuario = new FiltroUsuario();
        filtroUsuario.adicionarParametro(
            new ParametroSimples(FiltroUsuario.ID, form.getUsuarioID()));

        // Retorna Usuário
        colecaoPesquisa = fachada.pesquisar(filtroUsuario, Usuario.class.getName());

        if (colecaoPesquisa == null || colecaoPesquisa.isEmpty()) {

          throw new ActionServletException("atencao.pesquisa.usuario.inexistente");
        }

        Usuario objetoUsuario = (Usuario) Util.retonarObjetoDeColecao(colecaoPesquisa);
        nomeUsuario = objetoUsuario.getLogin();

      } else {

        nomeUsuario = form.getNomeUsuario();
      }

      helper.setUsuario(new Integer(form.getUsuarioID()));
      peloMenosUmParametroInformado = true;
    }

    // Período Encerramento
    String periodoEncerramento = "";
    if (form.getDataInicioEncerramento() != null && !form.getDataInicioEncerramento().equals("")) {

      if (form.getDataFimEncerramento() == null
          || form.getDataFimEncerramento().trim().equals("")) {

        form.setDataFimEncerramento(form.getDataInicioEncerramento());
      }

      if (!Util.validarDiaMesAno(form.getDataInicioEncerramento())) {

        periodoEncerramento += form.getDataInicioEncerramento() + " a ";
        helper.setDataInicioEncerramento(
            Util.formatarDataInicial(
                Util.converteStringParaDate(form.getDataInicioEncerramento())));

        if (helper.getDataInicioEncerramento().after(new Date())) {

          throw new ActionServletException("atencao.periodo_inicio_alteracao_invalida");
        }

        if (!Util.validarDiaMesAno(form.getDataFimEncerramento())) {

          periodoEncerramento += form.getDataFimEncerramento();
          helper.setDataFimEncerramento(
              Util.formatarDataFinal(Util.converteStringParaDate(form.getDataFimEncerramento())));

          if (helper.getDataFimEncerramento().after(new Date())) {

            throw new ActionServletException("atencao.periodo_final_alteracao_invalida");
          }

          if (Util.compararData(helper.getDataInicioEncerramento(), helper.getDataFimEncerramento())
              == 1) {

            throw new ActionServletException("atencao.data_inicio_maior_final");
          }

          // Lilita o intevalo a um mês.
          if ((helper.getDataFimEncerramento().getTime()
                  - helper.getDataInicioEncerramento().getTime())
              > 1000L * 60L * 60L * 24L * 31L) {

            throw new ActionServletException(
                "atencao.filtrar_intervalo_limite", null, "Período de Encerramento da S.O");
          }

          peloMenosUmParametroInformado = true;

        } else {
          throw new ActionServletException("atencao.periodo_final_alteracao_invalida");
        }
      } else {
        throw new ActionServletException("atencao.periodo_inicio_alteracao_invalida");
      }
    }

    // Período Recorrência
    String periodoRecorrencia = "";
    if (form.getDataInicioRecorrencia() != null && !form.getDataInicioRecorrencia().equals("")) {
      if (!Util.validarDiaMesAno(form.getDataInicioRecorrencia())) {

        periodoRecorrencia += form.getDataInicioRecorrencia() + " a ";
        helper.setDataInicioRecorrencia(
            Util.formatarDataInicial(Util.converteStringParaDate(form.getDataInicioRecorrencia())));

        if (helper.getDataInicioRecorrencia().after(new Date())) {

          throw new ActionServletException("atencao.periodo_inicio_alteracao_invalida");
        }

        if (!Util.validarDiaMesAno(form.getDataFimRecorrencia())) {

          periodoRecorrencia += form.getDataFimRecorrencia();
          helper.setDataFimRecorrencia(
              Util.formatarDataFinal(Util.converteStringParaDate(form.getDataFimRecorrencia())));

          if (helper.getDataFimRecorrencia().after(new Date())) {

            throw new ActionServletException("atencao.periodo_final_alteracao_invalida");
          }

          if (Util.compararData(helper.getDataInicioRecorrencia(), helper.getDataFimRecorrencia())
              == 1) {

            throw new ActionServletException("atencao.data_inicio_maior_final");
          }

          peloMenosUmParametroInformado = true;

        } else {
          throw new ActionServletException("atencao.periodo_final_alteracao_invalida");
        }
      } else {
        throw new ActionServletException("atencao.periodo_inicio_alteracao_invalida");
      }
    } else {

      Date dt = Util.adcionarOuSubtrairMesesAData(new Date(), -6, 0);

      helper.setDataInicioRecorrencia(dt);
      helper.setDataFimRecorrencia(new Date());
      periodoRecorrencia = Util.formatarData(dt) + " a " + Util.formatarData(new Date());
    }

    // Escolha Relatório
    if (form.getEscolhaRelatorio() != null && !form.getEscolhaRelatorio().equals("-1")) {

      helper.setEscolhaRelatorio(new Integer(form.getEscolhaRelatorio()));
      peloMenosUmParametroInformado = true;
    } else {

      throw new ActionServletException("atencao.tipo_relatorio_nao_informado");
    }

    // Erro caso o usuário mandou filtrar sem nenhum parâmetro
    if (!peloMenosUmParametroInformado) {

      throw new ActionServletException("atencao.filtro.nenhum_parametro_informado");
    }

    TarefaRelatorio relatorio =
        new RelatorioReligacaoClientesInadiplentes(
            (Usuario) (httpServletRequest.getSession(false)).getAttribute("usuarioLogado"));

    if (tipoRelatorio == null) {
      tipoRelatorio = TarefaRelatorio.TIPO_PDF + "";
    }

    relatorio.addParametro("tipoFormatoRelatorio", Integer.parseInt(tipoRelatorio));
    relatorio.addParametro("filtrarRelatorioReligacaoClientesInadiplentesHelper", helper);
    relatorio.addParametro("usuario", usuario);

    relatorio.addParametro("gerenciaRegional", gerenciaRegional);
    relatorio.addParametro("unidadeNegocio", unidadeNegocio);
    relatorio.addParametro("localidade", localidade);
    relatorio.addParametro("setorComercial", setorComercial);
    relatorio.addParametro("cliente", cliente);
    relatorio.addParametro("nomeUsuario", nomeUsuario);
    relatorio.addParametro("periodoEncerramento", periodoEncerramento);
    relatorio.addParametro("periodoRecorrencia", periodoRecorrencia);

    try {

      retorno =
          processarExibicaoRelatorio(
              relatorio, tipoRelatorio, httpServletRequest, httpServletResponse, actionMapping);

    } catch (SistemaException ex) {
      // manda o erro para a página no request atual
      reportarErros(httpServletRequest, "erro.sistema");

      // seta o mapeamento de retorno para a tela de erro de popup
      retorno = actionMapping.findForward("telaErroPopup");

    } catch (RelatorioVazioException ex1) {
      throw new ActionServletException("atencao.pesquisa.nenhumresultado", null, "");
    }

    return retorno;
  }