// Data de Validade da Guia de Pagamento
  // último dia do proximo mês do mês/ano da data de vencimento da guia de pagamento
  public String getDataValidade() {

    int anoVencimento = Util.getAno(getDataVencimento());
    int mesVencimento = Util.getMes(getDataVencimento());

    Calendar calendarUltimoDiaMesAnoDataVencimento = new GregorianCalendar();

    calendarUltimoDiaMesAnoDataVencimento.set(Calendar.YEAR, anoVencimento);
    calendarUltimoDiaMesAnoDataVencimento.set(Calendar.MONTH, mesVencimento - 1);
    calendarUltimoDiaMesAnoDataVencimento.set(
        Calendar.DAY_OF_MONTH,
        calendarUltimoDiaMesAnoDataVencimento.getActualMaximum(Calendar.DAY_OF_MONTH));

    Date dateDataVencimentoMais3Dias = Util.adicionarNumeroDiasDeUmaData(getDataVencimento(), 3);
    Date dateDataCorrenteMais3Dias = Util.adicionarNumeroDiasDeUmaData(new Date(), 3);
    Date dateMaiorData = null;

    //		 retorna
    //		 -1 se a data1 for menor que a data2,
    //		 0 se as datas forem iguais,
    //		 1 se a data1 for maior que a data2.

    if (Util.compararData(dateDataVencimentoMais3Dias, dateDataCorrenteMais3Dias) >= 0) {

      if (Util.compararData(
              dateDataVencimentoMais3Dias, calendarUltimoDiaMesAnoDataVencimento.getTime())
          >= 0) {
        dateMaiorData = dateDataVencimentoMais3Dias;
      } else {
        dateMaiorData = calendarUltimoDiaMesAnoDataVencimento.getTime();
      }

    } else {

      if (Util.compararData(
              dateDataCorrenteMais3Dias, calendarUltimoDiaMesAnoDataVencimento.getTime())
          >= 0) {
        dateMaiorData = dateDataCorrenteMais3Dias;
      } else {
        dateMaiorData = calendarUltimoDiaMesAnoDataVencimento.getTime();
      }
    }

    //		String anoMesValidade = Util.getAnoMesComoString(getDataVencimento());
    //		Calendar calendario = new GregorianCalendar();
    //
    //		calendario.set(Calendar.YEAR, new Integer(anoMesValidade.substring(0, 4)).intValue());
    //		calendario.set(Calendar.MONTH, new Integer(anoMesValidade.substring(4, 6)).intValue());
    //		calendario.set(Calendar.DAY_OF_MONTH, calendario.getActualMaximum(Calendar.DAY_OF_MONTH));

    return Util.formatarData(dateMaiorData);
  }
  private void validarDadosDebito(
      AtualizarComandoNegativacaoPorCriterioActionForm form, Fachada fachada) {
    Date dataAtual = new Date();
    Integer referenciaDataAtual = Util.getAnoMesComoInteger(dataAtual);

    // Período de Referência do Débito
    if (form.getReferenciaInicial() != null
        && !form.getReferenciaInicial().equals("")
        && form.getReferenciaFinal() != null
        && !form.getReferenciaFinal().equals("")) {
      Integer referenciaInicial =
          Util.formatarMesAnoComBarraParaAnoMes(form.getReferenciaInicial());
      Integer referenciaFinal = Util.formatarMesAnoComBarraParaAnoMes(form.getReferenciaFinal());
      if (!Util.validarMesAno(form.getReferenciaInicial())
          || !Util.validarMesAno(form.getReferenciaFinal())) {
        throw new ActionServletException(
            "atencao.adicionar_debito_ano_mes_referencia_invalido", null, "do débito");
      } else if (referenciaInicial > referenciaFinal) {
        throw new ActionServletException("atencao.referencia.final.menor.referencia.inicial");
      } else if (referenciaDataAtual < referenciaInicial) {
        throw new ActionServletException("atencao.referencia.posterior");
      } else if (referenciaDataAtual < referenciaFinal) {
        throw new ActionServletException("atencao.referencia.posterior");
      }
    }

    FiltroSistemaParametro filtroSistemaParametro = new FiltroSistemaParametro();
    Collection<SistemaParametro> collectionSistemaParametro =
        fachada.pesquisar(filtroSistemaParametro, SistemaParametro.class.getName());
    SistemaParametro sistemaParametro =
        (SistemaParametro) collectionSistemaParametro.iterator().next();

    // Período de referência do débito
    Integer referenciaMinima =
        Util.subtrairAnoAnoMesReferencia(sistemaParametro.getAnoMesArrecadacao(), 5);

    if (form.getReferenciaInicial() != null && !form.getReferenciaInicial().equals("")) {
      Integer referenciaDebInicialInformado =
          Util.formatarMesAnoComBarraParaAnoMes(form.getReferenciaInicial());
      if (referenciaDebInicialInformado < referenciaMinima) {
        throw new ActionServletException("atencao.periodo_referencia_debito_minimo");
      }
    }

    if (form.getReferenciaFinal() != null && !form.getReferenciaFinal().equals("")) {
      Integer referenciaDebFinalInformado =
          Util.formatarMesAnoComBarraParaAnoMes(form.getReferenciaFinal());
      if (referenciaDebFinalInformado < referenciaMinima) {
        throw new ActionServletException("atencao.periodo_referencia_debito_minimo");
      }
    }

    // Período de vencimento do débito
    Integer numeroDiasVencimentoCobranca =
        new Integer(sistemaParametro.getNumeroDiasVencimentoCobranca());
    Date dataMinima =
        Util.subtrairNumeroAnosDeUmaData(
            Util.subtrairNumeroDiasDeUmaData(new Date(), numeroDiasVencimentoCobranca), -5);

    if (form.getDataVencimentoInicial() != null && !form.getDataVencimentoInicial().equals("")) {
      if (Util.validarDiaMesAno(form.getDataVencimentoInicial())) {
        throw new ActionServletException("atencao.datavencimentodebinicial.invalida");
      }
      Date vencimentoDebInicialInformado =
          Util.converteStringParaDate(form.getDataVencimentoInicial());
      if (Util.compararData(vencimentoDebInicialInformado, dataAtual) == 1) {
        throw new ActionServletException(
            "atencao.data_inicial.posterior.hoje", null, Util.formatarData(new Date()));
      }
      if (Util.compararData(vencimentoDebInicialInformado, dataMinima) == -1) {
        throw new ActionServletException("atencao.periodo_vencimento_debito_minimo");
      }
    }

    if (form.getDataVencimentoFinal() != null && !form.getDataVencimentoFinal().equals("")) {
      Date vencimentoDebFinalInformado = Util.converteStringParaDate(form.getDataVencimentoFinal());
      if (Util.validarDiaMesAno(form.getDataVencimentoFinal())) {
        throw new ActionServletException("atencao.datavencimentodebfinal.invalida");
      } else if (Util.compararData(vencimentoDebFinalInformado, dataAtual) == 1) {
        throw new ActionServletException(
            "atencao.data_final.posterior.hoje", null, Util.formatarData(new Date()));
      } else if (Util.compararData(vencimentoDebFinalInformado, dataMinima) == -1) {
        throw new ActionServletException("atencao.periodo_vencimento_debito_minimo");
      }
    }

    if (form.getDataVencimentoInicial() != null
        && !form.getDataVencimentoInicial().equals("")
        && form.getDataVencimentoFinal() != null
        && !form.getDataVencimentoFinal().equals("")) {
      Date vencimentoDebInicial = Util.converteStringParaDate(form.getDataVencimentoInicial());
      Date vencimentoDebFinal = Util.converteStringParaDate(form.getDataVencimentoFinal());

      if (Util.compararData(vencimentoDebInicial, vencimentoDebFinal) == 1) {
        throw new ActionServletException( // Data Final do Período é
            // anterior à Data Inicial
            // do Período
            "atencao.data_final_periodo.anterior.data_inicial_periodo");
      }
    }

    // Valor do Débito
    if (form.getValorDebitoInicial() != null
        && !form.getValorDebitoInicial().equals("")
        && form.getValorDebitoFinal() != null
        && !form.getValorDebitoFinal().equals("")) {
      BigDecimal valorDebInicial =
          Util.formatarMoedaRealparaBigDecimal(form.getValorDebitoInicial());
      BigDecimal valorDebFinal = Util.formatarMoedaRealparaBigDecimal(form.getValorDebitoFinal());
      if (valorDebInicial.compareTo(valorDebFinal) == 1) {
        throw new ActionServletException("atencao.debito_inicial_maior_debito_final");
      }
    }

    // Número de Contas
    if (form.getNumeroContasInicial() != null
        && !form.getNumeroContasInicial().equals("")
        && form.getNumeroContasFinal() != null
        && !form.getNumeroContasFinal().equals("")) {
      Integer contaInicial = new Integer(form.getNumeroContasInicial());
      Integer contaFinal = new Integer(form.getNumeroContasFinal());
      if (contaInicial.compareTo(contaFinal) == 1) {
        throw new ActionServletException("atencao.numero_conta_inicial_maior_final");
      }
    }

    // Parcela em Atraso
    if ((form.getParcelaAtraso() != null && form.getParcelaAtraso().equals("1"))
        && (form.getDiasAtrasoParcelamento() == null
            || form.getDiasAtrasoParcelamento().equals(""))) {
      throw new ActionServletException("atencao.informar_dias_atraso_parcelamento");
    }

    // Recebeu Carta de Parcelamento em Atraso
    if ((form.getCartaParcelamentoAtraso() != null && form.getCartaParcelamentoAtraso().equals("1"))
        && (form.getDiasAtrasoRecebimentoCarta() == null
            || form.getDiasAtrasoRecebimentoCarta().equals(""))) {
      throw new ActionServletException("atencao.informar_dias_atraso_parcelamento");
    }
  }
  public ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    // Seta o mapeamento de retorno
    ActionForward retorno = null;

    httpServletRequest.setAttribute("telaSucessoRelatorio", true);

    HttpSession sessao = httpServletRequest.getSession(false);

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

    // Form
    GerarRelatorioReligacaoClientesInadiplentesForm form =
        (GerarRelatorioReligacaoClientesInadiplentesForm) actionForm;

    FiltrarRelatorioReligacaoClientesInadiplentesHelper helper =
        new FiltrarRelatorioReligacaoClientesInadiplentesHelper();

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

    Fachada fachada = Fachada.getInstancia();

    boolean peloMenosUmParametroInformado = false;

    // Gerência Regional
    String gerenciaRegional = " -- ";
    if (form.getGerenciaRegionalID() != null && !form.getGerenciaRegionalID().equals("-1")) {

      helper.setGerenciaRegional(new Integer(form.getGerenciaRegionalID()));

      FiltroGerenciaRegional filtroGerenciaRegional = new FiltroGerenciaRegional();
      filtroGerenciaRegional.adicionarParametro(
          new ParametroSimples(FiltroGerenciaRegional.ID, form.getGerenciaRegionalID()));

      filtroGerenciaRegional.adicionarParametro(
          new ParametroSimples(
              FiltroGerenciaRegional.INDICADOR_USO, ConstantesSistema.INDICADOR_USO_ATIVO));

      // Retorna gerenciaRegional
      colecaoPesquisa = fachada.pesquisar(filtroGerenciaRegional, GerenciaRegional.class.getName());

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

        throw new ActionServletException("atencao.gerenciaRegional_inexistente");
      }

      GerenciaRegional objetoGerenciaRegional =
          (GerenciaRegional) Util.retonarObjetoDeColecao(colecaoPesquisa);
      gerenciaRegional = objetoGerenciaRegional.getNome();

      peloMenosUmParametroInformado = true;
    }

    // Unidade de Negócio
    String unidadeNegocio = " -- ";
    if (form.getUnidadeNegocioID() != null && !form.getUnidadeNegocioID().equals("-1")) {

      helper.setUnidadeNegocio(new Integer(form.getUnidadeNegocioID()));

      FiltroUnidadeNegocio filtroUnidadeNegocio = new FiltroUnidadeNegocio();
      filtroUnidadeNegocio.adicionarParametro(
          new ParametroSimples(FiltroUnidadeNegocio.ID, form.getUnidadeNegocioID()));

      filtroUnidadeNegocio.adicionarParametro(
          new ParametroSimples(
              FiltroUnidadeNegocio.INDICADOR_USO, ConstantesSistema.INDICADOR_USO_ATIVO));

      // Retorna Unidade de Negócio
      colecaoPesquisa = fachada.pesquisar(filtroUnidadeNegocio, UnidadeNegocio.class.getName());

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

        throw new ActionServletException("atencao.unidade_negocio.inexistente");
      }

      UnidadeNegocio objetoUnidadeNegocio =
          (UnidadeNegocio) Util.retonarObjetoDeColecao(colecaoPesquisa);
      unidadeNegocio = objetoUnidadeNegocio.getNome();

      peloMenosUmParametroInformado = true;
    }

    // Localidade
    String localidade = " -- ";
    if (form.getLocalidadeID() != null && !form.getLocalidadeID().equals("")) {

      helper.setLocalidade(new Integer(form.getLocalidadeID()));
      peloMenosUmParametroInformado = true;

      if (form.getNomeLocalidade() == null || form.getNomeLocalidade().equals("")) {

        FiltroLocalidade filtroLocalidade = new FiltroLocalidade();
        filtroLocalidade.adicionarParametro(
            new ParametroSimples(FiltroLocalidade.ID, form.getLocalidadeID()));

        filtroLocalidade.adicionarParametro(
            new ParametroSimples(
                FiltroLocalidade.INDICADORUSO, ConstantesSistema.INDICADOR_USO_ATIVO));

        // Retorna Localidade
        colecaoPesquisa = fachada.pesquisar(filtroLocalidade, Localidade.class.getName());

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

          throw new ActionServletException("pesquisa.localidade.inexistente");
        }

        Localidade objetoLocalidade = (Localidade) Util.retonarObjetoDeColecao(colecaoPesquisa);
        localidade = objetoLocalidade.getDescricao();

      } else {

        localidade = form.getNomeLocalidade();
      }
    }

    // Setor Comercial
    String setorComercial = " -- ";
    if ((form.getSetorComercialID() != null && !form.getSetorComercialID().equals(""))
        || form.getSetorComercialCD() != null && !form.getSetorComercialCD().equals("")) {

      if (form.getSetorComercialID() != null && !form.getSetorComercialID().equals("")) {

        setorComercial = form.getNomeSetorComercial();
        helper.setSetorComercial(new Integer(form.getSetorComercialID()));
        peloMenosUmParametroInformado = true;
      } else {

        localidadeID = (String) form.getLocalidadeID();

        if (localidadeID == null || localidadeID.equals("")) {

          throw new ActionServletException("atencao.localidade_nao_informada");
        }

        setorComercialCD = (String) form.getSetorComercialCD();

        FiltroSetorComercial filtroSetorComercial = new FiltroSetorComercial();

        filtroSetorComercial.adicionarParametro(
            new ParametroSimples(FiltroSetorComercial.ID_LOCALIDADE, localidadeID));

        filtroSetorComercial.adicionarParametro(
            new ParametroSimples(FiltroSetorComercial.CODIGO_SETOR_COMERCIAL, setorComercialCD));

        // Retorna setorComercial
        colecaoPesquisa = fachada.pesquisar(filtroSetorComercial, SetorComercial.class.getName());

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

          throw new ActionServletException("atencao.processo.setorComercialNaoCadastrada");
        }

        SetorComercial objetoSetorComercial =
            (SetorComercial) Util.retonarObjetoDeColecao(colecaoPesquisa);

        setorComercial = objetoSetorComercial.getDescricao();
        helper.setSetorComercial(objetoSetorComercial.getId());
        peloMenosUmParametroInformado = true;
      }
    }

    // Cliente
    String cliente = " -- ";
    if (form.getClienteID() != null && !form.getClienteID().equals("")) {

      if (form.getNomeCliente() == null || form.getNomeCliente().equals("")) {

        FiltroCliente filtroCliente = new FiltroCliente();
        filtroCliente.adicionarParametro(
            new ParametroSimples(FiltroCliente.ID, form.getClienteID()));

        filtroCliente.adicionarParametro(
            new ParametroSimples(
                FiltroCliente.INDICADOR_USO, ConstantesSistema.INDICADOR_USO_ATIVO));

        // Retorna Cliente
        colecaoPesquisa = fachada.pesquisar(filtroCliente, Cliente.class.getName());

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

          throw new ActionServletException("atencao.cliente.inexistente");
        }

        Cliente objetoCliente = (Cliente) Util.retonarObjetoDeColecao(colecaoPesquisa);
        cliente = objetoCliente.getDescricao();

      } else {

        cliente = form.getNomeCliente();
      }

      helper.setCliente(new Integer(form.getClienteID()));
      peloMenosUmParametroInformado = true;
    }

    // Usuário
    String nomeUsuario = " -- ";
    if (form.getUsuarioID() != null && !form.getUsuarioID().equals("")) {

      if (form.getNomeUsuario() == null || form.getNomeUsuario().equals("")) {

        FiltroUsuario filtroUsuario = new FiltroUsuario();
        filtroUsuario.adicionarParametro(
            new ParametroSimples(FiltroUsuario.ID, form.getUsuarioID()));

        // Retorna Usuário
        colecaoPesquisa = fachada.pesquisar(filtroUsuario, Usuario.class.getName());

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

          throw new ActionServletException("atencao.pesquisa.usuario.inexistente");
        }

        Usuario objetoUsuario = (Usuario) Util.retonarObjetoDeColecao(colecaoPesquisa);
        nomeUsuario = objetoUsuario.getLogin();

      } else {

        nomeUsuario = form.getNomeUsuario();
      }

      helper.setUsuario(new Integer(form.getUsuarioID()));
      peloMenosUmParametroInformado = true;
    }

    // Período Encerramento
    String periodoEncerramento = "";
    if (form.getDataInicioEncerramento() != null && !form.getDataInicioEncerramento().equals("")) {

      if (form.getDataFimEncerramento() == null
          || form.getDataFimEncerramento().trim().equals("")) {

        form.setDataFimEncerramento(form.getDataInicioEncerramento());
      }

      if (!Util.validarDiaMesAno(form.getDataInicioEncerramento())) {

        periodoEncerramento += form.getDataInicioEncerramento() + " a ";
        helper.setDataInicioEncerramento(
            Util.formatarDataInicial(
                Util.converteStringParaDate(form.getDataInicioEncerramento())));

        if (helper.getDataInicioEncerramento().after(new Date())) {

          throw new ActionServletException("atencao.periodo_inicio_alteracao_invalida");
        }

        if (!Util.validarDiaMesAno(form.getDataFimEncerramento())) {

          periodoEncerramento += form.getDataFimEncerramento();
          helper.setDataFimEncerramento(
              Util.formatarDataFinal(Util.converteStringParaDate(form.getDataFimEncerramento())));

          if (helper.getDataFimEncerramento().after(new Date())) {

            throw new ActionServletException("atencao.periodo_final_alteracao_invalida");
          }

          if (Util.compararData(helper.getDataInicioEncerramento(), helper.getDataFimEncerramento())
              == 1) {

            throw new ActionServletException("atencao.data_inicio_maior_final");
          }

          // Lilita o intevalo a um mês.
          if ((helper.getDataFimEncerramento().getTime()
                  - helper.getDataInicioEncerramento().getTime())
              > 1000L * 60L * 60L * 24L * 31L) {

            throw new ActionServletException(
                "atencao.filtrar_intervalo_limite", null, "Período de Encerramento da S.O");
          }

          peloMenosUmParametroInformado = true;

        } else {
          throw new ActionServletException("atencao.periodo_final_alteracao_invalida");
        }
      } else {
        throw new ActionServletException("atencao.periodo_inicio_alteracao_invalida");
      }
    }

    // Período Recorrência
    String periodoRecorrencia = "";
    if (form.getDataInicioRecorrencia() != null && !form.getDataInicioRecorrencia().equals("")) {
      if (!Util.validarDiaMesAno(form.getDataInicioRecorrencia())) {

        periodoRecorrencia += form.getDataInicioRecorrencia() + " a ";
        helper.setDataInicioRecorrencia(
            Util.formatarDataInicial(Util.converteStringParaDate(form.getDataInicioRecorrencia())));

        if (helper.getDataInicioRecorrencia().after(new Date())) {

          throw new ActionServletException("atencao.periodo_inicio_alteracao_invalida");
        }

        if (!Util.validarDiaMesAno(form.getDataFimRecorrencia())) {

          periodoRecorrencia += form.getDataFimRecorrencia();
          helper.setDataFimRecorrencia(
              Util.formatarDataFinal(Util.converteStringParaDate(form.getDataFimRecorrencia())));

          if (helper.getDataFimRecorrencia().after(new Date())) {

            throw new ActionServletException("atencao.periodo_final_alteracao_invalida");
          }

          if (Util.compararData(helper.getDataInicioRecorrencia(), helper.getDataFimRecorrencia())
              == 1) {

            throw new ActionServletException("atencao.data_inicio_maior_final");
          }

          peloMenosUmParametroInformado = true;

        } else {
          throw new ActionServletException("atencao.periodo_final_alteracao_invalida");
        }
      } else {
        throw new ActionServletException("atencao.periodo_inicio_alteracao_invalida");
      }
    } else {

      Date dt = Util.adcionarOuSubtrairMesesAData(new Date(), -6, 0);

      helper.setDataInicioRecorrencia(dt);
      helper.setDataFimRecorrencia(new Date());
      periodoRecorrencia = Util.formatarData(dt) + " a " + Util.formatarData(new Date());
    }

    // Escolha Relatório
    if (form.getEscolhaRelatorio() != null && !form.getEscolhaRelatorio().equals("-1")) {

      helper.setEscolhaRelatorio(new Integer(form.getEscolhaRelatorio()));
      peloMenosUmParametroInformado = true;
    } else {

      throw new ActionServletException("atencao.tipo_relatorio_nao_informado");
    }

    // Erro caso o usuário mandou filtrar sem nenhum parâmetro
    if (!peloMenosUmParametroInformado) {

      throw new ActionServletException("atencao.filtro.nenhum_parametro_informado");
    }

    TarefaRelatorio relatorio =
        new RelatorioReligacaoClientesInadiplentes(
            (Usuario) (httpServletRequest.getSession(false)).getAttribute("usuarioLogado"));

    if (tipoRelatorio == null) {
      tipoRelatorio = TarefaRelatorio.TIPO_PDF + "";
    }

    relatorio.addParametro("tipoFormatoRelatorio", Integer.parseInt(tipoRelatorio));
    relatorio.addParametro("filtrarRelatorioReligacaoClientesInadiplentesHelper", helper);
    relatorio.addParametro("usuario", usuario);

    relatorio.addParametro("gerenciaRegional", gerenciaRegional);
    relatorio.addParametro("unidadeNegocio", unidadeNegocio);
    relatorio.addParametro("localidade", localidade);
    relatorio.addParametro("setorComercial", setorComercial);
    relatorio.addParametro("cliente", cliente);
    relatorio.addParametro("nomeUsuario", nomeUsuario);
    relatorio.addParametro("periodoEncerramento", periodoEncerramento);
    relatorio.addParametro("periodoRecorrencia", periodoRecorrencia);

    try {

      retorno =
          processarExibicaoRelatorio(
              relatorio, tipoRelatorio, httpServletRequest, httpServletResponse, actionMapping);

    } catch (SistemaException ex) {
      // manda o erro para a página no request atual
      reportarErros(httpServletRequest, "erro.sistema");

      // seta o mapeamento de retorno para a tela de erro de popup
      retorno = actionMapping.findForward("telaErroPopup");

    } catch (RelatorioVazioException ex1) {
      throw new ActionServletException("atencao.pesquisa.nenhumresultado", null, "");
    }

    return retorno;
  }