You are here

protected function MerciDefaultController::buildConflictQuery in MERCI (Manage Equipment Reservations, Checkout and Inventory) 7.3

1 call to MerciDefaultController::buildConflictQuery()
MerciDefaultController::conflicts in merci_core/reservation.handler.inc

File

merci_core/reservation.handler.inc, line 324
Abstraction of the selection logic of an entity reference field.

Class

MerciDefaultController
A null implementation of EntityReference_SelectionHandler.

Code

protected function buildConflictQuery($dates) {
  $context = $this->context;
  $exclude_id = $this->entity
    ->getIdentifier();
  $entity_type = $this->entity
    ->type();
  $item_table = $this->item_table;
  $item_column = $this->item_column;
  $date_table = $this->date_table;
  $date_column = $this->date_column;
  $date_column2 = $this->date_column2;
  $parent_table = $this->parent_table;
  $parent_index = $this->parent_index;
  $items = array();
  foreach ($this->items as $delta => $item) {
    $items[] = $item
      ->getIdentifier();
  }

  // Build the query.
  $query = db_select($item_table, 'item_table');
  $query
    ->addField('item_table', $item_column, 'item_id');
  $query
    ->addField('item_table', 'entity_id', 'parent_id');
  if (count($this->items) == 1) {
    $query
      ->condition($item_column, reset($items));
  }
  else {
    $query
      ->condition($item_column, $items, 'IN');
  }

  // Ignore myself.
  if ($exclude_id) {
    $query
      ->condition('item_table.entity_id', $exclude_id, '!=');
  }
  $query
    ->join($parent_table, 'merci_line_item', 'item_table.entity_id = merci_line_item.' . $parent_index);
  if ($this->parent_has_quantity) {
    $query
      ->addField('merci_line_item', 'quantity', 'quantity');
  }
  else {
    $query
      ->addExpression('1', 'quantity');
  }
  if ($this->parent_has_status) {
    $query
      ->condition('merci_line_item.status', 1, '=');
  }
  $query
    ->join($date_table, 'date_table', 'item_table.entity_id = date_table.entity_id');
  $query
    ->addField('date_table', $date_column);

  //, MERCI_DATE_FIELD_ALIAS);
  $query
    ->addField('date_table', $date_column2);

  //, MERCI_DATE_FIELD_ALIAS2);
  $query
    ->condition('date_table.entity_type', $entity_type, '=');
  $query
    ->condition('date_table.deleted', 0, '=');

  // TODO handled multiple dates.
  $query
    ->condition(db_or()
    ->condition(db_and()
    ->condition($date_column, $dates['value'], '<=')
    ->condition($date_column2, $dates['value'], '>='))
    ->condition(db_and()
    ->condition($date_column, $dates['value2'], '<=')
    ->condition($date_column2, $dates['value2'], '>='))
    ->condition(db_and()
    ->condition($date_column, $dates['value'], '>')
    ->condition($date_column2, $dates['value2'], '<')));
  $query
    ->orderBy($date_column, 'ASC');

  // Add a generic entity access tag to the query.
  $query
    ->addTag('merci_resource');
  $query
    ->addMetaData('merci_reservable_handler', $this);
  return $query;
}