Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
0
        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
                }
            }
        }
Exemplo n.º 3
0
        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);
        }