contacts_events-8.x-1.x-dev/modules/village_allocation/src/VillageAllocationGroup.php
modules/village_allocation/src/VillageAllocationGroup.php
<?php
namespace Drupal\village_allocation;
use Drupal\commerce_order\Entity\Order;
/**
* This is a wrapper around Village Groups and Bookings.
*
* This provides a format that is more useful for the village allocation screen.
*
* @package Drupal\contacts_events_villages
*/
class VillageAllocationGroup {
/**
* The ID of this group.
*
* @var int
*/
private $groupId;
/**
* The name of this group.
*
* @var string
*/
private $groupName;
/**
* Bookings in this group.
*
* @var \Drupal\commerce_order\Entity\Order[]
*/
private $bookings = [];
/**
* Array of village IDs associated with this group.
*
* @var int[]
*/
private $villages = [];
/**
* Array of group names in the same link set, keyed by group ID.
*
* @var array
*/
private $links = [];
/**
* VillageAllocationGroup constructor.
*
* @param int $group_id
* ID of village allocation group.
* @param string $group_name
* Name of group.
*/
public function __construct($group_id, $group_name) {
$this->groupId = $group_id;
$this->groupName = $group_name;
}
/**
* Adds a booking to this group.
*
* @param \Drupal\commerce_order\Entity\Order $order
* The order (booking) to add.
* @param int $pitches
* Number of pitches required by this booking.
* @param bool $is_village_host_booking
* Whether the village host is part of this order.
* @param array $child_bookings
* Array of child bookings. Each element is an array with the following keys
* order: the corresponding Order entity.
* pitches: number of pitches required (int).
*/
public function addBooking(Order $order, $pitches = 0, $is_village_host_booking = FALSE, array $child_bookings = []) {
$requirements = [];
// Take into account any Requirements on the parent Group Booking.
foreach ($order->get('village_requirements') as $requirement) {
$requirements[] = [
'name' => $requirement->entity->getName(),
'id' => $requirement->entity->id(),
'icon' => $requirement->entity->get('icon')->value,
];
}
// Also take into account any requirements on the child bookings.
foreach ($child_bookings as $child_booking) {
/** @var \Drupal\commerce_order\Entity\Order $child_order */
$child_order = $child_booking['order'];
foreach ($child_order->get('village_requirements') as $requirement) {
$requirements[] = [
'name' => $requirement->entity->getName(),
'id' => $requirement->entity->id(),
'icon' => $requirement->entity->get('icon')->value,
];
}
}
if ($is_village_host_booking) {
$requirements[] = [
'name' => 'Village Host',
'id' => 0,
'icon' => 'village-host',
];
}
$this->bookings[] = [
'orderNumber' => $order->getOrderNumber(),
'id' => $order->id(),
'village' => $order->get('village')->target_id,
'pitches' => $pitches,
'specialRequirements' => $requirements,
'selected' => FALSE,
'state' => $order->getState()->getId(),
'bookingManager' => [
'id' => $order->getCustomer()->id(),
'name' => $order->getCustomer()->getDisplayName(),
],
'childBookings' => array_map(function ($child_booking) {
/** @var \Drupal\commerce_order\Entity\Order $child_order */
$child_order = $child_booking['order'];
return [
'orderNumber' => $child_order->getOrderNumber(),
'id' => $child_order->id(),
'village' => $child_order->get('village')->target_id,
'pitches' => $child_booking['pitches'],
'state' => $child_order->getState()->getId(),
'bookingManager' => [
'id' => $child_order->getCustomer()->id(),
'name' => $child_order->getCustomer()->getDisplayName(),
],
];
}, $child_bookings),
];
}
/**
* Adds a linked group.
*
* @param int $linked_group_id
* Linked group ID.
* @param string $linked_group_name
* Linked group name.
*/
public function addLink(int $linked_group_id, string $linked_group_name) {
// Parameter must be type hinted as int, to ensure any string group IDs are
// converted to ints (which the javascript expects).
$this->links[] = [
'id' => $linked_group_id,
'name' => $linked_group_name,
];
}
/**
* Gets the name of the group.
*
* @return string
* The name of the group.
*/
public function getName() {
return $this->groupName;
}
/**
* Gets the ID of the group.
*
* @return int
* The ID of the group.
*/
public function id() {
return $this->groupId;
}
/**
* Converts the group to an array, ready for JSON serialization.
*
* @return array
* Array of group and bookings.
*/
public function toArray() {
$result = [
'id' => (int) $this->groupId,
'name' => $this->groupName,
'bookings' => $this->bookings,
'pitches' => 0,
'villages' => $this->villages,
'links' => $this->links,
];
foreach ($this->bookings as $booking) {
$result['pitches'] += $booking['pitches'];
}
return $result;
}
/**
* Records that this group is already partly allocated to a village.
*
* @param int $village_id
* The ID of the village.
*/
public function addVillage($village_id) {
$this->villages[] = $village_id;
}
/**
* Villages that this group has been assigned to.
*
* @return int[]
* Array of village ids.
*/
public function getVillages() : array {
return $this->villages;
}
/**
* Sets the villages to which this group has already been assigned.
*
* @param array $villages
* Array of village IDs.
*/
public function setVillages(array $villages) {
$this->villages = $villages;
}
/**
* Gets the number of bookings in this group.
*
* @return int
* Number of bookings.
*/
public function numberOfBookings() : int {
return count($this->bookings);
}
}
