listServicesForDateRange method

Future<Map<Date, Set<String>>> listServicesForDateRange(
  1. DateTime startDateTime,
  2. DateTime endDateTime
)

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;
}