/**
   * Pesquisa Cliente
   *
   * @author Leonardo Regis
   * @date 23/09/2006
   * @param form
   * @param os
   */
  private void pesquisarCliente(EfetuarCorteLigacaoAguaActionForm form, OrdemServico ordemServico) {
    // Filtro para carregar o Cliente
    FiltroClienteImovel filtroClienteImovel = new FiltroClienteImovel();

    // Comentado por Raphael Rossiter em 28/02/2007
    // filtroClienteImovel.adicionarParametro(new ParametroSimples(FiltroClienteImovel.IMOVEL_ID,
    // ordemServico.getRegistroAtendimento().getImovel().getId()));
    filtroClienteImovel.adicionarParametro(
        new ParametroSimples(FiltroClienteImovel.IMOVEL_ID, ordemServico.getImovel().getId()));

    filtroClienteImovel.adicionarParametro(
        new ParametroSimples(FiltroClienteImovel.CLIENTE_RELACAO_TIPO, ClienteRelacaoTipo.USUARIO));
    filtroClienteImovel.adicionarParametro(new ParametroNulo(FiltroClienteImovel.DATA_FIM_RELACAO));
    filtroClienteImovel.adicionarCaminhoParaCarregamentoEntidade("cliente");

    Collection colecaoClienteImovel =
        this.getFachada().pesquisar(filtroClienteImovel, ClienteImovel.class.getName());
    if (colecaoClienteImovel != null && !colecaoClienteImovel.isEmpty()) {

      ClienteImovel clienteImovel = (ClienteImovel) colecaoClienteImovel.iterator().next();
      Cliente cliente = clienteImovel.getCliente();

      String documento = "";
      if (cliente.getCpf() != null && !cliente.getCpf().equals("")) {
        documento = cliente.getCpfFormatado();
      } else {
        documento = cliente.getCnpjFormatado();
      }
      // Cliente Nome/CPF-CNPJ
      form.setClienteUsuario(cliente.getNome());
      form.setCpfCnpjCliente(documento);
    } else {
      throw new ActionServletException("atencao.naocadastrado", null, "Cliente");
    }
  }
  /*
   * [FS0013 - Alteração de Valor]
   *
   * autor: Raphael Rossiter
   * data: 19/04/2007
   */
  private void permitirAlteracaoValor(
      ServicoTipo servicoTipo, EfetuarCorteLigacaoAguaActionForm form) {

    if (servicoTipo.getIndicadorPermiteAlterarValor()
        == ConstantesSistema.INDICADOR_USO_ATIVO.shortValue()) {

      form.setAlteracaoValor("OK");
    } else {
      form.setAlteracaoValor("");
    }
  }
  /**
   * Preencher dados do corte da ligação
   *
   * @author Leonardo Regis
   * @date 23/09/2006
   * @param sessao
   * @param form
   * @param os
   */
  private void pesquisarDadosCorteLigacao(
      HttpSession sessao, EfetuarCorteLigacaoAguaActionForm form, OrdemServico ordemServico) {
    // Data Encerramento
    if (ordemServico.getDataEncerramento() != null
        && !ordemServico.getDataEncerramento().equals("")) {
      form.setDataCorte(Util.formatarData(ordemServico.getDataEncerramento()));
    }

    // Comentado por Raphael Rossiter em 28/02/2007
    // Motivo do Corte
    /*if(ordemServico.getRegistroAtendimento().getImovel().getLigacaoAgua().getMotivoCorte() != null){
    	form.setMotivoCorte(""+ordemServico.getRegistroAtendimento().getImovel().getLigacaoAgua().getMotivoCorte().getId());
    }
    // Tipo do Corte
    if(ordemServico.getRegistroAtendimento().getImovel().getLigacaoAgua().getCorteTipo() != null) {
    	form.setTipoCorte(""+ordemServico.getRegistroAtendimento().getImovel().getLigacaoAgua().getCorteTipo().getId());
    }
    // Leitura do Corte
    HidrometroInstalacaoHistorico hidrometroInstalacaoHistorico =
    	ordemServico.getRegistroAtendimento().getImovel().getLigacaoAgua().getHidrometroInstalacaoHistorico();
    if(hidrometroInstalacaoHistorico != null &&
       hidrometroInstalacaoHistorico.getNumeroLeituraCorte() != null){
    	form.setNumLeituraCorte(""+hidrometroInstalacaoHistorico.getNumeroLeituraCorte());
    }
    // Número do Selo do Corte
    if(ordemServico.getRegistroAtendimento().getImovel().getLigacaoAgua().getNumeroSeloCorte() != null){
    	form.setNumSeloCorte(""+ordemServico.getRegistroAtendimento().getImovel().getLigacaoAgua().getNumeroSeloCorte());
    }*/

    if (ordemServico.getImovel().getLigacaoAgua().getMotivoCorte() != null) {
      form.setMotivoCorte("" + ordemServico.getImovel().getLigacaoAgua().getMotivoCorte().getId());
    }
    // Tipo do Corte
    if (ordemServico.getImovel().getLigacaoAgua().getCorteTipo() != null) {
      form.setTipoCorte("" + ordemServico.getImovel().getLigacaoAgua().getCorteTipo().getId());
    }
    // Leitura do Corte
    HidrometroInstalacaoHistorico hidrometroInstalacaoHistorico =
        ordemServico.getImovel().getLigacaoAgua().getHidrometroInstalacaoHistorico();
    if (hidrometroInstalacaoHistorico != null
        && hidrometroInstalacaoHistorico.getNumeroLeituraCorte() != null) {
      form.setNumLeituraCorte("" + hidrometroInstalacaoHistorico.getNumeroLeituraCorte());
    }
    // Número do Selo do Corte
    if (ordemServico.getImovel().getLigacaoAgua().getNumeroSeloCorte() != null) {
      form.setNumSeloCorte("" + ordemServico.getImovel().getLigacaoAgua().getNumeroSeloCorte());
    }
  }
  /**
   * Preencher dados do imóvel
   *
   * @author Leonardo Regis
   * @date 23/09/2006
   * @param form
   * @param os
   */
  private void preencherDadosImovel(
      EfetuarCorteLigacaoAguaActionForm form, OrdemServico ordemServico) {

    // Comentado por Raphael Rossiter em 28/02/2007
    // Imovel imovel= ordemServico.getRegistroAtendimento().getImovel();
    Imovel imovel = ordemServico.getImovel();

    // Matricula Imóvel
    form.setMatriculaImovel(imovel.getId().toString());
    // Inscrição Imóvel
    String inscricaoImovel = this.getFachada().pesquisarInscricaoImovel(imovel.getId());
    form.setInscricaoImovel(inscricaoImovel);
    // Situação da Ligação de Agua
    String situacaoLigacaoAgua = imovel.getLigacaoAguaSituacao().getDescricao();
    form.setSituacaoLigacaoAgua(situacaoLigacaoAgua);
    // Situação da Ligação de Esgoto
    String situacaoLigacaoEsgoto = imovel.getLigacaoEsgotoSituacao().getDescricao();
    form.setSituacaoLigacaoEsgoto(situacaoLigacaoEsgoto);
    // Cliente
    this.pesquisarCliente(form, ordemServico);
  }
  /**
   * [UC0355] Efetuar Corte de Ligação de Água
   *
   * @param actionMapping
   * @param actionForm
   * @param httpServletRequest
   * @param httpServletResponse
   * @return forward
   */
  public ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    ActionForward retorno = actionMapping.findForward("efetuarCorteLigacaoAgua");
    HttpSession sessao = httpServletRequest.getSession(false);
    EfetuarCorteLigacaoAguaActionForm form = (EfetuarCorteLigacaoAguaActionForm) actionForm;

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

    // Veio de Encerrar OS
    Boolean veioEncerrarOS = null;
    if (httpServletRequest.getAttribute("veioEncerrarOS") != null) {
      veioEncerrarOS = Boolean.TRUE;
    } else {
      if (form.getVeioEncerrarOS() != null && !form.getVeioEncerrarOS().equals("")) {

        if (form.getVeioEncerrarOS().toLowerCase().equals("true")) {
          veioEncerrarOS = veioEncerrarOS = Boolean.TRUE;
        } else {
          veioEncerrarOS = veioEncerrarOS = Boolean.FALSE;
        }
      } else {
        veioEncerrarOS = Boolean.FALSE;
      }
    }

    // Seta Coleções
    getMotivoCorteCollection(sessao);
    getTipoCorteCollection(sessao);
    getMotivoNaoCobrancaCollection(sessao);

    String idOrdemServico = null;
    if (form.getIdOrdemServico() != null) {
      idOrdemServico = form.getIdOrdemServico();
    } else {
      idOrdemServico = (String) httpServletRequest.getAttribute("veioEncerrarOS");
      form.setDataCorte((String) httpServletRequest.getAttribute("dataEncerramento"));
      sessao.setAttribute(
          "caminhoRetornoIntegracaoComercial",
          httpServletRequest.getAttribute("caminhoRetornoIntegracaoComercial"));
    }

    if (httpServletRequest.getAttribute("semMenu") != null) {
      sessao.setAttribute("semMenu", "SIM");
    } else {
      sessao.removeAttribute("semMenu");
    }

    // Testa OS
    if (idOrdemServico != null && !idOrdemServico.trim().equals("")) {
      OrdemServico ordemServico = this.getFachada().recuperaOSPorId(new Integer(idOrdemServico));
      if (ordemServico != null) {

        sessao.setAttribute("ordemServico", ordemServico);

        // Valida Exibição de Corte de Ligação de Água
        this.getFachada().validarExibirCorteLigacaoAgua(ordemServico, veioEncerrarOS);
        form.setVeioEncerrarOS("" + veioEncerrarOS);

        // OS
        form.setIdOrdemServico(ordemServico.getId() + "");
        form.setNomeOrdemServico(ordemServico.getServicoTipo().getDescricao());

        // Preencher dados do imovel
        this.preencherDadosImovel(form, ordemServico);

        // Preencher dados do Corte da Ligação
        this.pesquisarDadosCorteLigacao(sessao, form, ordemServico);

        // Preencher dados da Geração
        // Tipo Débito
        if (ordemServico.getServicoTipo().getDebitoTipo() != null) {
          form.setIdTipoDebito(ordemServico.getServicoTipo().getDebitoTipo().getId() + "");
          form.setDescricaoTipoDebito(
              ordemServico.getServicoTipo().getDebitoTipo().getDescricao() + "");
        } else {
          form.setIdTipoDebito("");
          form.setDescricaoTipoDebito("");
        }

        // [FS0013] - Alteração de Valor
        this.permitirAlteracaoValor(ordemServico.getServicoTipo(), form);

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

        BigDecimal valorDebito = new BigDecimal(0);
        SistemaParametro sistemaParametro = this.getFachada().pesquisarParametrosDoSistema();
        Integer qtdeParcelas = null;

        if (calculaValores != null && calculaValores.equals("S")) {

          // [UC0186] - Calcular Prestação
          BigDecimal taxaJurosFinanciamento = null;
          qtdeParcelas = new Integer(form.getQuantidadeParcelas());

          if (ordemServico.getServicoTipo().getIndicadorCobrarJuros()
                  == ConstantesSistema.SIM.shortValue()
              && qtdeParcelas.intValue() != 1) {

            taxaJurosFinanciamento = sistemaParametro.getPercentualTaxaJurosFinanciamento();
          } else {
            taxaJurosFinanciamento = new BigDecimal(0);
          }

          BigDecimal valorPrestacao = null;
          if (taxaJurosFinanciamento != null) {

            valorDebito = new BigDecimal(form.getValorDebito().replace(",", "."));

            String percentualCobranca = form.getPercentualCobranca();

            if (percentualCobranca.equals("70")) {
              valorDebito = valorDebito.multiply(new BigDecimal(0.7));
            } else if (percentualCobranca.equals("50")) {
              valorDebito = valorDebito.multiply(new BigDecimal(0.5));
            }

            valorPrestacao =
                this.getFachada()
                    .calcularPrestacao(
                        taxaJurosFinanciamento, qtdeParcelas, valorDebito, new BigDecimal("0.00"));

            valorPrestacao.setScale(2, BigDecimal.ROUND_HALF_UP);
          }

          if (valorPrestacao != null) {
            String valorPrestacaoComVirgula = Util.formataBigDecimal(valorPrestacao, 2, true);
            form.setValorParcelas(valorPrestacaoComVirgula);
          } else {
            form.setValorParcelas("0,00");
          }

        } else {

          valorDebito =
              this.getFachada()
                  .obterValorDebito(
                      ordemServico.getServicoTipo().getId(),
                      ordemServico.getImovel().getId(),
                      new Short(LigacaoTipo.LIGACAO_AGUA + ""));

          if (valorDebito != null) {
            String valorDebitoComVirgula = valorDebito + "";
            form.setValorDebito(valorDebitoComVirgula.replace(".", ","));
          } else {
            form.setValorDebito("0,00");
          }
        }

        form.setQtdeMaxParcelas(sistemaParametro.getNumeroMaximoParcelasFinanciamento() + "");
        if (ordemServico.getServicoNaoCobrancaMotivo() != null) {
          form.setMotivoNaoCobranca(ordemServico.getServicoNaoCobrancaMotivo().getId().toString());
        }
        if (ordemServico.getServicoNaoCobrancaMotivo() != null) {
          form.setPercentualCobranca(ordemServico.getPercentualCobranca().toString());
        }
        // Verificar permissão especial
        boolean temPermissaoMotivoNaoCobranca =
            this.getFachada().verificarPermissaoInformarMotivoNaoCobranca(usuarioLogado);

        if (temPermissaoMotivoNaoCobranca) {
          httpServletRequest.setAttribute(
              "permissaoMotivoNaoCobranca", temPermissaoMotivoNaoCobranca);
        } else {
          form.setPercentualCobranca("100");
          form.setQuantidadeParcelas("1");
          form.setValorParcelas(Util.formataBigDecimal(valorDebito, 2, true));
        }

        sessao.setAttribute("osEncontrada", "true");
      } else {
        sessao.removeAttribute("osEncontrada");
        sessao.removeAttribute("ordemServico");
        form.setNomeOrdemServico("Ordem de Serviço inexistente");
        form.setIdOrdemServico("");
      }

    } else {
      httpServletRequest.setAttribute("nomeCampo", "idOrdemServico");
      form.reset();
    }

    return retorno;
  }