You are here

function bat_api_services_matching_units_calendar in Booking and Availability Management API 7.2

Retrieve a list of events to use with Fullcalendar scheduler.

Parameters

string $unit_types:

string $start_date:

string $end_date:

string $event_type:

string $event_states:

1 string reference to 'bat_api_services_matching_units_calendar'
bat_api_services_resources in ./bat_api.module
Implements hook_services_resources().

File

./bat_api.module, line 1193
API access to booking data for BAT.

Code

function bat_api_services_matching_units_calendar($unit_types, $start_date, $end_date, $event_type, $event_states) {
  if ($unit_types == 'all') {
    $unit_types = array();
    foreach (bat_unit_get_types() as $type => $info) {
      $unit_types[] = $type;
    }
  }
  else {
    $unit_types = array_filter(explode(',', $unit_types));
  }
  $states = array_filter(explode(',', $event_states));
  $events_json = array();

  // Get the event type definition from Drupal.
  $bat_event_type = bat_event_type_load($event_type);
  $target_entity_type = $bat_event_type->target_entity_type;
  $controller = entity_get_controller($target_entity_type);

  // For each type of event create a state store and an event store.
  $state_store = new DrupalDBStore($event_type, DrupalDBStore::BAT_STATE, bat_get_db_prefix());
  $start_date_object = new DateTime($start_date);
  $end_date_object = new DateTime($end_date);
  $today = new DateTime();
  if (!user_access('view past event information') && $today > $start_date_object) {
    if ($today > $end_date_object) {
      $return->events = array();
      return $return;
    }
    $start_date_object = $today;
  }
  foreach ($unit_types as $unit_type) {
    $entities = $controller
      ->getReferencedIds($unit_type);
    $childrens = array();
    $units = array();
    foreach ($entities as $entity) {
      $target_entity = entity_load_single($target_entity_type, $entity['id']);
      $units[] = new Unit($entity['id'], $target_entity
        ->getEventDefaultValue($event_type));
    }
    if (!empty($units)) {
      $dates = array(
        $end_date_object
          ->getTimestamp() => $end_date_object,
      );
      $calendar = new Calendar($units, $state_store);
      $event_ids = $calendar
        ->getEvents($start_date_object, $end_date_object);
      foreach ($event_ids as $unit_id => $unit_events) {
        foreach ($unit_events as $key => $event) {
          $event_start_date = $event
            ->getStartDate();
          $dates[$event_start_date
            ->getTimestamp()] = $event_start_date;
        }
      }
      ksort($dates);
      $dates = array_values($dates);
      for ($i = 0; $i < count($dates) - 1; $i++) {
        $sd = $dates[$i];
        $ed = clone $dates[$i + 1];
        $ed
          ->sub(new DateInterval('PT1M'));
        $response = $calendar
          ->getMatchingUnits($sd, $ed, $states, array(), FALSE, FALSE);
        if (count(array_keys($response
          ->getIncluded()))) {
          $color = 'green';
        }
        else {
          $color = 'red';
        }
        $events_json[] = array(
          'id' => $unit_type,
          'resourceId' => $unit_type,
          'start' => $sd
            ->format('Y-m-d') . 'T' . $sd
            ->format('H:i:00'),
          'end' => $ed
            ->format('Y-m-d') . 'T' . $ed
            ->format('H:i:00'),
          'color' => $color,
          'rendering' => 'background',
          'blocking' => 0,
          'title' => '',
        );
      }
    }
  }
  $events_json = _bat_api_merge_non_blocking_events($events_json);
  $context = array(
    'unit_types' => $unit_types,
    'start_date' => $start_date_object,
    'end_date' => $end_date_object,
    'event_type' => $event_type,
    'event_states' => $event_states,
  );
  drupal_alter('bat_api_matching_units_calendar', $events_json, $context);
  return array_values($events_json);
}