Esempio n. 1
0
        public bool MatchMonthDay(PlannedRecurrenceEntity plannedRecurrence, DateTime date)
        {
            if (string.IsNullOrEmpty(plannedRecurrence.EveryMonthDay))
            {
                return(true);
            }

            List <int> dayList;

            try
            {
                dayList = plannedRecurrence.EveryMonthDay.Split(',').Select(int.Parse).ToList();
            }
            catch (Exception e)
            {
                if (e is OverflowException || e is FormatException)
                {
                    _logger.LogWarning(
                        $"Can't parse EveryMonthDay for PlannedRecurrenceUid = {plannedRecurrence.Uid}, Value = '{plannedRecurrence.EveryMonthDay}'");
                    return(true);
                }

                throw;
            }

            int lastDay = DateTime.DaysInMonth(date.Year, date.Month);


            if (dayList.Any(x => x > lastDay))
            {
                dayList.Add(lastDay);
            }

            return(dayList.Contains(date.Day));
        }
Esempio n. 2
0
        private async Task <bool> SavePlannedRecurrence(PlannedRecurrenceDto dto, string userId)
        {
            if (dto.IsDeleted)
            {
                await _plannedRecurrenceRepository.DeleteAsync(dto.Uid);

                return(true);
            }

            PlannedRecurrenceEntity entity = await _plannedRecurrenceRepository.GetByIdAsync(dto.Uid);

            if (entity == null)
            {
                entity        = _mapper.Map <PlannedRecurrenceEntity>(dto);
                entity.UserId = userId;
                await _plannedRecurrenceRepository.UpsertAsync(entity);

                return(true);
            }

            if (!RecurrenceIsChanged(entity, dto))
            {
                return(false);
            }

            entity.Task          = dto.Task;
            entity.StartDate     = dto.StartDate;
            entity.EndDate       = dto.EndDate;
            entity.EveryNthDay   = dto.EveryNthDay;
            entity.EveryWeekday  = dto.EveryWeekday;
            entity.EveryMonthDay = dto.EveryMonthDay;
            var(success, _)      = await _plannedRecurrenceRepository.TryUpdateVersionAsync(entity);

            return(success);
        }
