/**
   * Método responsável pela busca das GRGs no fluxos de relatórios de GRGs e
   * deferimento/indeferimento de GRGs.
   *
   * @author Luciano Rocha
   * @since 23/11/2012
   * @param autorizacao
   * @param dataInicial
   * @param dataFinal
   * @param prestador
   * @param situacao
   * @param usuario
   * @return
   * @throws ValidateException
   */
  @SuppressWarnings("unchecked")
  public static List<GuiaRecursoGlosa> buscaGuiasRecursoGlosas(
      String autorizacao,
      String dataInicial,
      String dataFinal,
      Prestador prestador,
      String situacao,
      UsuarioInterface usuario)
      throws ValidateException {

    SearchAgent sa = new SearchAgent();
    Boolean pesquisouAutorizacao = null;

    Date dataInicialFormatada = Utils.parse(dataInicial);
    Date dataFinalFormatada = new Date();

    if (dataFinal != null) {
      dataFinalFormatada = Utils.parse(dataFinal);
    }

    if (!Utils.isStringVazia(autorizacao)) {
      sa.addParameter(new Equals("autorizacao", autorizacao.trim()));
      pesquisouAutorizacao = true;
    } else if (prestador != null && !usuario.isPrestador()) {
      sa.addParameter(new Equals("guiaOrigem.prestador", prestador));
      pesquisouAutorizacao = false;
    }

    if (dataInicial != null) {
      sa.addParameter(new GreaterEquals("situacao.dataSituacao", dataInicialFormatada));
      sa.addParameter(new LowerEquals("situacao.dataSituacao", dataFinalFormatada));
      if (pesquisouAutorizacao == null) {
        validaDatas(dataInicialFormatada, dataFinalFormatada);
        validaLimiteIntervaloDeDatas(dataInicial, dataFinal);
      }
    }

    if (pesquisouAutorizacao == null) {
      sa.addParameter(new Equals("situacao.descricao", situacao));
    }

    List<GuiaRecursoGlosa> recursos = sa.list(GuiaRecursoGlosa.class);

    validateGuiasCampos(recursos, dataInicialFormatada, dataFinalFormatada, pesquisouAutorizacao);

    if (pesquisouAutorizacao == null && prestador != null) {
      sa.addParameter(new Equals("guiaOrigem.prestador", prestador));
    }

    if (recursos == null || recursos.size() < 1) {
      sa.clearAllParameters();
      sa.addParameter(new Equals("situacao.descricao", situacao));
    }

    recursos = sa.list(GuiaRecursoGlosa.class);

    return recursos;
  }
  /**
   * Método do 1º step-method
   *
   * @param comp
   * @param prest
   * @throws ValidateException
   */
  public AbstractFaturamento informarDados(String comp, Prestador prest, Integer tipoFaturamento)
      throws ValidateException {

    SearchAgent sa = new SearchAgent();
    sa.addParameter(new Equals("competencia", Utils.gerarCompetencia(comp)));
    List<AbstractFaturamento> faturamentos = sa.list(getKlass(tipoFaturamento));

    if (faturamentos.isEmpty()) {
      throw new ValidateException("O faturamento desta competência ainda não foi processado");
    }

    sa.addParameter(new Equals("status", Constantes.FATURAMENTO_ABERTO));
    faturamentos = sa.list(Faturamento.class);
    if (faturamentos.isEmpty()) {
      throw new ValidateException("O faturamento desta competência não está na situação Aberto");
    }

    AbstractFaturamento faturamento = null;
    if (tipoFaturamento == FATURAMENTO_NORMAL)
      faturamento = prest.getFaturamento(Utils.gerarCompetencia(comp));
    if (tipoFaturamento == FATURAMENTO_PASSIVO)
      faturamento = prest.getFaturamentoPassivo(Utils.gerarCompetencia(comp));

    boolean isPrestadorTemFaturamento = faturamento == null ? false : true;
    if (isPrestadorTemFaturamento) {
      if (faturamento.getStatus() == Constantes.FATURAMENTO_FECHADO) {
        throw new ValidateException(
            "O faturamento do Prestador desta competência não está na situação Aberto");
      }
    }

    competencia = comp;
    prestador = prest;
    tipo = tipoFaturamento;

    return faturamento;
  }
  public Boolean validate() throws ValidateException {
    if ((this.getIdInss() != null)) {
      Inss imposto = ImplDAO.getFromBase(this);
      if (!(Utils.compararCompetencia(imposto.getCompetencia(), this.getCompetencia()) == 0))
        throw new ValidateException("Não é possível alterar a competência de um imposto.");

      if (Utils.compararCompetencia(this.getCompetencia(), new Date()) <= 0)
        throw new ValidateException("Não é possível alterar os valores deste imposto.");

    } else {
      SearchAgent sa = new SearchAgent();
      sa.addParameter(new Equals("competencia", this.getCompetencia()));
      List<Inss> impostos = sa.list(Inss.class);
      if (!impostos.isEmpty())
        throw new ValidateException("Já existe um imposto cadastrado para esta competência.");
    }
    return super.validate();
  }