public ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    HttpSession sessao = httpServletRequest.getSession(false);

    InformarVencimentoAlternativoActionForm informarVencimentoAlternativoActionForm =
        (InformarVencimentoAlternativoActionForm) actionForm;

    if (Util.verificarNaoVazio(informarVencimentoAlternativoActionForm.getIdImovel())) {

      Collection<ClienteImovel> colecaoClienteImovel =
          obterColecaoClienteImovel(informarVencimentoAlternativoActionForm);

      if (Util.isVazioOrNulo(colecaoClienteImovel)) {
        httpServletRequest.setAttribute("corInscricao", "exception");
        httpServletRequest.setAttribute("nomeCampo", "idImovel");

        limparFormESessao(informarVencimentoAlternativoActionForm, sessao);

        informarVencimentoAlternativoActionForm.setInscricaoImovel("Matrícula Inexistente");
      } else {

        setarDadosFormESessao(
            informarVencimentoAlternativoActionForm, colecaoClienteImovel, sessao);
      }
    }

    return actionMapping.findForward("informarVencimentoAlternativo");
  }
  /**
   * Obtém o ClienteImovel relacionado ao imóvel informado, onde a relação entre o cliente e o
   * imóvel seja de Usuário.
   *
   * @since 22/10/2009
   * @author Marlon Patrick
   */
  private Collection<ClienteImovel> obterColecaoClienteImovel(
      InformarVencimentoAlternativoActionForm informarVencimentoAlternativoActionForm) {
    FiltroClienteImovel filtroClienteImovel = new FiltroClienteImovel();

    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade("imovel");
    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade("imovel.setorComercial");
    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade("imovel.quadra");
    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade("imovel.ligacaoAguaSituacao");
    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade("imovel.ligacaoEsgotoSituacao");
    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade("cliente");
    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade(
        "imovel.quadra.rota.faturamentoGrupo");
    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade("imovel");

    filtroClienteImovel.adicionarParametro(
        new ParametroSimples(
            FiltroClienteImovel.IMOVEL_ID, informarVencimentoAlternativoActionForm.getIdImovel()));

    filtroClienteImovel.adicionarParametro(
        new ParametroSimples(FiltroClienteImovel.CLIENTE_RELACAO_TIPO, ClienteRelacaoTipo.USUARIO));

    filtroClienteImovel.adicionarParametro(new ParametroNulo(FiltroClienteImovel.DATA_FIM_RELACAO));

    return Fachada.getInstancia().pesquisar(filtroClienteImovel, ClienteImovel.class.getName());
  }
  /**
   * Limpa todos os campos que seriam exibidos na tela, sejam eles do form ou da sessão.
   *
   * @since 23/10/2009
   * @author Marlon Patrick
   */
  private void limparFormESessao(
      InformarVencimentoAlternativoActionForm informarVencimentoAlternativoActionForm,
      HttpSession sessao) {

    informarVencimentoAlternativoActionForm.setIdImovel("");
    informarVencimentoAlternativoActionForm.setInscricaoImovel("");
    informarVencimentoAlternativoActionForm.setNomeClienteUsuario("");
    informarVencimentoAlternativoActionForm.setSituacaoAguaImovel("");
    informarVencimentoAlternativoActionForm.setSituacaoEsgotoImovel("");
    informarVencimentoAlternativoActionForm.setDiaVencimentoGrupo("");
    informarVencimentoAlternativoActionForm.setDiaVencimentoAtual("");
    informarVencimentoAlternativoActionForm.setDataAlteracaoVencimento("");
    informarVencimentoAlternativoActionForm.setIndicadorVencimentoMesSeguinte("");

    sessao.removeAttribute("vencimentoAlternativo");
    sessao.removeAttribute("colecaoNovoDiaVencimento");
    sessao.removeAttribute("imovel");
  }
  /**
   * Este método seta as informações a serem exibidas para o usuário no form e na sessão, para que a
   * JSP responsável processe os dados.
   *
   * @since 22/10/2009
   * @author Marlon Patrick
   */
  private void setarDadosFormESessao(
      InformarVencimentoAlternativoActionForm informarVencimentoAlternativoActionForm,
      Collection<ClienteImovel> colecaoClienteImovel,
      HttpSession sessao) {

    Fachada fachada = Fachada.getInstancia();

    ClienteImovel clienteImovel = colecaoClienteImovel.iterator().next();

    fachada.verificarExistenciaRegistroAtendimento(
        clienteImovel.getImovel().getId(),
        "atencao.vencimento_alternativo_existencia_registro_atendimento",
        EspecificacaoTipoValidacao.VENCIMENTO_ALTERNATIVO);

    informarVencimentoAlternativoActionForm.setInscricaoImovel(
        clienteImovel.getImovel().getInscricaoFormatada());

    informarVencimentoAlternativoActionForm.setNomeClienteUsuario(
        clienteImovel.getCliente().getNome());

    informarVencimentoAlternativoActionForm.setSituacaoAguaImovel(
        clienteImovel.getImovel().getLigacaoAguaSituacao().getDescricao());

    informarVencimentoAlternativoActionForm.setSituacaoEsgotoImovel(
        clienteImovel.getImovel().getLigacaoEsgotoSituacao().getDescricao());

    informarVencimentoAlternativoActionForm.setDiaVencimentoGrupo("");

    if (clienteImovel.getImovel().getQuadra().getRota().getFaturamentoGrupo().getDiaVencimento()
            != null
        && !clienteImovel
            .getImovel()
            .getQuadra()
            .getRota()
            .getFaturamentoGrupo()
            .getDiaVencimento()
            .equals(0)) {

      informarVencimentoAlternativoActionForm.setDiaVencimentoGrupo(
          clienteImovel
              .getImovel()
              .getQuadra()
              .getRota()
              .getFaturamentoGrupo()
              .getDiaVencimento()
              .toString());
    }

    informarVencimentoAlternativoActionForm.setDiaVencimentoAtual("");

    if (clienteImovel.getImovel().getDiaVencimento() != null
        && !clienteImovel.getImovel().getDiaVencimento().equals(0)) {
      informarVencimentoAlternativoActionForm.setDiaVencimentoAtual(
          clienteImovel.getImovel().getDiaVencimento().toString());
    }

    FiltroVencimentoAlternativo filtroVencimentoAlternativo =
        new FiltroVencimentoAlternativo(FiltroVencimentoAlternativo.DATA_IMPLANTACAO);

    filtroVencimentoAlternativo.adicionarParametro(
        new ParametroSimples(
            FiltroVencimentoAlternativo.IMOVEL_ID, clienteImovel.getImovel().getId()));

    Collection<VencimentoAlternativo> vencimentosAlternativos =
        fachada.pesquisar(filtroVencimentoAlternativo, VencimentoAlternativo.class.getName());

    if (!Util.isVazioOrNulo(vencimentosAlternativos)) {

      VencimentoAlternativo vencimentoAlternativo = vencimentosAlternativos.iterator().next();

      informarVencimentoAlternativoActionForm.setDataAlteracaoVencimento("");

      if (vencimentoAlternativo.getDataImplantacao() != null) {
        informarVencimentoAlternativoActionForm.setDataAlteracaoVencimento(
            new SimpleDateFormat("dd/MM/yyyy").format(vencimentoAlternativo.getDataImplantacao()));
      }

      sessao.setAttribute("vencimentoAlternativo", vencimentoAlternativo);
    }

    sessao.setAttribute(
        "colecaoNovoDiaVencimento", criarColecaoNovoDiaPagamento(clienteImovel, sessao));

    if (clienteImovel.getImovel().getIndicadorVencimentoMesSeguinte() != null) {
      informarVencimentoAlternativoActionForm.setIndicadorVencimentoMesSeguinte(
          clienteImovel.getImovel().getIndicadorVencimentoMesSeguinte().toString());
    } else {
      informarVencimentoAlternativoActionForm.setIndicadorVencimentoMesSeguinte("2");
    }

    sessao.setAttribute("imovel", clienteImovel.getImovel());
  }