/**
   * [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;
  }
  /**
   * [UC0392] Filtrar Valor de Cobrança do Serviço
   *
   * <p>Este caso de uso cria um filtro que será usado na pesquisa do Valor de Cobrança de Serviço
   *
   * @author Rômulo Aurélio
   * @date 30/10/2006
   * @param actionMapping
   * @param actionForm
   * @param httpServletRequest
   * @param httpServletResponse
   * @return
   */
  public ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    ActionForward retorno = actionMapping.findForward("exibirManterValorCobrancaServicoAction");

    FiltrarValorCobrancaServicoActionForm form = (FiltrarValorCobrancaServicoActionForm) actionForm;

    FiltroServicoCobrancaValor filtroServicoCobrancaValor = new FiltroServicoCobrancaValor();

    HttpSession sessao = httpServletRequest.getSession(false);

    Fachada fachada = Fachada.getInstancia();

    boolean peloMenosUmParametroInformado = false;

    String tipoServico = form.getTipoServico();
    String perfilImovel = form.getPerfilImovel();
    String indicadorMedido = form.getIndicadorMedido();
    String capacidadeHidrometro = form.getCapacidadeHidrometro();
    String valorServicoInicial = form.getValorServicoInicial();
    String valorServicoFinal = form.getValorServicoFinal();
    String quantidadeEconomiaInicial = form.getQuantidadeEconomiasInicial();
    String quantidadeEconomiaFinal = form.getQuantidadeEconomiasFinal();
    String categoria = form.getIdCategoria();
    String subCategoria = form.getIdSubCategoria();
    String indicadorGeracaoDebito = form.getIndicadorGeracaoDebito();
    String indicativoTipoSevicoEconomias = form.getIndicativoTipoSevicoEconomias();

    // Verifica se o campo tipoServico foi informado
    if (categoria != null
        && !categoria.trim().equals("" + ConstantesSistema.NUMERO_NAO_INFORMADO)) {
      peloMenosUmParametroInformado = true;

      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(FiltroServicoCobrancaValor.CATEGORIA, categoria));
    }

    if (subCategoria != null
        && !subCategoria.trim().equals("" + ConstantesSistema.NUMERO_NAO_INFORMADO)) {
      peloMenosUmParametroInformado = true;

      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(FiltroServicoCobrancaValor.SUBCATEGORIA, subCategoria));
    }

    if (tipoServico != null && !tipoServico.trim().equalsIgnoreCase("")) {

      peloMenosUmParametroInformado = true;

      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(FiltroServicoCobrancaValor.SERVICOTIPO, tipoServico));
    }

    if (quantidadeEconomiaInicial != null
        && !quantidadeEconomiaInicial.equals("")
        && quantidadeEconomiaFinal != null
        && !quantidadeEconomiaFinal.equals("")) {

      filtroServicoCobrancaValor.adicionarParametro(
          new Intervalo(
              FiltroServicoCobrancaValor.QUANTIDADE_ECONOMIA_INICIAL,
              quantidadeEconomiaInicial,
              quantidadeEconomiaFinal));
    }

    filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade("servicoTipo");

    if (indicativoTipoSevicoEconomias != null && !indicativoTipoSevicoEconomias.equals("3")) {

      peloMenosUmParametroInformado = true;

      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(
              FiltroServicoCobrancaValor.INDICATIVOSERVICOECONOMIA, indicativoTipoSevicoEconomias));
    }

    // Verifica se o campo perfilImovel foi informado
    if (perfilImovel != null && !perfilImovel.trim().equals("-1")) {

      peloMenosUmParametroInformado = true;

      filtroServicoCobrancaValor.adicionarParametro(
          new ComparacaoTexto(FiltroServicoCobrancaValor.IMOVELPERFIL, perfilImovel));
    }

    // Verifica se o campo Data vigencia inicial foi informado
    if (Util.verificarNaoVazio(form.getDataVigenciaInicial())) {

      peloMenosUmParametroInformado = true;

      Date periodoInicialVigencia = Util.converteStringParaDate(form.getDataVigenciaInicial());

      Date periodoFinalVigencia = Util.converteStringParaDate(form.getDataVigenciaFinal());

      Calendar diInicio = Calendar.getInstance();
      diInicio.setTime(periodoInicialVigencia);
      diInicio.set(Calendar.HOUR, 0);
      diInicio.set(Calendar.MINUTE, 0);
      diInicio.set(Calendar.SECOND, 0);

      Calendar diFim = Calendar.getInstance();
      diFim.setTime(periodoFinalVigencia);
      diFim.set(Calendar.HOUR, 23);
      diFim.set(Calendar.MINUTE, 59);
      diFim.set(Calendar.SECOND, 59);

      filtroServicoCobrancaValor.adicionarParametro(
          new MaiorQue(FiltroServicoCobrancaValor.DATA_INICIO_RELACAO, diInicio.getTime()));

      filtroServicoCobrancaValor.adicionarParametro(
          new MenorQue(FiltroServicoCobrancaValor.DATA_FIM_RELACAO, diFim.getTime()));
    }

    // Verifica se o campo indicadorMedido foi informado
    if (indicadorMedido != null && !indicadorMedido.trim().equals("3")) {

      peloMenosUmParametroInformado = true;
      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(FiltroServicoCobrancaValor.INDICADORMEDIDO, indicadorMedido));
    }

    // Verifica se o campo capacidadeHidrometro foi informado
    if (capacidadeHidrometro != null
        && !capacidadeHidrometro.trim().equals("" + ConstantesSistema.NUMERO_NAO_INFORMADO)) {
      peloMenosUmParametroInformado = true;
      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(
              FiltroServicoCobrancaValor.HIDROMETROCAPACIDADE, capacidadeHidrometro));

      filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade("hidrometroCapacidade");
    }
    if (indicadorGeracaoDebito != null && indicadorGeracaoDebito.trim().equalsIgnoreCase("1")) {
      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(
              FiltroServicoCobrancaValor.INDICADOR_GERACAO_DEBITO, ConstantesSistema.SIM));

      if (valorServicoInicial != null
          && !valorServicoInicial.trim().equalsIgnoreCase("")
          && valorServicoFinal != null
          && !valorServicoFinal.trim().equalsIgnoreCase("")) {

        BigDecimal valorInicial =
            new BigDecimal(valorServicoInicial.replace(".", "").replace(",", "."));

        BigDecimal valorFinal =
            new BigDecimal(valorServicoFinal.replace(".", "").replace(",", "."));

        Integer resultado = valorInicial.compareTo(valorFinal);

        if (resultado == 1) {
          throw new ActionServletException(
              "atencao.valor_cobranca_servico_final_menor_valor_inicial");
        }

        filtroServicoCobrancaValor.adicionarParametro(
            new Intervalo(
                FiltroDebitoTipoVigencia.VALOR,
                Util.formatarMoedaRealparaBigDecimal(valorServicoInicial),
                Util.formatarMoedaRealparaBigDecimal(valorServicoFinal)));
      }

      peloMenosUmParametroInformado = true;

    } else if (indicadorGeracaoDebito != null
        && indicadorGeracaoDebito.trim().equalsIgnoreCase("2")) {
      filtroServicoCobrancaValor.adicionarParametro(
          new ParametroSimples(
              FiltroServicoCobrancaValor.INDICADOR_GERACAO_DEBITO, ConstantesSistema.NAO));

      peloMenosUmParametroInformado = true;
    }

    filtroServicoCobrancaValor.adicionarCaminhoParaCarregamentoEntidade("imovelPerfil");
    filtroServicoCobrancaValor.setCampoOrderBy(FiltroServicoCobrancaValor.SERVICOTIPO);

    // Erro caso o usuário mandou Pesquisar sem nenhum parâmetro
    if (!peloMenosUmParametroInformado) {
      throw new ActionServletException("atencao.filtro.nenhum_parametro_informado");
    }

    Collection<ServicoCobrancaValor> colecaoServicoCobrancaValor =
        fachada.pesquisar(filtroServicoCobrancaValor, ServicoCobrancaValor.class.getName());

    // Verifica se o checkbox Atualizar está marcado e em caso afirmativo
    // manda pelo um request uma variável para o
    // ExibirManterValorCobrancaServicoAction para nele verificar se irá
    // para o
    // atualizar ou para o manter
    if (form.getAtualizar() != null && form.getAtualizar().equalsIgnoreCase("1")) {
      httpServletRequest.setAttribute("atualizar", form.getAtualizar());
    }

    if (colecaoServicoCobrancaValor == null || colecaoServicoCobrancaValor.isEmpty()) {
      throw new ActionServletException(
          "atencao.pesquisa.nenhumresultado", null, "Servico Cobranca Valor");
    } else {
      httpServletRequest.setAttribute("colecaoServicoCobrancaValor", colecaoServicoCobrancaValor);
      ServicoCobrancaValor servicoCobrancaValor = new ServicoCobrancaValor();
      servicoCobrancaValor =
          (ServicoCobrancaValor) Util.retonarObjetoDeColecao(colecaoServicoCobrancaValor);
      String idRegistroAtualizar = servicoCobrancaValor.getId().toString();
      sessao.setAttribute("idRegistroAtualizar", idRegistroAtualizar);
    }

    sessao.setAttribute("filtroServicoCobrancaValor", filtroServicoCobrancaValor);

    httpServletRequest.setAttribute("filtroServicoCobrancaValor", filtroServicoCobrancaValor);

    return retorno;
  }