/**
   * consiste em pesquisar os tipos de débitos cadastrados no sistema
   *
   * <p>[UC0303] Pesquisar Tipo de Débito
   *
   * <p><Breve descrição sobre o subfluxo>
   *
   * <p><Identificador e nome do subfluxo>
   *
   * <p><Breve descrição sobre o fluxo secundário>
   *
   * <p><Identificador e nome do fluxo secundário>
   *
   * @author Administrador
   * @date 09/03/2006
   * @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 para a tela de pesquisar tipos de débitos
    ActionForward retorno = actionMapping.findForward("pesquisarTipoDebito");

    // cria uma instância da fachada
    Fachada fachada = Fachada.getInstancia();

    HttpSession sessao = httpServletRequest.getSession(false);

    // se essa variavel tiver algum valor, isso indica que apenas do Tipo de Financimento SERVIÇO
    // deve ser carregado na colecao
    String tipoFinanciamentoServico = "";

    if (httpServletRequest.getParameter("tipoFinanciamentoServico") != null
        && !httpServletRequest.getParameter("tipoFinanciamentoServico").equals("")) {
      tipoFinanciamentoServico = httpServletRequest.getParameter("tipoFinanciamentoServico");
      sessao.setAttribute(
          "tipoFinanciamentoServico", httpServletRequest.getParameter("tipoFinanciamentoServico"));
    } else if (sessao.getAttribute("tipoFinanciamentoServico") != null
        && !sessao.getAttribute("tipoFinanciamentoServico").equals("")) {
      tipoFinanciamentoServico = (String) sessao.getAttribute("tipoFinanciamentoServico");
    }

    PesquisarTipoDebitoActionForm pesquisarTipoDebitoActionForm =
        (PesquisarTipoDebitoActionForm) actionForm;
    if ((httpServletRequest.getParameter("limparForm") != null
            && httpServletRequest.getParameter("limparForm").equalsIgnoreCase("1"))
        || (httpServletRequest.getParameter("objetoConsulta") == null
            && httpServletRequest.getParameter("tipoConsulta") == null
            && httpServletRequest.getParameter("voltarPesquisa") == null)) {

      pesquisarTipoDebitoActionForm.setIdTipoDebito("");
      pesquisarTipoDebitoActionForm.setDescricao("");
      pesquisarTipoDebitoActionForm.setIdTipoFinanciamento(null);
      pesquisarTipoDebitoActionForm.setIdItemLancamentoContabil(null);
      pesquisarTipoDebitoActionForm.setIntervaloValorLimiteInicial("");
      pesquisarTipoDebitoActionForm.setIntervaloValorLimiteFinal("");
      pesquisarTipoDebitoActionForm.setTipoPesquisa(
          ConstantesSistema.TIPO_PESQUISA_INICIAL.toString());
    }

    // cria o filtro de lançamentos de item contábil para pesquisa
    FiltroLancamentoItemContabil filtroLancamentoItemContabil = new FiltroLancamentoItemContabil();

    // seta a ordenação do resultado da pesquisa de lançamentos de item contábil pela descrição
    filtroLancamentoItemContabil.setCampoOrderBy(FiltroLancamentoItemContabil.DESCRICAO);

    // pesquisa a coleção de lançamentos de item contábil no sistema
    Collection colecaoLancamentoItemContabil =
        fachada.pesquisar(filtroLancamentoItemContabil, LancamentoItemContabil.class.getName());

    // se nenhum lançamento de item contábil cadastrado no sistema
    if (colecaoLancamentoItemContabil == null || colecaoLancamentoItemContabil.isEmpty()) {
      // levanta a exceção para a próxima camada
      throw new ActionServletException(
          "atencao.naocadastrado", null, "Lançamento de Item Contábil");

    } else {
      // se existir lançamento de item contábil cadastrado(s) no sistema, manda
      // a coleção pesquisada no request para a página de pesquisar item de lançamento contábil
      httpServletRequest.setAttribute(
          "colecaoLancamentoItemContabil", colecaoLancamentoItemContabil);
    }

    // cria o filtro de tipo de financiamento para pesquisa
    FiltroFinanciamentoTipo filtroFinanciamentoTipo = new FiltroFinanciamentoTipo();

    // seta para pesquisar apenas o tipo de financiamento SERVIÇO
    if (tipoFinanciamentoServico != null && !tipoFinanciamentoServico.equals("")) {
      filtroFinanciamentoTipo.adicionarParametro(
          new ParametroSimples(FiltroFinanciamentoTipo.ID, FinanciamentoTipo.SERVICO_NORMAL));
    }
    // seta a ordenação do resultado da pesquisa de tipo de financiamento pela descrição
    filtroFinanciamentoTipo.setCampoOrderBy(FiltroFinanciamentoTipo.DESCRICAO);

    // pesquisa a coleção de tipo(s) de financiamento no sistema
    Collection colecaoFinanciamentoTipo =
        fachada.pesquisar(filtroFinanciamentoTipo, FinanciamentoTipo.class.getName());

    // se nenhum tipo de financiamento cadastrado no sistema
    if (colecaoFinanciamentoTipo == null || colecaoFinanciamentoTipo.isEmpty()) {
      // levanta a exceção para a próxima camada
      throw new ActionServletException("atencao.naocadastrado", null, "Tipo de Financiamento");

    } else {
      // se existir tipo(s) de financiamento cadastrado(s) no sistema, manda
      // a coleção pesquisada no request para a página de pesquisar tipo de financiamento
      httpServletRequest.setAttribute("colecaoFinanciamentoTipo", colecaoFinanciamentoTipo);
    }

    if (httpServletRequest.getParameter("caminhoRetornoTelaPesquisaTipoDebito") != null) {
      sessao.setAttribute(
          "caminhoRetornoTelaPesquisaTipoDebito",
          httpServletRequest.getParameter("caminhoRetornoTelaPesquisaTipoDebito"));
    }

    // retorna o mapeamento contido na variável "retorno"
    return retorno;
  }
  /**
   * Este caso de uso permite inserir um Tipo de Credito
   *
   * <p>[UC0515] Inserir Tipo de Credito
   *
   * @param actionMapping
   * @param actionForm
   * @param httpServletRequest
   * @param httpServletResponse
   * @return
   * @author Thiago Tenório
   */
  public ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    // Seta o retorno
    ActionForward retorno = actionMapping.findForward("telaSucesso");

    // Obtém a sessão
    HttpSession sessao = httpServletRequest.getSession(false);

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

    // Obtém a instância da fachada
    Fachada fachada = Fachada.getInstancia();

    InserirTipoCreditoActionForm inserirTipoCreditoActionForm =
        (InserirTipoCreditoActionForm) actionForm;

    String descricao = inserirTipoCreditoActionForm.getDescricao();
    String abreviatura = inserirTipoCreditoActionForm.getAbreviatura();
    String tipoLancamentoContabil = inserirTipoCreditoActionForm.getTipoLancamentoContabil();
    String indicadorgeracaoAutomaica = inserirTipoCreditoActionForm.getIndicadorgeracaoAutomaica();
    String valorLimiteCredito = inserirTipoCreditoActionForm.getValorLimiteCredito();

    CreditoTipo tipoCreditoInserir = new CreditoTipo();
    Collection colecaoPesquisa = null;

    sessao.removeAttribute("tipoPesquisaRetorno");

    if (Util.validarNumeroMaiorQueZERO(inserirTipoCreditoActionForm.getTipoLancamentoContabil())) {
      // Constrói o filtro para pesquisa do Tipo do Lançamento do Item Contábil
      FiltroLancamentoItemContabil filtroLancamentoItemContabil =
          new FiltroLancamentoItemContabil();
      filtroLancamentoItemContabil.adicionarParametro(
          new ParametroSimples(
              FiltroCreditoTipo.LANCAMENTO_ITEM_CONTABIL,
              inserirTipoCreditoActionForm.getTipoLancamentoContabil()));
    }

    // Descrição do Tipo de Crédito é obrigatório.
    if (descricao == null || descricao.equalsIgnoreCase("")) {
      throw new ActionServletException("atencao.required", null, "Descrição do Tipo de Crédito");
    }

    // Descrição do Tipo de Crédito Abreviada
    if (abreviatura != null && !abreviatura.equalsIgnoreCase("")) {
      tipoCreditoInserir.setDescricaoAbreviada(abreviatura);
    }

    // Valor Limite do Crédito é obrigatório.
    if (valorLimiteCredito == null || valorLimiteCredito.equalsIgnoreCase("")) {
      throw new ActionServletException("atencao.required", null, "Valor Limite do Crédito");
    }

    // indicador de Geração Automática do Crédito é obrigatório.
    if (indicadorgeracaoAutomaica == null || indicadorgeracaoAutomaica.equalsIgnoreCase("")) {
      throw new ActionServletException(
          "atencao.required", null, "indicador de Geração Automática do Crédito");
    }

    tipoCreditoInserir.setDescricao(descricao);
    tipoCreditoInserir.setDescricaoAbreviada(abreviatura);
    tipoCreditoInserir.setIndicadorGeracaoAutomatica(new Short(indicadorgeracaoAutomaica));
    valorLimiteCredito = valorLimiteCredito.replace(".", "");
    valorLimiteCredito = valorLimiteCredito.replace(",", ".");
    tipoCreditoInserir.setValorLimite(new BigDecimal(valorLimiteCredito));

    // Tipo do Lançamento do Item Contábil
    LancamentoItemContabil lancamentoItemContabil = new LancamentoItemContabil();
    if (tipoLancamentoContabil != null
        && !tipoLancamentoContabil.equalsIgnoreCase(
            String.valueOf(ConstantesSistema.NUMERO_NAO_INFORMADO))) {

      FiltroLancamentoItemContabil filtroLancamentoItemContabil =
          new FiltroLancamentoItemContabil();

      filtroLancamentoItemContabil.adicionarParametro(
          new ParametroSimples(FiltroLancamentoItemContabil.ID, tipoLancamentoContabil));

      filtroLancamentoItemContabil.adicionarParametro(
          new ParametroSimples(
              FiltroLancamentoItemContabil.INDICADOR_USO, ConstantesSistema.INDICADOR_USO_ATIVO));

      // Retorna Tipo do Lançamento do Item Contábil
      colecaoPesquisa =
          fachada.pesquisar(filtroLancamentoItemContabil, LancamentoItemContabil.class.getName());

      if (colecaoPesquisa == null || colecaoPesquisa.isEmpty()) {

        throw new ActionServletException("atencao.pesquisa_elo_nao_inexistente");
      } else {
        lancamentoItemContabil =
            (LancamentoItemContabil) Util.retonarObjetoDeColecao(colecaoPesquisa);
        if (lancamentoItemContabil.getId().intValue()
            != lancamentoItemContabil.getId().intValue()) {

          throw new ActionServletException("atencao.localidade_nao_e_elo");
        } else {
          tipoCreditoInserir.setLancamentoItemContabil(lancamentoItemContabil);
        }
      }
    }

    CreditoTipo creditoTipo = new CreditoTipo();
    creditoTipo.setLancamentoItemContabil(lancamentoItemContabil);

    // Ultima alteração
    tipoCreditoInserir.setUltimaAlteracao(new Date());

    // Pesquisa se a descrição informada já foi cadastrada
    FiltroCreditoTipo filtroCreditoTipo = new FiltroCreditoTipo();
    filtroCreditoTipo.adicionarParametro(
        new ParametroSimples(FiltroCreditoTipo.DESCRICAO, descricao));
    Collection colCreditoTipo = fachada.pesquisar(filtroCreditoTipo, CreditoTipo.class.getName());
    if (colCreditoTipo != null && !colCreditoTipo.isEmpty()) {
      throw new ActionServletException(
          "atencao.credito_tipo.descricao_ja_existente", null, descricao);
    }
    // *****************************************************

    // Pesquisa se a descrição abreviada informada já foi cadastrada
    filtroCreditoTipo = new FiltroCreditoTipo();
    filtroCreditoTipo.adicionarParametro(
        new ParametroSimples(FiltroCreditoTipo.DESCRICAO_ABREVIADA, abreviatura));
    colCreditoTipo = fachada.pesquisar(filtroCreditoTipo, CreditoTipo.class.getName());
    if (colCreditoTipo != null && !colCreditoTipo.isEmpty()) {
      throw new ActionServletException(
          "atencao.credito_tipo.abreviatura_ja_existente", null, abreviatura);
    }
    //	*****************************************************

    Integer idTipoCredito = null;

    tipoCreditoInserir.setIndicadorUso(1);

    idTipoCredito = fachada.inserirTipoCredito(tipoCreditoInserir, usuarioLogado);
    montarPaginaSucesso(
        httpServletRequest,
        "Tipo de Crédito de código  " + tipoCreditoInserir.getId() + " inserido com sucesso.",
        "Inserir outro Tipo de Crédito",
        "exibirInserirTipoCreditoAction.do?menu=sim",
        "exibirAtualizarTipoCreditoAction.do?idRegistroAtualizacao=" + idTipoCredito,
        "Atualizar Tipo de Crédito Inserido");

    // }

    // devolve o mapeamento de retorno
    return retorno;
  }