firstOccurrence property

DateTime get firstOccurrence

The date and time of the first occurrence of this trigger.

Implementation

DateTime get firstOccurrence {
  late DateTime firstDay;
  DateTime now = DateTime.now();
  DateTime start = DateTime(
      now.year, now.month, now.day, time.hour, time.minute, time.second);

  switch (type) {
    case RecurrentType.daily:
      firstDay =
          (start.isAfter(now)) ? start : start.add(const Duration(hours: 24));
      break;
    case RecurrentType.weekly:
      int days = dayOfWeek! - now.weekday;
      days = (days < 0) ? days + daysPerWeek : days;
      firstDay = start.add(Duration(days: days));
      // check if this is the same day, but a time slot earlier this day
      firstDay = (firstDay.isBefore(now))
          ? firstDay.add(const Duration(days: daysPerWeek))
          : firstDay;
      break;
    case RecurrentType.monthly:
      if (dayOfMonth != null) {
        // we have a trigger of the following type: collect quarterly on the 11th day of the first month in each quarter at 21:30
        //   RecurrentScheduledTrigger(type: RecurrentType.monthly, dayOfMonth: 11, separationCount: 2, time: Time(hour: 21, minute: 30));
        int days = dayOfMonth! - now.day;
        int month = (days > 0)
            ? now.month + separationCount
            : now.month + separationCount + 1;
        int year = now.year;
        if (month > 12) {
          year = now.year + 1;
          month = month - DateTime.monthsPerYear;
        }
        firstDay = DateTime(year, month, dayOfMonth!);
      } else {
        // we have a trigger of the following type: collect monthly in the second week on a monday at 14:30
        //   RecurrentScheduledTrigger(type: RecurrentType.monthly, weekOfMonth: 2, dayOfWeek: DateTime.monday, time: Time(hour: 14, minute: 30));
        firstDay = nextMonthlyDay(DateTime(now.year, now.month, 1));
        // check if this day is in the past - if so, move one month forward
        if (firstDay.isBefore(now)) {
          firstDay = nextMonthlyDay(DateTime(now.year, now.month + 1, 1));
        }
      }
      break;
  }

  return DateTime(firstDay.year, firstDay.month, firstDay.day, time.hour,
      time.minute, time.second);
}