/**
   * Description of the Method
   *
   * @param actionMapping Description of the Parameter
   * @param actionForm Description of the Parameter
   * @param httpServletRequest Description of the Parameter
   * @param httpServletResponse Description of the Parameter
   * @return Description of the Return Value
   */
  public ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    // localiza o action no objeto actionmapping
    ActionForward retorno = actionMapping.findForward("telaSucesso");
    HttpSession sessao = httpServletRequest.getSession(false);

    EfetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm
        efetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm =
            (EfetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm) actionForm;
    Fachada fachada = Fachada.getInstancia();

    // Usuario logado no sistema
    Usuario usuario = (Usuario) sessao.getAttribute("usuarioLogado");

    String ordemServicoId =
        efetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm.getIdOrdemServico();

    HidrometroInstalacaoHistorico hidrometroInstalacaoHistorico =
        new HidrometroInstalacaoHistorico();
    hidrometroInstalacaoHistorico =
        this.setDadosHidrometroInstalacaoHistorico(
            hidrometroInstalacaoHistorico,
            efetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm);

    Imovel imovel = null;

    if (ordemServicoId != null && !ordemServicoId.equals("")) {

      OrdemServico ordemServico = (OrdemServico) sessao.getAttribute("ordemServico");

      if (ordemServico == null) {
        throw new ActionServletException(
            "atencao.ordem_servico_inexistente", null, "ORDEM DE SERVIÇO INEXISTENTE");
      }

      if (sessao.getAttribute("imovel") != null) {
        imovel = (Imovel) sessao.getAttribute("imovel");

        FiltroImovel filtroImovel = new FiltroImovel();
        filtroImovel.adicionarCaminhoParaCarregamentoEntidade(
            "localidade.hidrometroLocalArmazenagem");
        filtroImovel.adicionarParametro(new ParametroSimples(FiltroImovel.ID, imovel.getId()));

        Collection colecaoImoveis = fachada.pesquisar(filtroImovel, Imovel.class.getName());

        Imovel imovelComLocalidade = (Imovel) Util.retonarObjetoDeColecao(colecaoImoveis);

        if (imovelComLocalidade != null
            && imovelComLocalidade.getLocalidade().getHidrometroLocalArmazenagem() != null
            && hidrometroInstalacaoHistorico.getHidrometro().getHidrometroLocalArmazenagem() != null
            && !hidrometroInstalacaoHistorico
                .getHidrometro()
                .getHidrometroLocalArmazenagem()
                .getId()
                .equals(
                    imovelComLocalidade.getLocalidade().getHidrometroLocalArmazenagem().getId())) {
          throw new ActionServletException(
              "atencao.hidrometro_local_armazenagem_imovel_diferente_hidrometro_local_armazenagem_hidrometro");
        }

        imovel.setUltimaAlteracao(new Date());
      }

      FiltroLigacaoAgua filtroLigacaoAgua = new FiltroLigacaoAgua();
      filtroLigacaoAgua.adicionarParametro(
          new ParametroSimples(FiltroLigacaoAgua.ID, imovel.getId()));

      Collection colecaoLigacoesAgua =
          fachada.pesquisar(filtroLigacaoAgua, LigacaoAgua.class.getName());

      LigacaoAgua ligacaoAgua = (LigacaoAgua) Util.retonarObjetoDeColecao(colecaoLigacoesAgua);

      ligacaoAgua.setDataRestabelecimentoAgua(
          Util.converteStringParaDate(
              efetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm
                  .getDataRestabelecimento()));

      hidrometroInstalacaoHistorico.setLigacaoAgua(ligacaoAgua);

      ordemServico =
          this.setDadosOrdemServico(
              ordemServico, efetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm);

      String qtdParcelas =
          efetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm
              .getQuantidadeParcelas();

      IntegracaoComercialHelper integracaoComercialHelper = new IntegracaoComercialHelper();

      integracaoComercialHelper.setLigacaoAgua(ligacaoAgua);
      integracaoComercialHelper.setImovel(imovel);
      integracaoComercialHelper.setOrdemServico(ordemServico);
      integracaoComercialHelper.setQtdParcelas(qtdParcelas);
      integracaoComercialHelper.setHidrometroInstalacaoHistorico(hidrometroInstalacaoHistorico);

      if (efetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroActionForm
          .getVeioEncerrarOS()
          .equalsIgnoreCase("FALSE")) {
        integracaoComercialHelper.setVeioEncerrarOS(Boolean.FALSE);

        fachada.efetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometro(
            integracaoComercialHelper, usuario);
      } else {
        integracaoComercialHelper.setVeioEncerrarOS(Boolean.TRUE);
        sessao.setAttribute("integracaoComercialHelper", integracaoComercialHelper);

        if (sessao.getAttribute("semMenu") == null) {
          retorno = actionMapping.findForward("encerrarOrdemServicoAction");
        } else {
          retorno = actionMapping.findForward("encerrarOrdemServicoPopupAction");
        }
        sessao.removeAttribute("caminhoRetornoIntegracaoComercial");
      }
      if (retorno.getName().equalsIgnoreCase("telaSucesso")) {
        // Monta a página de sucesso
        montarPaginaSucesso(
            httpServletRequest,
            "Restabelecimento da Ligação de Água com Instalação de Hidrômetro efetuada com Sucesso",
            "Efetuar outro Restabelecimento da Ligação de Água com Instalação de Hidrômetro",
            "exibirEfetuarRestabelecimentoLigacaoAguaComInstalacaoHidrometroAction.do?menu=sim");
      }

      return retorno;
    } else {
      throw new ActionServletException("atencao.informe_campo", null, "Ordem de Serviço");
    }
  }