Esempio n. 3
0
        public bool MatchWeekday(PlannedRecurrenceEntity plannedRecurrence, DateTime date)
        {
            if (!plannedRecurrence.EveryWeekday.HasValue)
            {
                return(true);
            }

            RecurrenceWeekdayEnum weekday;

            switch (date.DayOfWeek)
            {
            case DayOfWeek.Sunday: weekday = RecurrenceWeekdayEnum.Sunday; break;

            case DayOfWeek.Monday: weekday = RecurrenceWeekdayEnum.Monday; break;

            case DayOfWeek.Tuesday: weekday = RecurrenceWeekdayEnum.Tuesday; break;

            case DayOfWeek.Wednesday: weekday = RecurrenceWeekdayEnum.Wednesday; break;

            case DayOfWeek.Thursday: weekday = RecurrenceWeekdayEnum.Thursday; break;

            case DayOfWeek.Friday: weekday = RecurrenceWeekdayEnum.Friday; break;

            case DayOfWeek.Saturday: weekday = RecurrenceWeekdayEnum.Saturday; break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(plannedRecurrence.EveryWeekday.Value.HasFlag(weekday));
        }
Esempio n. 4
0
 private bool RecurrenceIsChanged(PlannedRecurrenceEntity entity, PlannedRecurrenceDto dto)
 {
     return(!string.Equals(entity.Task, dto.Task) ||
            entity.StartDate != dto.StartDate ||
            entity.EndDate != dto.EndDate ||
            entity.EveryNthDay != dto.EveryNthDay ||
            entity.EveryWeekday != dto.EveryWeekday ||
            !string.Equals(entity.EveryMonthDay, dto.EveryMonthDay));
 }
Esempio n. 5
0
        private TaskEntity CreateTaskFromRecurrence(PlannedRecurrenceEntity plannedRecurrence, DateTime date)
        {
            TaskDto dto  = _taskParserService.ParseTask(plannedRecurrence.Task, ignoreDate: true);
            var     task = _mapper.Map <TaskEntity>(dto);

            task.Date   = date;
            task.UserId = plannedRecurrence.UserId;
            task.Uid    = Guid.NewGuid().ToString();
            return(task);
        }
Esempio n. 6
0
        public bool MatchNthDay(PlannedRecurrenceEntity plannedRecurrence, DateTime date)
        {
            if (!plannedRecurrence.EveryNthDay.HasValue)
            {
                return(true);
            }

            TimeSpan dayCount = plannedRecurrence.StartDate.Date - date.Date;

            return(dayCount.Days % plannedRecurrence.EveryNthDay == 0);
        }
Esempio n. 7
0
 private async Task Upsert(PlannedRecurrenceEntity pgPlannedRecurrence)
 {
     var mongoPlannedRecurrence = new TaskServiceApp.Entities.Models.PlannedRecurrenceEntity()
     {
         Task          = pgPlannedRecurrence.Task,
         StartDate     = DateTime.SpecifyKind(pgPlannedRecurrence.StartDate, DateTimeKind.Utc),
         EndDate       = pgPlannedRecurrence.EndDate.HasValue ? DateTime.SpecifyKind(pgPlannedRecurrence.EndDate.Value, DateTimeKind.Utc) : null,
         EveryNthDay   = pgPlannedRecurrence.EveryNthDay,
         EveryMonthDay = pgPlannedRecurrence.EveryMonthDay,
         EveryWeekday  = (RecurrenceWeekdayEnum?)(int?)pgPlannedRecurrence.EveryWeekday,
         UserId        = pgPlannedRecurrence.UserId,
         Recurrences   = new List <TaskServiceApp.Entities.Models.RecurrenceEntity>(),
         Uid           = pgPlannedRecurrence.Id.ToString(),
         IsDeleted     = pgPlannedRecurrence.IsDeleted,
         Version       = 1,
     };
     await _mongoPlannedRecurrences.UpsertAsync(mongoPlannedRecurrence);
 }
Esempio n. 8
0
        private async Task <PlannedRecurrenceEntity> SaveRecurrence(PlannedRecurrenceEntity entity,
                                                                    RecurrenceEntity recurrence)
        {
            bool success;

            do
            {
                entity.Recurrences.Add(recurrence);
                PlannedRecurrenceEntity currentEntity;
                (success, currentEntity) = await _plannedRecurrenceRepository
                                           .TryUpdateVersionPropsAsync(entity, x => x.Recurrences);

                if (!success)
                {
                    entity = currentEntity;
                }
            } while (!success);

            return(entity);
        }
Esempio n. 9
0
        private ICollection <DateTime> EvaluateRecurrenceDatesWithinPeriod(PlannedRecurrenceEntity plannedRecurrence, int timezoneOffset)
        {
            var(periodStart, periodEnd) = EvaluatePeriod(timezoneOffset);
            var dates = new List <DateTime>();

            for (DateTime i = periodStart; i != periodEnd; i = i.AddDays(1))
            {
                if (!HasSchedule(plannedRecurrence) ||
                    !MatchPeriod(plannedRecurrence, i) ||
                    !MatchWeekday(plannedRecurrence, i) ||
                    !MatchNthDay(plannedRecurrence, i) ||
                    !MatchMonthDay(plannedRecurrence, i))
                {
                    continue;
                }

                dates.Add(i);
            }

            return(dates);
        }
Esempio n. 10
0
 public bool MatchPeriod(PlannedRecurrenceEntity plannedRecurrence, DateTime date)
 {
     return(date >= plannedRecurrence.StartDate &&
            (!plannedRecurrence.EndDate.HasValue || date <= plannedRecurrence.EndDate));
 }
Esempio n. 11
0
 private bool HasSchedule(PlannedRecurrenceEntity plannedRecurrence)
 {
     return(plannedRecurrence.EveryNthDay.HasValue ||
            plannedRecurrence.EveryWeekday.HasValue ||
            !string.IsNullOrEmpty(plannedRecurrence.EveryMonthDay));
 }