contacts_events-8.x-1.x-dev/modules/accommodation/src/AccommodationHelper.php
modules/accommodation/src/AccommodationHelper.php
<?php
namespace Drupal\contacts_events_accommodation;
use Drupal\contacts_events\Entity\EventInterface;
use Drupal\contacts_events\PriceCalculator;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\EntityReferenceFieldItemList;
/**
* Service to provide information and validation for accommodation.
*/
class AccommodationHelper {
/**
* Validation has passed.
*/
const VALIDATE_OK = 0;
/**
* Validation failed: Too little accommodation.
*/
const VALIDATE_TOO_LITTLE = 1;
/**
* Validation failed: Too much accommodation.
*/
const VALIDATE_TOO_MUCH = 2;
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The price calculator service.
*
* @var \Drupal\contacts_events\PriceCalculator
*/
protected $priceCalculator;
/**
* The class to use for the booking accommodation helper.
*
* @var string
*/
protected $accommodationHelperClass = BookingAccommodationHelper::class;
/**
* Constructs an accommodation helper object.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\contacts_events\PriceCalculator $price_calculator
* The price calculator service.
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager, PriceCalculator $price_calculator) {
$this->entityTypeManager = $entity_type_manager;
$this->priceCalculator = $price_calculator;
}
/**
* Set the accommodation helper class.
*
* @param string $accommodationHelperClass
* The accommodation helper class to use. Must be an instance of
* BookingAccommodationHelperInterface.
*
* @return $this
*/
public function setAccommodationHelperClass(string $accommodationHelperClass) {
$this->accommodationHelperClass = $accommodationHelperClass;
return $this;
}
/**
* Get the booking accommodation helper.
*
* @return \Drupal\contacts_events_accommodation\BookingAccommodationHelperInterface
* The booking accommodation helper for the specific booking.
*/
public function getBookingHelper(EntityReferenceFieldItemList $items): BookingAccommodationHelperInterface {
return new $this->accommodationHelperClass($items, $this->entityTypeManager, $this->priceCalculator);
}
/**
* Get the accommodation of the given type, sorted by weight.
*
* @param \Drupal\contacts_events\Entity\EventInterface $event
* The event to get accommodation for.
* @param string $bundle
* The accommodation bundle.
* @param bool $public
* Whether to only include public accommodation.
*
* @return \Drupal\contacts_events_accommodation\AccommodationInterface[]
* The accommodation, sorted by weight.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function getAccommodation(EventInterface $event, string $bundle, bool $public = TRUE) {
$storage = $this->entityTypeManager->getStorage('c_events_accommodation');
$query = $storage->getQuery()
->accessCheck(TRUE)
->condition('event', $event->id())
->condition('bundle', $bundle)
->sort('weight', 'ASC')
->sort('title', 'ASC');
if ($public) {
$query->condition('public', TRUE);
}
return $storage->loadMultiple($query->execute());
}
/**
* Validate that an appropriate amount of accommodation is chosen.
*
* @param int $delegates
* The number of delegates.
* @param array $quantities
* The quantity of accommodation, keyed by accommodation id.
*
* @return int
* The validation result. Once of the self::VALIDATE_* constants.
*/
public function validateAccommodationTotal(int $delegates, array $quantities) {
$min_delegates = 0;
$max_delegates = NULL;
/** @var \Drupal\contacts_events_accommodation\AccommodationInterface[] $accommodations */
$accommodations = $this->entityTypeManager
->getStorage('c_events_accommodation')
->loadMultiple(array_keys($quantities));
foreach ($accommodations as $id => $accommodation) {
$quantity = $quantities[$id];
if ($min = $accommodation->getMinDelegates()) {
$min_delegates += $min * $quantity;
}
if ($max = $accommodation->getMaxDelegates()) {
$max_delegates = ($max_delegates ?? 0) + ($max * $quantity);
}
}
// Return our validation status.
if ($min_delegates > $delegates) {
return self::VALIDATE_TOO_MUCH;
}
if (isset($max_delegates) && $max_delegates < $delegates) {
return self::VALIDATE_TOO_LITTLE;
}
return self::VALIDATE_OK;
}
}
