nextRenewal method
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,
);
}
}