You are here

class AvailabilityAgentCommerceFilter in Rooms - Drupal Booking for Hotels, B&Bs and Vacation Rentals 7

Filter units if is in the commerce cart.

Hierarchy

Expanded class hierarchy of AvailabilityAgentCommerceFilter

File

modules/rooms_booking/includes/rooms_booking.availability_agent_filter.inc, line 299
Rooms Booking agent filter interfaces and base implementations.

View source
class AvailabilityAgentCommerceFilter extends AvailabilityAgentFilterBase {

  /**
   * {@inheritdoc}
   */
  public function applyFilter() {
    global $user;

    // Check parameters.
    $start_date = isset($this->parameters['start_date']) ? $this->parameters['start_date'] : date_create()
      ->setTimestamp(0);
    $end_date = isset($this->parameters['end_date']) ? $this->parameters['end_date'] : date_create()
      ->setTimestamp(2147483647);
    if (empty($this->units)) {
      $query = new EntityFieldQuery();
      $query
        ->entityCondition('entity_type', 'rooms_unit')
        ->propertyOrderBy('max_sleeps', 'ASC')
        ->propertyCondition('bookable', 1);

      // Execute the query and collect the results.
      $results = $query
        ->execute();
      if (count($results)) {
        $results = $results['rooms_unit'];
      }
    }
    else {
      $results = $this->units;
    }

    // Load all the current carts to
    $orders = array();
    $query = new EntityFieldQuery();
    $result = $query
      ->entityCondition('entity_type', 'commerce_order')
      ->propertyCondition('status', array(
      'cart',
      'checkout_checkout',
      'checkout_review',
      'checkout_payment',
      'checkout_complete',
    ))
      ->execute();
    if (isset($result['commerce_order'])) {
      $orders = commerce_order_load_multiple(array_keys($result['commerce_order']));
    }
    foreach ($orders as $order) {
      $wrapper = entity_metadata_wrapper('commerce_order', $order);

      // See if there are any product line items.
      if (commerce_line_items_quantity($wrapper->commerce_line_items, commerce_product_line_item_types()) > 0) {

        // Get the unit IDs already in the cart.
        foreach ($wrapper->commerce_line_items as $line_item) {

          // There are some line_item types as: coupon, fee, etc. that don't
          // have a referenced commerce_product.
          if (in_array($line_item->type
            ->value(), commerce_product_line_item_types())) {

            // Need to check if commerce_product_type = 'rooms_product'.
            if ($line_item->commerce_product
              ->value()->type == 'rooms_product') {
              if (isset($line_item->rooms_booking_dates)) {
                $rooms_booking_dates = $line_item->rooms_booking_dates
                  ->value();

                // Current line_item start_date and end_date values.
                $s_date = new DateTime($rooms_booking_dates['value']);
                $e_date = new DateTime($rooms_booking_dates['value2']);

                // If current line_item date interval overlap parameters interval
                // remove unit from results.
                if ($this
                  ->checkInRange($s_date, $e_date, $start_date, $end_date)) {
                  if (isset($results[$line_item->rooms_booked_unit_id
                    ->value()])) {
                    unset($results[$line_item->rooms_booked_unit_id
                      ->value()]);
                  }
                }
              }
            }
          }
        }
      }
    }
    if (empty($this->units)) {
      return $results;
    }
    else {

      // Computes the intersection of units and results.
      return $this
        ->intersectUnits($results);
    }
  }

  /**
   * Checks if search interval overlaps line_item interval.
   *
   * @param DateTime $line_item_start_date
   *   Line item start date.
   * @param DateTime $line_item_end_date
   *   Line item end date.
   * @param DateTime $start_date
   *   Interval start date.
   * @param DateTime $end_date
   *   Interval end date.
   *
   * @return bool
   *   TRUE in case of overlapping, FALSE otherwise.
   */
  private function checkInRange($line_item_start_date, $line_item_end_date, $start_date, $end_date) {
    if (!($line_item_start_date < $start_date && $line_item_end_date < $start_date || $line_item_start_date > $end_date && $line_item_end_date > $end_date)) {
      return TRUE;
    }
    else {
      return FALSE;
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AvailabilityAgentCommerceFilter::applyFilter public function Applies the filter operation to the units in the filter. Overrides AvailabilityAgentFilterInterface::applyFilter
AvailabilityAgentCommerceFilter::checkInRange private function Checks if search interval overlaps line_item interval.
AvailabilityAgentFilterBase::$parameters protected property Set of filter parameters.
AvailabilityAgentFilterBase::$units protected property Set of bookable units to filter through.
AvailabilityAgentFilterBase::availabilityChangeSearchForm public static function Adds necessary form elements to Change availability search form. Overrides AvailabilityAgentFilterInterface::availabilityChangeSearchForm
AvailabilityAgentFilterBase::availabilityChangeSearchFormValidate public static function Specific validation callback for Change availability search form. Overrides AvailabilityAgentFilterInterface::availabilityChangeSearchFormValidate
AvailabilityAgentFilterBase::availabilitySearchForm public static function Adds necessary form elements to Availability search form. Overrides AvailabilityAgentFilterInterface::availabilitySearchForm
AvailabilityAgentFilterBase::availabilitySearchFormValidate public static function Specific validation callback for Availability search form. Overrides AvailabilityAgentFilterInterface::availabilitySearchFormValidate
AvailabilityAgentFilterBase::availabilitySearchParameters public static function Returns a list of parameters to add to the search array. Overrides AvailabilityAgentFilterInterface::availabilitySearchParameters
AvailabilityAgentFilterBase::intersectUnits protected function Intersects the units that passes the filter and the unit set provided.
AvailabilityAgentFilterBase::__construct public function Builds a new AvailabilityAgentFilter object.