ppound
4 years ago
2 changed files with 119 additions and 1 deletions
@ -0,0 +1,117 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @file |
||||||
|
* Contains \Drupal\custom_pub\Plugin\RulesAction\SetCustomPublishingOption. |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace Drupal\roblib_bee_limits\Plugin\RulesAction; |
||||||
|
|
||||||
|
use Drupal\rules\Core\RulesActionBase; |
||||||
|
use Drupal\Core\Entity\EntityInterface; |
||||||
|
use Symfony\Component\HttpFoundation\RedirectResponse; |
||||||
|
|
||||||
|
/** |
||||||
|
* Provides an action to trigger a custom publishing option. |
||||||
|
* |
||||||
|
* @RulesAction( |
||||||
|
* id = "rules_roblib_bee_limits_validate", |
||||||
|
* label = @Translation("Additional validation on BAT Events"), |
||||||
|
* category = @Translation("Event"), |
||||||
|
* context = { |
||||||
|
* "entity" = @ContextDefinition("entity:bat_event", |
||||||
|
* label = @Translation("Event"), |
||||||
|
* description = @Translation("Specifies the event, which should be validated.") |
||||||
|
* ) |
||||||
|
* } |
||||||
|
* ) |
||||||
|
*/ |
||||||
|
class BatEventValidation extends RulesActionBase { |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the custom publishing option on a given entity. |
||||||
|
* |
||||||
|
* @param \Drupal\Core\Entity\EntityInterface $event |
||||||
|
* The entity to be saved. |
||||||
|
*/ |
||||||
|
protected function doExecute(EntityInterface $event) { |
||||||
|
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id()); |
||||||
|
$event_type = bat_event_type_load($event->bundle()); |
||||||
|
// we only want to limit hourly reservations |
||||||
|
if($event_type->id() != 'availability_hourly') { |
||||||
|
return; |
||||||
|
} |
||||||
|
$this->checkReservations($user); |
||||||
|
$start_date = $event->getStartDate(); |
||||||
|
$end_date = $event->getEndDate(); |
||||||
|
$start_timestamp = new \DateTime($start_date->format('Y-m-d H:i')); |
||||||
|
$end_timestamp = new \DateTime($end_date->format('Y-m-d H:i')); |
||||||
|
$minutes_diff = abs($end_timestamp->getTimestamp() - $start_timestamp->getTimestamp()) / 60; |
||||||
|
$max_time = $this->getMaxTime($user); |
||||||
|
if($minutes_diff > $max_time) { |
||||||
|
drupal_set_message(t('Rule hit Reservation exceeded your max |
||||||
|
booking time of @max_time minutes.', array('@max_time' => $max_time)), 'error'); |
||||||
|
|
||||||
|
$response = new RedirectResponse(\Drupal::request()->getRequestUri()); |
||||||
|
$response->send(); |
||||||
|
exit; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function getMaxTime($user){ |
||||||
|
$roles = $user->getRoles(); |
||||||
|
$config = \Drupal::config('roblib_bee_limits.settings'); |
||||||
|
$max_time = 0; |
||||||
|
foreach($roles as $role){ |
||||||
|
$tmp = $config->get($role . '_max_booking_duration'); |
||||||
|
$tmp = empty($tmp) ? 0 : $tmp; |
||||||
|
$max_time = $max_time > $tmp ? $max_time : $tmp; |
||||||
|
} |
||||||
|
return $max_time; |
||||||
|
} |
||||||
|
|
||||||
|
function getMaxBookingsAllowed($user) { |
||||||
|
$roles = $user->getRoles(); |
||||||
|
$config = \Drupal::config('roblib_bee_limits.settings'); |
||||||
|
$max_active_bookings = 0; |
||||||
|
foreach($roles as $role){ |
||||||
|
$tmp = $config->get($role . '_active_bookings_allowed'); |
||||||
|
$tmp = empty($tmp) ? 0 : $tmp; |
||||||
|
$max_active_bookings = $max_active_bookings > $tmp ? $max_active_bookings : $tmp; |
||||||
|
} |
||||||
|
//$is_admin = array_search('administrator', $roles); |
||||||
|
return $max_active_bookings; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function checkReservations($user) { |
||||||
|
$uid = $user->id(); |
||||||
|
$results = \Drupal::entityQuery('bat_event') |
||||||
|
->condition('uid', $uid, '=') |
||||||
|
->condition('type', 'availability_hourly', '=') |
||||||
|
->execute(); |
||||||
|
|
||||||
|
$active_bookings = 0; |
||||||
|
$now = new \DateTime("now"); |
||||||
|
foreach($results as $result){ |
||||||
|
$event = bat_event_load($result); |
||||||
|
if($event->getEndDate() > $now){ |
||||||
|
$active_bookings++; |
||||||
|
} |
||||||
|
$event = NULL; |
||||||
|
} |
||||||
|
$max_bookings_allowed = $this->getMaxBookingsAllowed($user); |
||||||
|
if($max_bookings_allowed != -1 && $active_bookings >= $max_bookings_allowed){ |
||||||
|
drupal_set_message(t('Rule Hit Reservation exceeded your maximum number |
||||||
|
of active bookings allowed. You currently have @active_bookings active reservations, |
||||||
|
You are allowed @max_bookings .', array('@active_bookings' => $active_bookings, |
||||||
|
'@max_bookings' => $max_bookings_allowed)),'error'); |
||||||
|
|
||||||
|
$response = new RedirectResponse(\Drupal::request()->getRequestUri()); |
||||||
|
$response->send(); |
||||||
|
exit; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue