/**
   * [UC0393] Atualizar Valor de Cobrança do Serviço
   *
   * <p>Este caso de uso permite alterar um valor de cobrança de serviço
   *
   * @author Rômulo Aurélio - Hugo Loenardo
   * @date 31/10/2006 - 22/04/2010
   * @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("atualizarValorCobrancaServico");

    HttpSession sessao = httpServletRequest.getSession(false);

    AtualizarValorCobrancaServicoActionForm form =
        (AtualizarValorCobrancaServicoActionForm) actionForm;

    Fachada fachada = Fachada.getInstancia();

    ServicoCobrancaValor servicoCobrancaValor = null;

    String idServicoCobrancaValor = (String) sessao.getAttribute("idRegistroAtualizar");

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

      FiltroServicoCobrancaValor filtroServicoCobrancaValor = new FiltroServicoCobrancaValor();

      filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade("servicoTipo");
      filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade(
          FiltroServicoCobrancaValor.CATEGORIA_ENTIDADE);
      filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade(
          FiltroServicoCobrancaValor.SUBCATEGORIA_ENTIDADE);
      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(FiltroServicoCobrancaValor.ID, new Integer(idServicoCobrancaValor)));

      servicoCobrancaValor =
          (ServicoCobrancaValor)
              fachada
                  .pesquisar(filtroServicoCobrancaValor, ServicoCobrancaValor.class.getName())
                  .iterator()
                  .next();

      idServicoCobrancaValor = servicoCobrancaValor.getId().toString();
    }

    if (servicoCobrancaValor == null) {

      FiltroServicoCobrancaValor filtroServicoCobrancaValor = new FiltroServicoCobrancaValor();

      filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade("servicoTipo");
      filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade(
          FiltroServicoCobrancaValor.CATEGORIA_ENTIDADE);
      filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade(
          FiltroServicoCobrancaValor.SUBCATEGORIA_ENTIDADE);
      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(
              FiltroServicoCobrancaValor.ID, new Integer(form.getIdServicoCobrancaValor())));

      servicoCobrancaValor =
          (ServicoCobrancaValor)
              fachada
                  .pesquisar(filtroServicoCobrancaValor, ServicoCobrancaValor.class.getName())
                  .iterator()
                  .next();
    }

    if ((httpServletRequest.getParameter("manter") != null
            && httpServletRequest.getParameter("manter").toString().equals("sim"))
        || (httpServletRequest.getAttribute("manter") != null
            && httpServletRequest.getAttribute("manter").toString().equals("sim"))) {

      form.setIdServicoCobrancaValor(servicoCobrancaValor.getId().toString());
      form.setTipoServico(servicoCobrancaValor.getServicoTipo().getId().toString());
      form.setNomeTipoServico(servicoCobrancaValor.getServicoTipo().getDescricao());
      form.setIndicadorMedido("" + servicoCobrancaValor.getIndicadorMedido());
      form.setIndicativoTipoSevicoEconomias(
          servicoCobrancaValor.getIndicadorConsideraEconomias().toString());

      String dataVigenciaInicial = Util.formatarData(servicoCobrancaValor.getDataVigenciaInicial());
      String dataVigenciaFinal = Util.formatarData(servicoCobrancaValor.getDataVigenciaFinal());
      String valorServico = Util.formatarMoedaReal(servicoCobrancaValor.getValor());

      if (servicoCobrancaValor.getId() != null && !servicoCobrancaValor.getId().equals("")) {
        form.setIdServicoCobrancaValor(servicoCobrancaValor.getId().toString());
      }

      if (servicoCobrancaValor.getServicoTipo().getId() != null
          && !servicoCobrancaValor.getServicoTipo().getId().equals("")) {
        form.setTipoServico(servicoCobrancaValor.getServicoTipo().getId().toString());
      }

      if (servicoCobrancaValor.getServicoTipo().getDescricao() != null
          && !servicoCobrancaValor.getServicoTipo().getDescricao().equals("")) {

        form.setNomeTipoServico(servicoCobrancaValor.getServicoTipo().getDescricao());
      }

      if (servicoCobrancaValor.getSubCategoria() != null
              && !servicoCobrancaValor.getSubCategoria().getId().equals("-1")
              && form.getIdSubCategoria() == null
          || (httpServletRequest.getParameter("desfazer") != null
              && httpServletRequest.getParameter("desfazer").toString().equalsIgnoreCase("S"))) {

        form.setIdSubCategoria(servicoCobrancaValor.getSubCategoria().getId().toString());
      }

      if (servicoCobrancaValor.getCategoria() != null
              && !servicoCobrancaValor.getCategoria().getId().equals("-1")
              && form.getIdCategoria() == null
          || (httpServletRequest.getParameter("desfazer") != null
              && httpServletRequest.getParameter("desfazer").toString().equalsIgnoreCase("S"))) {

        form.setIdCategoria(servicoCobrancaValor.getCategoria().getId().toString());
      }

      if (servicoCobrancaValor.getHidrometroCapacidade() != null
          && servicoCobrancaValor.getHidrometroCapacidade().getId() != null
          && !servicoCobrancaValor.getHidrometroCapacidade().getId().equals("")) {

        form.setCapacidadeHidrometro(
            servicoCobrancaValor.getHidrometroCapacidade().getId().toString());
      }

      if (servicoCobrancaValor.getImovelPerfil() != null
          && servicoCobrancaValor.getImovelPerfil().getId() != null
          && !servicoCobrancaValor.getImovelPerfil().getId().equals("-1")) {

        form.setPerfilImovel(servicoCobrancaValor.getImovelPerfil().getId().toString());
        form.setIndicadorMedido("" + servicoCobrancaValor.getIndicadorMedido());
      }

      if (servicoCobrancaValor.getSubCategoria() != null
          && servicoCobrancaValor.getSubCategoria().getId() != null
          && !servicoCobrancaValor.getSubCategoria().getId().equals("-1")) {

        form.setIdSubCategoria(servicoCobrancaValor.getSubCategoria().getId().toString());
      }

      if (servicoCobrancaValor.getValor() != null && !servicoCobrancaValor.getValor().equals("")) {

        form.setValorServico(valorServico);
      }

      if (servicoCobrancaValor.getDataVigenciaInicial() != null
          && !servicoCobrancaValor.getDataVigenciaInicial().equals("")) {

        form.setDataVigenciaInicial(dataVigenciaInicial);
      }

      if (servicoCobrancaValor.getDataVigenciaFinal() != null
          && !servicoCobrancaValor.getDataVigenciaFinal().equals("")) {

        form.setDataVigenciaFinal(dataVigenciaFinal);
      }

      if (servicoCobrancaValor.getIndicadorConsideraEconomias() != null
          && !servicoCobrancaValor.getIndicadorConsideraEconomias().equals("")) {

        form.setIndicativoTipoSevicoEconomias(
            servicoCobrancaValor.getIndicadorConsideraEconomias().toString());
      }

      if (servicoCobrancaValor.getQuantidadeEconomiasInicial() != null
          && !servicoCobrancaValor.getQuantidadeEconomiasInicial().equals("")) {

        form.setQuantidadeEconomiasInicial(
            servicoCobrancaValor.getQuantidadeEconomiasInicial().toString());
      }

      if (servicoCobrancaValor.getQuantidadeEconomiasFinal() != null
          && !servicoCobrancaValor.getQuantidadeEconomiasFinal().equals("")) {

        form.setQuantidadeEconomiasFinal(
            servicoCobrancaValor.getQuantidadeEconomiasFinal().toString());
      }
      if (servicoCobrancaValor.getIndicadorGeracaoDebito() != null
          && !servicoCobrancaValor.getIndicadorConsideraEconomias().toString().equals("")) {
        form.setIndicadorGeracaoDebito(servicoCobrancaValor.getIndicadorGeracaoDebito().toString());
      }
    }

    Date timeStamp = servicoCobrancaValor.getUltimaAlteracao();

    sessao.setAttribute("idServicoCobrancaValor", idServicoCobrancaValor);
    sessao.setAttribute("servicoCobrancaValor", servicoCobrancaValor);
    sessao.setAttribute("timeStamp", timeStamp);
    sessao.setAttribute("servicoTipo", servicoCobrancaValor.getServicoTipo());
    sessao.setAttribute("subCategoria", servicoCobrancaValor.getSubCategoria());
    sessao.setAttribute("imovelPerfil", servicoCobrancaValor.getImovelPerfil());
    sessao.setAttribute("indicadorMedido", servicoCobrancaValor.getIndicadorMedido());
    sessao.setAttribute("hidrometroCapacidade", servicoCobrancaValor.getHidrometroCapacidade());
    sessao.setAttribute("valor", servicoCobrancaValor.getValor());
    sessao.setAttribute("dataVigenciaInicial", servicoCobrancaValor.getDataVigenciaInicial());
    sessao.setAttribute("dataVigenciaFinal", servicoCobrancaValor.getDataVigenciaFinal());
    sessao.setAttribute(
        "indicadorConsideraEconomias", servicoCobrancaValor.getIndicadorConsideraEconomias());
    sessao.setAttribute(
        "quantidadeEconomiasInicial", servicoCobrancaValor.getQuantidadeEconomiasInicial());
    sessao.setAttribute(
        "quantidadeEconomiasFinal", servicoCobrancaValor.getQuantidadeEconomiasFinal());

    httpServletRequest.setAttribute("idServicoCobrancaValor", form.getIdServicoCobrancaValor());

    // Pesquisar Categoria
    this.pesquisarCategoria(httpServletRequest, form);

    // pesquisar SubCategoria
    this.pesquisarSubCategoria(httpServletRequest, form);

    if (form.getIndicadorMedido() != null
        && form.getIndicadorMedido().equals(ConstantesSistema.SIM.toString())) {
      if ((form.getIdCategoria() != null
              && !form.getIdCategoria().equals(ConstantesSistema.NUMERO_NAO_INFORMADO + ""))
          || (form.getIdSubCategoria() != null
              && !form.getIdSubCategoria().equals(ConstantesSistema.NUMERO_NAO_INFORMADO + ""))) {
        sessao.setAttribute("capacidadeObrigatoria", "sim");
      } else {
        sessao.setAttribute("capacidadeObrigatoria", "nao");
      }
    } else {
      sessao.setAttribute("capacidadeObrigatoria", "nao");
    }

    if (form.getIndicadorGeracaoDebito() != null
        && form.getIndicadorGeracaoDebito().equals(ConstantesSistema.SIM.toString())) {
      sessao.setAttribute("valorObrigatorio", "sim");
    } else {
      sessao.setAttribute("valorObrigatorio", "nao");
    }

    return retorno;
  }
  /**
   * [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;
  }