/**
   * 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");
    }
  }
  /**
   * @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("exibirManterGuiaDevolucaoCliente");

    HttpSession sessao = httpServletRequest.getSession(false);

    Fachada fachada = Fachada.getInstancia();

    ManterGuiaDevolucaoActionForm manterGuiaDevolucaoActionForm =
        (ManterGuiaDevolucaoActionForm) actionForm;

    // Limpa o atributo se o usuário voltou para o manter
    if (sessao.getAttribute("guiaDevolucaoAtualizar") != null) {
      sessao.removeAttribute("guiaDevolucaoAtualizar");
    }
    FiltroGuiaDevolucao filtroGuiaDevolucao = null;

    if (sessao.getAttribute("filtroGuiaDevolucaoCliente") != null) {
      filtroGuiaDevolucao = (FiltroGuiaDevolucao) sessao.getAttribute("filtroGuiaDevolucaoCliente");
      sessao.setAttribute("filtroGuiaDevolucaoCliente", filtroGuiaDevolucao);
      Cliente cliente = (Cliente) sessao.getAttribute("cliente");
      sessao.setAttribute("cliente", cliente);

      manterGuiaDevolucaoActionForm.setIdCliente(cliente.getId().toString());
      manterGuiaDevolucaoActionForm.setNomeCliente(cliente.getNome());

      // Verifica o tipo do cliente para setar o cpf ou cnpj e profissão
      // ou ramo atividade
      if (cliente.getClienteTipo().getId().equals(ClienteTipo.INDICADOR_PESSOA_FISICA)) {
        manterGuiaDevolucaoActionForm.setCpfCnpj(cliente.getCpfFormatado());
        if (cliente.getProfissao() != null) {
          manterGuiaDevolucaoActionForm.setProfissao(cliente.getProfissao().getDescricao());
        }
      } else {
        manterGuiaDevolucaoActionForm.setCpfCnpj(cliente.getCnpjFormatado());
        if (cliente.getRamoAtividade() != null) {
          manterGuiaDevolucaoActionForm.setRamoAtividade(cliente.getRamoAtividade().getDescricao());
        }
      }

    } else {
      filtroGuiaDevolucao = (FiltroGuiaDevolucao) sessao.getAttribute("filtroGuiaDevolucaoImovel");
      sessao.setAttribute("filtroGuiaDevolucaoImovel", filtroGuiaDevolucao);
      Imovel imovel = (Imovel) sessao.getAttribute("imovel");
      sessao.setAttribute("imovel", imovel);

      manterGuiaDevolucaoActionForm.setIdImovel(imovel.getId().toString());
      manterGuiaDevolucaoActionForm.setInscricao(imovel.getInscricaoFormatada());

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

      Collection colecaoClienteImovel =
          fachada.pesquisar(filtroClienteImovel, ClienteImovel.class.getName());

      if (colecaoClienteImovel != null && !colecaoClienteImovel.isEmpty()) {
        ClienteImovel clienteImovel = (ClienteImovel) colecaoClienteImovel.iterator().next();
        manterGuiaDevolucaoActionForm.setNomeCliente(clienteImovel.getCliente().getNome());
      }

      if (imovel.getLigacaoAguaSituacao() != null) {
        manterGuiaDevolucaoActionForm.setSituacaoLigacaoAgua(
            imovel.getLigacaoAguaSituacao().getDescricao());
      }

      if (imovel.getLigacaoEsgotoSituacao() != null) {
        manterGuiaDevolucaoActionForm.setSituacaoLigacaoEsgoto(
            imovel.getLigacaoEsgotoSituacao().getDescricao());
      }

      retorno = actionMapping.findForward("exibirManterGuiaDevolucaoImovel");
    }

    // 1º Passo - Pegar o total de registros através de um count da consulta
    // que aparecerá na tela
    Integer totalRegistros = fachada.pesquisarGuiaDevolucaoCount(filtroGuiaDevolucao);

    // 2º Passo - Chamar a função de Paginação passando o total de registros
    retorno = this.controlarPaginacao(httpServletRequest, retorno, totalRegistros);

    // 3º Passo - Obter a coleção da consulta que aparecerá na tela passando
    // o numero de paginas
    // da pesquisa que está no request
    // Faz os carregamentos necessários
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade(
        "registroAtendimento.imovel.localidade");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade(
        "registroAtendimento.imovel.setorComercial");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade(
        "registroAtendimento.imovel.quadra");
    //		filtroGuiaDevolucao
    //				.adicionarCaminhoParaCarregamentoEntidade("registroAtendimento.cliente");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade(
        "ordemServico.servicoTipo.debitoTipo");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("localidade");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("debitoTipo");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("imovel.localidade");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("imovel.setorComercial");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("imovel.quadra");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("cliente");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("conta");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("guiaPagamento.debitoTipo");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade(
        "debitoACobrarGeral.debitoACobrar.debitoTipo");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("creditoTipo");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("documentoTipo");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("debitoCreditoSituacaoAtual");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("debitoCreditoSituacaoAnterior");
    filtroGuiaDevolucao.adicionarCaminhoParaCarregamentoEntidade("lancamentoItemContabil");

    filtroGuiaDevolucao.setCampoOrderBy(
        FiltroGuiaDevolucao.CREDITO_TIPO_ID, FiltroGuiaDevolucao.DOCUMENTO_TIPO_ID);

    Collection colecaoGuiaDevolucao =
        fachada.pesquisarGuiaDevolucao(
            filtroGuiaDevolucao,
            ((Integer) httpServletRequest.getAttribute("numeroPaginasPesquisa")));

    filtroGuiaDevolucao.limparCamposOrderBy();

    if (colecaoGuiaDevolucao != null && !colecaoGuiaDevolucao.isEmpty()) {
      //			if (colecaoGuiaDevolucao.size() == 1
      //					&& (httpServletRequest.getParameter("page.offset") == null || httpServletRequest
      //							.getParameter("page.offset").equals("1"))) {
      //				if (httpServletRequest.getParameter("atualizar") != null) {
      //					retorno = actionMapping
      //							.findForward("exibirAtualizarGuiaDevolucao");
      //					GuiaDevolucao guiaDevolucao = (GuiaDevolucao) colecaoGuiaDevolucao
      //							.iterator().next();
      //					sessao.setAttribute("guiaDevolucao", guiaDevolucao);
      //				} else {
      //					httpServletRequest.setAttribute("colecaoGuiaDevolucao",
      //							colecaoGuiaDevolucao);
      //				}
      //			} else {
      httpServletRequest.setAttribute("colecaoGuiaDevolucao", colecaoGuiaDevolucao);
      //			}
    } else {
      // Nenhuma resolução de diretoria cadastrada
      throw new ActionServletException("atencao.pesquisa.nenhumresultado");
    }

    return retorno;
  }
  /**
   * Este método seta as informações a serem exibidas para o usuário no form e na sessão, para que a
   * JSP responsável processe os dados.
   *
   * @since 22/10/2009
   * @author Marlon Patrick
   */
  private void setarDadosFormESessao(
      InformarVencimentoAlternativoActionForm informarVencimentoAlternativoActionForm,
      Collection<ClienteImovel> colecaoClienteImovel,
      HttpSession sessao) {

    Fachada fachada = Fachada.getInstancia();

    ClienteImovel clienteImovel = colecaoClienteImovel.iterator().next();

    fachada.verificarExistenciaRegistroAtendimento(
        clienteImovel.getImovel().getId(),
        "atencao.vencimento_alternativo_existencia_registro_atendimento",
        EspecificacaoTipoValidacao.VENCIMENTO_ALTERNATIVO);

    informarVencimentoAlternativoActionForm.setInscricaoImovel(
        clienteImovel.getImovel().getInscricaoFormatada());

    informarVencimentoAlternativoActionForm.setNomeClienteUsuario(
        clienteImovel.getCliente().getNome());

    informarVencimentoAlternativoActionForm.setSituacaoAguaImovel(
        clienteImovel.getImovel().getLigacaoAguaSituacao().getDescricao());

    informarVencimentoAlternativoActionForm.setSituacaoEsgotoImovel(
        clienteImovel.getImovel().getLigacaoEsgotoSituacao().getDescricao());

    informarVencimentoAlternativoActionForm.setDiaVencimentoGrupo("");

    if (clienteImovel.getImovel().getQuadra().getRota().getFaturamentoGrupo().getDiaVencimento()
            != null
        && !clienteImovel
            .getImovel()
            .getQuadra()
            .getRota()
            .getFaturamentoGrupo()
            .getDiaVencimento()
            .equals(0)) {

      informarVencimentoAlternativoActionForm.setDiaVencimentoGrupo(
          clienteImovel
              .getImovel()
              .getQuadra()
              .getRota()
              .getFaturamentoGrupo()
              .getDiaVencimento()
              .toString());
    }

    informarVencimentoAlternativoActionForm.setDiaVencimentoAtual("");

    if (clienteImovel.getImovel().getDiaVencimento() != null
        && !clienteImovel.getImovel().getDiaVencimento().equals(0)) {
      informarVencimentoAlternativoActionForm.setDiaVencimentoAtual(
          clienteImovel.getImovel().getDiaVencimento().toString());
    }

    FiltroVencimentoAlternativo filtroVencimentoAlternativo =
        new FiltroVencimentoAlternativo(FiltroVencimentoAlternativo.DATA_IMPLANTACAO);

    filtroVencimentoAlternativo.adicionarParametro(
        new ParametroSimples(
            FiltroVencimentoAlternativo.IMOVEL_ID, clienteImovel.getImovel().getId()));

    Collection<VencimentoAlternativo> vencimentosAlternativos =
        fachada.pesquisar(filtroVencimentoAlternativo, VencimentoAlternativo.class.getName());

    if (!Util.isVazioOrNulo(vencimentosAlternativos)) {

      VencimentoAlternativo vencimentoAlternativo = vencimentosAlternativos.iterator().next();

      informarVencimentoAlternativoActionForm.setDataAlteracaoVencimento("");

      if (vencimentoAlternativo.getDataImplantacao() != null) {
        informarVencimentoAlternativoActionForm.setDataAlteracaoVencimento(
            new SimpleDateFormat("dd/MM/yyyy").format(vencimentoAlternativo.getDataImplantacao()));
      }

      sessao.setAttribute("vencimentoAlternativo", vencimentoAlternativo);
    }

    sessao.setAttribute(
        "colecaoNovoDiaVencimento", criarColecaoNovoDiaPagamento(clienteImovel, sessao));

    if (clienteImovel.getImovel().getIndicadorVencimentoMesSeguinte() != null) {
      informarVencimentoAlternativoActionForm.setIndicadorVencimentoMesSeguinte(
          clienteImovel.getImovel().getIndicadorVencimentoMesSeguinte().toString());
    } else {
      informarVencimentoAlternativoActionForm.setIndicadorVencimentoMesSeguinte("2");
    }

    sessao.setAttribute("imovel", clienteImovel.getImovel());
  }
  /**
   * Este método cria a coleção de dias de vencimento alternativo disponível para esse imóvel.<br>
   * Caso o usuário tenha permissão especial de informar um vencimento alternativo, então a coleção
   * será sempre os dias de 1 a 30.<br>
   * Caso exista dados no campo dias de vencimento alternatico na tabela sistema parametro, então os
   * dias possíveis serãos esses. Caso nenhuma das duas opções anteriores seja atendida, então os
   * possíveis dias para o vencimento serão do dia depois do dia de vencimento do grupo até o dia
   * 30.
   *
   * @since 22/10/2009
   * @author Marlon Patrick
   */
  private Collection<Integer> criarColecaoNovoDiaPagamento(
      ClienteImovel clienteImovel, HttpSession sessao) {

    boolean isUsuarioComPermissaoInformarVencimentoAlternativoNovaData =
        Fachada.getInstancia()
            .verificarPermissaoInformarVencimentoAlternativoNovaData(
                (Usuario) sessao.getAttribute(Usuario.USUARIO_LOGADO));

    List<Integer> colecaoNovoDiaVencimento = new ArrayList<Integer>();

    if (isUsuarioComPermissaoInformarVencimentoAlternativoNovaData) {

      for (int i = 1; i <= 30; i++) {
        colecaoNovoDiaVencimento.add(i);
      }
      return colecaoNovoDiaVencimento;
    }

    SistemaParametro parametrosSistema =
        this.getFachada().pesquisarParametrosDoSistemaAtualizados();

    if (Util.verificarNaoVazio(parametrosSistema.getDiasVencimentoAlternativo())) {
      String[] diasVencimento = parametrosSistema.getDiasVencimentoAlternativo().split(";");

      for (String diaAtual : diasVencimento) {
        if (Util.verificarNaoVazio(diaAtual)) {
          colecaoNovoDiaVencimento.add(new Integer(diaAtual.trim()));
        }
      }

      Collections.sort(colecaoNovoDiaVencimento);

      return colecaoNovoDiaVencimento;
    }

    String empresaCAERN = "" + parametrosSistema.getCodigoEmpresaFebraban();
    if (empresaCAERN.equals("6")) {

      colecaoNovoDiaVencimento.add(1);
      colecaoNovoDiaVencimento.add(5);
      colecaoNovoDiaVencimento.add(10);
      colecaoNovoDiaVencimento.add(25);
      colecaoNovoDiaVencimento.add(27);
      colecaoNovoDiaVencimento.add(30);

    } else {

      int i =
          clienteImovel.getImovel().getQuadra().getRota().getFaturamentoGrupo().getDiaVencimento()
              + 1;

      int ultimoDiaVencimentoAlternativo = 30;

      if (parametrosSistema.getUltimoDiaVencimentoAlternativo() != null) {
        ultimoDiaVencimentoAlternativo =
            parametrosSistema.getUltimoDiaVencimentoAlternativo().intValue();
      }

      for (; i <= ultimoDiaVencimentoAlternativo; i++) {
        colecaoNovoDiaVencimento.add(i);
      }
    }
    return colecaoNovoDiaVencimento;
  }