nextRenewal method

DateTime nextRenewal({
  1. DateTime? from,
})

Returns the next renewal starting from from date. If from is not provided, DateTime.now() date is taken.

Implementation

DateTime nextRenewal({
  DateTime? from,
}) {
  from ??= DateTime.now();

  switch (renewal) {
    case Renewal.annual:
      final DateTime thisYearRenewal = DateTime(
        from.year,
        start.month,
        start.day,
        start.hour,
        start.minute,
        start.second,
        start.millisecond,
        start.microsecond,
      );
      final DateTime nextYearRenewal = DateTime(
        from.year + 1,
        start.month,
        start.day,
        start.hour,
        start.minute,
        start.second,
        start.millisecond,
        start.microsecond,
      );

      return from.isBefore(thisYearRenewal)
          ? thisYearRenewal
          : nextYearRenewal;
    case Renewal.daily:
      final DateTime todayRenewal = DateTime(
        from.year,
        from.month,
        from.day,
        start.hour,
        start.minute,
        start.second,
        start.millisecond,
        start.microsecond,
      );
      final DateTime tomorrowRenewal = DateTime(
        from.year,
        from.month,
        from.day + 1,
        start.hour,
        start.minute,
        start.second,
        start.millisecond,
        start.microsecond,
      );

      return from.isBefore(todayRenewal) ? todayRenewal : tomorrowRenewal;
    case Renewal.monthly:
      final DateTime thisMonthRenewal = DateTime(
        from.year,
        from.month,
        start.day,
        start.hour,
        start.minute,
        start.second,
        start.millisecond,
        start.microsecond,
      );
      final DateTime nextMonthRenewal = DateTime(
        from.year,
        from.month + 1,
        start.day,
        start.hour,
        start.minute,
        start.second,
        start.millisecond,
        start.microsecond,
      );

      return from.isBefore(thisMonthRenewal)
          ? thisMonthRenewal
          : nextMonthRenewal;
    case Renewal.weekly:
      final int startWeekDay = start.weekday;
      final int fromWeekDay = from.weekday;

      return DateTime(
        from.year,
        from.month,
        fromWeekDay == startWeekDay
            ? from.day + 7
            : from.day + (startWeekDay - fromWeekDay) % 7,
        start.hour,
        start.minute,
        start.second,
        start.millisecond,
        start.microsecond,
      );
  }
}