You are here

protected function AvailabilityAgent::getUnitsByPriceType in Rooms - Drupal Booking for Hotels, B&Bs and Vacation Rentals 7

Returns the units array in a specific format based on price.

Parameters

array $results: Units to sort.

array $price_modifiers: Price modifiers.

Return value

array Units in a price based structure.

2 calls to AvailabilityAgent::getUnitsByPriceType()
AvailabilityAgent::checkAvailability in modules/rooms_booking/includes/rooms_booking.availability_agent.inc
Checks the availability.
AvailabilityAgent::checkAvailabilityForUnit in modules/rooms_booking/includes/rooms_booking.availability_agent.inc
Returns availability for a specific unit.

File

modules/rooms_booking/includes/rooms_booking.availability_agent.inc, line 352
Contains the AvailabilityAgent.

Class

AvailabilityAgent
An AvailabilityAgent provides access to the availability functionality of Rooms and lets you query for availability, get pricing information and create products that can be bought.

Code

protected function getUnitsByPriceType($results, $price_modifiers = array()) {
  $units = array();
  if (count($results) > 0) {
    foreach ($results as $unit) {

      // Get the actual entity.
      $unit = rooms_unit_load($unit->unit_id);

      // Get a calendar and check availability.
      $rc = new UnitCalendar($unit->unit_id);

      // We need to make this based on user-set vars.
      // Rather than using $rc->stateAvailability we will get the states check
      // directly as different states will impact on what products we create.
      $states = $rc
        ->getStates($this->start_date, $this->end_date);

      // Calculate the price as well to add to the array.
      $temp_end_date = clone $this->end_date;
      $temp_end_date
        ->add(new DateInterval('P1D'));
      $booking_info = array(
        'start_date' => clone $this->start_date,
        'end_date' => $temp_end_date,
        'unit' => $unit,
        'booking_parameters' => $this->booking_parameters,
      );

      // Give other modules a chance to change the price modifiers.
      $current_price_modifiers = $price_modifiers;
      drupal_alter('rooms_price_modifier', $current_price_modifiers, $booking_info);
      $price_calendar = new UnitPricingCalendar($unit->unit_id, $current_price_modifiers);
      if (variable_get('rooms_price_calculation', ROOMS_PER_NIGHT) == ROOMS_PER_PERSON && count($this->booking_parameters) == 1 && isset($this->booking_parameters[0]) && is_array($this->booking_parameters)) {
        $price_log = $price_calendar
          ->calculatePrice($this->start_date, $this->end_date, $this->booking_parameters[0]['adults'], $this->booking_parameters[0]['children'], $this->booking_parameters[0]['childrens_age']);
      }
      else {
        $price_log = $price_calendar
          ->calculatePrice($this->start_date, $this->end_date);
      }
      $full_price = $price_log['full_price'];
      $units[$unit->type][$full_price][$unit->unit_id]['unit'] = $unit;
      $units[$unit->type][$full_price][$unit->unit_id]['price'] = $full_price;
      $units[$unit->type][$full_price][$unit->unit_id]['booking_price'] = $price_log['booking_price'];
      $units[$unit->type][$full_price][$unit->unit_id]['price_log'] = $price_log['log'];
      if (in_array(ROOMS_ON_REQUEST, $states)) {
        $units[$unit->type][$full_price][$unit->unit_id]['state'] = ROOMS_ON_REQUEST;
      }
      else {
        $units[$unit->type][$full_price][$unit->unit_id]['state'] = ROOMS_AVAILABLE;
      }
    }
  }

  // We order units by optional items to ensure that units with options are
  // the first to be picked by a user.
  $units = $this
    ->orderByOptionals($units);
  return $units;
}