private async Task <bool> PodeCriarAulaNoPeriodo(DateTime dataAula, long tipoCalendarioId, string ueCodigo, string dreCodigo) { if (dataAula.Year != DateTime.Now.Year) { var periodoEscolarDaAula = await repositorioPeriodoEscolar.ObterPorTipoCalendarioData(tipoCalendarioId, dataAula); if (periodoEscolarDaAula == null) { throw new NegocioException("Não foi possível localizar o período escolar da aula."); } var hoje = DateTime.Today; var tipodeEventoReabertura = ObterTipoEventoFechamentoBimestre(); if (await repositorioEvento.TemEventoNosDiasETipo(hoje, hoje, (TipoEvento)tipodeEventoReabertura.Codigo, tipoCalendarioId, ueCodigo, dreCodigo)) { var fechamentoReabertura = await repositorioFechamentoReabertura.ObterReaberturaFechamentoBimestrePorDataReferencia(periodoEscolarDaAula.Bimestre, hoje, tipoCalendarioId, dreCodigo, ueCodigo); if (fechamentoReabertura == null) { return(false); } } } return(true); }
private async Task <PeriodoEscolar> ObterPeriodoEscolarFechamentoReabertura(long tipoCalendarioId, Ue ue, int bimestre) { var periodoFechamento = await servicoPeriodoFechamento.ObterPorTipoCalendarioDreEUe(tipoCalendarioId, ue.Dre, ue); var periodoFechamentoBimestre = periodoFechamento?.FechamentosBimestres.FirstOrDefault(x => x.Bimestre == bimestre); if (periodoFechamento == null || periodoFechamentoBimestre == null) { var hoje = DateTime.Today; var tipodeEventoReabertura = ObterTipoEventoFechamentoBimestre(); if (await repositorioEvento.TemEventoNosDiasETipo(hoje, hoje, (TipoEvento)tipodeEventoReabertura.Codigo, tipoCalendarioId, ue.CodigoUe, ue.Dre.CodigoDre)) { var fechamentoReabertura = await repositorioFechamentoReabertura.ObterReaberturaFechamentoBimestrePorDataReferencia(bimestre, hoje, tipoCalendarioId, ue.Dre.CodigoDre, ue.CodigoUe); if (fechamentoReabertura == null) { throw new NegocioException($"Não localizado período de fechamento em aberto para turma informada no {bimestre}º Bimestre"); } return((await repositorioPeriodoEscolar.ObterPorTipoCalendario(tipoCalendarioId)).FirstOrDefault(a => a.Bimestre == bimestre)); } } return(periodoFechamentoBimestre?.PeriodoEscolar); }
private async Task <bool> ValidaDatasETiposDeEventos(Evento evento, bool dataConfirmada, Usuario usuario, IEnumerable <PeriodoEscolar> periodos) { var devePassarPorWorkflow = false; if (evento.TipoEvento.Codigo == (int)TipoEvento.FechamentoBimestre) { return(false); } if (evento.TipoEvento.Codigo == (int)TipoEvento.LiberacaoExcepcional) { evento.PodeCriarEventoLiberacaoExcepcional(usuario, dataConfirmada, periodos); } else { if (evento.EhTipoEventoFechamento()) { throw new NegocioException("Não é possível criar eventos do tipo selecionado."); } if (evento.TipoEvento.Codigo == (long)TipoEvento.Recesso || evento.TipoEvento.Codigo == (long)TipoEvento.ReposicaoNoRecesso) { return(devePassarPorWorkflow); } else { var temEventoLiberacaoExcepcional = await repositorioEvento.TemEventoNosDiasETipo(evento.DataInicio.Date, evento.DataFim.Date, TipoEvento.LiberacaoExcepcional, evento.TipoCalendarioId, evento.UeId, evento.DreId); if (await repositorioEvento.TemEventoNosDiasETipo(evento.DataInicio.Date, evento.DataFim.Date, TipoEvento.ReposicaoNoRecesso, evento.TipoCalendarioId, string.Empty, string.Empty)) { if (evento.TipoEvento.LocalOcorrencia == EventoLocalOcorrencia.UE) { if (temEventoLiberacaoExcepcional) { return(true); } if (evento.TipoEvento.Codigo == (long)TipoEvento.ReposicaoDoDia || evento.TipoEvento.Codigo == (long)TipoEvento.ReposicaoDeAula) { return(devePassarPorWorkflow); } else { throw new NegocioException($"O tipo de evento '{((TipoEvento)evento.TipoEvento.Codigo).GetAttribute<DisplayAttribute>().Name}' não pode ser cadastrado no recesso."); } } else { return(devePassarPorWorkflow); } } else { var estaNoPeriodoEscolar = periodos.Any(c => c.PeriodoInicio.Date <= evento.DataInicio.Date && c.PeriodoFim.Date >= evento.DataFim.Date); if (estaNoPeriodoEscolar) { var temEventoSuspensaoAtividades = await repositorioEvento.TemEventoNosDiasETipo(evento.DataInicio.Date, evento.DataFim.Date, TipoEvento.SuspensaoAtividades, evento.TipoCalendarioId, evento.UeId, evento.DreId, escopoRetroativo : true); var temEventoFeriado = await repositorioEvento.TemEventoNosDiasETipo(evento.DataInicio.Date, evento.DataFim.Date, TipoEvento.Feriado, evento.TipoCalendarioId, string.Empty, string.Empty); if ((temEventoFeriado || temEventoSuspensaoAtividades || evento.DataInicio.FimDeSemana() || evento.DataFim.FimDeSemana()) && evento.Letivo == EventoLetivo.Sim) { if (temEventoLiberacaoExcepcional) { return(true); } else { if (temEventoFeriado) { throw new NegocioException("Não é possível cadastrar o evento pois há feriado na data selecionada."); } else if (temEventoSuspensaoAtividades) { throw new NegocioException("Não é possível cadastrar o evento pois há evento de suspensão de atividades na data informada."); } else if (evento.DataInicio.DayOfWeek == DayOfWeek.Sunday) { throw new NegocioException("Não é possível cadastrar o evento letivo no domingo."); } } } } else { if (evento.TipoEvento.Codigo == (long)TipoEvento.OrganizacaoEscolar || evento.TipoEvento.Codigo == (long)TipoEvento.RecreioNasFerias) { return(devePassarPorWorkflow); } else { if (temEventoLiberacaoExcepcional) { return(true); } else if (evento.TipoEvento.Codigo == (long)TipoEvento.Outros) { return(devePassarPorWorkflow); } else { throw new NegocioException($"O tipo de evento '{((TipoEvento)evento.TipoEvento.Codigo).GetAttribute<DisplayAttribute>().Name}' não pode ser cadastrado fora do período escolar."); } } } } } } return(devePassarPorWorkflow); }