listServicesForDateRange method
All dates are inclusive.
Implementation
Future<Map<Date, Set<String>>> listServicesForDateRange(
DateTime startDateTime,
DateTime endDateTime,
) async {
final servicesForDays = <Date, Set<String>>{};
var currentDateTime = startDateTime;
while (currentDateTime.isBefore(endDateTime) ||
currentDateTime.isAtSameMomentAs(endDateTime)) {
servicesForDays[Date.fromDatetime(currentDateTime)] = {};
currentDateTime = currentDateTime.add(Duration(days: 1));
}
await for (Map<String, String> service
in regularCalendar?.streamRawResource(
LoadCriterion(['start_date', 'end_date'], (requestedFields) {
final startDate = Date.parse(requestedFields[0]!).toDateTime();
final endDate = Date.parse(requestedFields[1]!).toDateTime();
return (startDateTime.isAfter(startDate) ||
startDateTime.isAtSameMomentAs(startDate)) &&
(endDateTime.isBefore(endDate) ||
endDateTime.isAtSameMomentAs(endDate));
}),
) ??
Stream.empty()) {
for (final dayToTest in servicesForDays.keys) {
if (service[dayToTest.weekdayToString()] == '1') {
servicesForDays[dayToTest]!.add(service['service_id']!);
}
}
}
await for (final OccasionalService occasionalService
in occasionalCalendar?.streamResource(
LoadCriterion(['date'], (requestedFields) {
final date = Date.parse(requestedFields[0]!).toDateTime();
return (date.isAfter(startDateTime) ||
date.isAtSameMomentAs(startDateTime)) &&
(date.isBefore(endDateTime) ||
date.isAtSameMomentAs(endDateTime));
}),
) ??
Stream.empty()) {
if (occasionalService.exceptionType == ExceptionType.added) {
servicesForDays[occasionalService.date]?.add(occasionalService.id);
} else {
servicesForDays[occasionalService.date]?.remove(occasionalService.id);
}
}
return servicesForDays;
}