public IEnumerable <Evento> ObterRecorrencia(PadraoRecorrencia padraoRecorrencia, PadraoRecorrenciaMensal?padraoRecorrenciaMensal, DateTime dataInicio, DateTime dataFinal, IEnumerable <DayOfWeek> diasDaSemana, int repeteACada, int?diaDeOcorrencia) { if (Id == 0) { throw new NegocioException("Só é possível aplicar recorrência em eventos já registrados."); } if (dataFinal == DateTime.MinValue) { throw new NegocioException("A data final é obrigatória para calcular a recorrência de eventos."); } if (padraoRecorrencia == PadraoRecorrencia.Semanal) { return(ObterRecorrenciaSemanal(dataInicio, dataFinal, diasDaSemana, repeteACada)); } else { if (!padraoRecorrenciaMensal.HasValue) { throw new NegocioException("Para esse padrão de recorrência o tipo de recorrência mensal deve ser informado."); } if (padraoRecorrenciaMensal == PadraoRecorrenciaMensal.NoDia && !diaDeOcorrencia.HasValue) { throw new NegocioException("O dia de ocorrência é obrigatório para calcular esse tipo recorrência de eventos."); } return(ObterRecorrenciaMensal(padraoRecorrenciaMensal.Value, dataInicio, dataFinal, diaDeOcorrencia, repeteACada, diasDaSemana)); } }
public async Task SalvarRecorrencia(Evento evento, DateTime dataInicial, DateTime?dataFinal, int?diaDeOcorrencia, IEnumerable <DayOfWeek> diasDaSemana, PadraoRecorrencia padraoRecorrencia, PadraoRecorrenciaMensal?padraoRecorrenciaMensal, int repeteACada) { if (!dataFinal.HasValue) { var periodoEscolar = repositorioPeriodoEscolar.ObterPorTipoCalendario(evento.TipoCalendarioId); var periodoAtual = periodoEscolar.FirstOrDefault(c => DateTime.Now >= c.PeriodoInicio && DateTime.Now <= c.PeriodoFim); dataFinal = periodoAtual.PeriodoFim; } var eventos = evento.ObterRecorrencia(padraoRecorrencia, padraoRecorrenciaMensal, dataInicial, dataFinal.Value, diasDaSemana, repeteACada, diaDeOcorrencia); foreach (var novoEvento in eventos) { try { await Salvar(novoEvento); } catch (NegocioException nex) { //TODO GERAR NOTIFICAÇÃO DE FEEDBACK } catch (Exception ex) { //TODO GERAR NOTIFICAÇÃO DE FEEDBACK } } }
public void SalvarRecorrencia(Evento evento, DateTime dataInicial, DateTime?dataFinal, int?diaDeOcorrencia, IEnumerable <DayOfWeek> diasDaSemana, PadraoRecorrencia padraoRecorrencia, PadraoRecorrenciaMensal?padraoRecorrenciaMensal, int repeteACada) { if (evento.DataInicio.Date != evento.DataFim.Date) { throw new NegocioException("A recorrência somente é permitida quando o evento possui data única."); } if (evento.EventoPaiId.HasValue && evento.EventoPaiId > 0) { throw new NegocioException("Este evento já pertence a uma recorrência, por isso não é permitido gerar uma nova."); } if (!dataFinal.HasValue) { var periodoEscolar = repositorioPeriodoEscolar.ObterPorTipoCalendario(evento.TipoCalendarioId); if (periodoEscolar == null || !periodoEscolar.Any()) { throw new NegocioException("Não é possível cadastrar o evento pois não existe período escolar cadastrado para este calendário."); } var periodoAtual = periodoEscolar.FirstOrDefault(c => DateTime.Now >= c.PeriodoInicio && DateTime.Now <= c.PeriodoFim); dataFinal = periodoAtual.PeriodoFim; } var eventos = evento.ObterRecorrencia(padraoRecorrencia, padraoRecorrenciaMensal, dataInicial, dataFinal.Value, diasDaSemana, repeteACada, diaDeOcorrencia); var notificacoesSucesso = new List <DateTime>(); var notificacoesFalha = new List <string>(); foreach (var novoEvento in eventos) { try { if (!servicoDiaLetivo.ValidarSeEhDiaLetivo(novoEvento.DataInicio, novoEvento.DataInicio, novoEvento.TipoCalendarioId, novoEvento.Letivo == EventoLetivo.Sim, novoEvento.TipoEventoId)) { notificacoesFalha.Add($"{novoEvento.DataInicio.ToShortDateString()} - Não é possível cadastrar esse evento pois a data informada está fora do período letivo."); } else { Salvar(novoEvento).Wait(); notificacoesSucesso.Add(novoEvento.DataInicio); } } catch (NegocioException nex) { notificacoesFalha.Add($"{novoEvento.DataInicio.ToShortDateString()} - {nex.Message}"); } catch (Exception ex) { notificacoesFalha.Add($"{novoEvento.DataInicio.ToShortDateString()} - Ocorreu um erro interno."); servicoLog.Registrar(ex); } } var usuarioLogado = servicoUsuario.ObterUsuarioLogado().Result; EnviarNotificacaoRegistroDeRecorrencia(evento, notificacoesSucesso, notificacoesFalha, usuarioLogado.Id); }