You are here

public function MerciOpenHoursConstraintValidator::validate in MERCI (Manage Equipment Reservations, Checkout and Inventory) 8.2

File

src/Plugin/Validation/Constraint/MerciOpenHoursConstraintValidator.php, line 33
Contains \Drupal\merci\Plugin\Validation\Constraint\MerciOpenHoursConstraintValidator.

Class

MerciOpenHoursConstraintValidator
Checks for conflicts when validating a entity with reservable items.

Namespace

Drupal\merci\Plugin\Validation\Constraint

Code

public function validate($value, Constraint $constraint) {

  /* @var \Drupal\Core\Field\FieldItemInterface $value */
  if (!isset($value)) {
    return;
  }
  $id = $value->target_id;

  // '0' or NULL are considered valid empty references.
  if (empty($id)) {
    return;
  }

  /* @var \Drupal\Core\Entity\FieldableEntityInterface $referenced_entity */
  $referenced_entity = $value->entity;
  $datetime_start = $value
    ->getEntity()->{$constraint->date_field}
    ->first()->start_date;
  $datetime_end = $value
    ->getEntity()->{$constraint->date_field}
    ->first()->end_date;
  $datetime_start
    ->setTimeZone(timezone_open(drupal_get_user_timezone()));
  $datetime_end
    ->setTimeZone(timezone_open(drupal_get_user_timezone()));
  $start_day_of_week = $datetime_start
    ->format('w');
  $end_day_of_week = $datetime_end
    ->format('w');
  $start_time = $datetime_start
    ->format('Gi');
  $end_time = $datetime_end
    ->format('Gi');
  $start_valid = FALSE;
  $end_valid = FALSE;
  $office_hours_field = $referenced_entity->{$constraint->reservable_hours_field}
    ->first()->entity->{$constraint->office_hours_field};
  $office_hours = array();
  foreach ($office_hours_field as $open_hours) {
    if (!array_key_exists($open_hours->day, $office_hours)) {
      $office_hours[$open_hours->day] = array();
    }
    $office_hours[$open_hours->day][] = $open_hours;
    $starthours = substr('0000' . $open_hours->starthours, -4);
    $endhours = substr('0000' . $open_hours->endhours, -4);
    if ($open_hours->day == $start_day_of_week) {
      if ($starthours <= $start_time && $endhours >= $start_time) {
        $start_valid = TRUE;
      }
    }
    if ($open_hours->day == $end_day_of_week) {
      if ($starthours <= $end_time && $endhours >= $end_time) {
        $end_valid = TRUE;
      }
    }
  }
  if ($start_valid == FALSE) {
    if (array_key_exists($start_day_of_week, $office_hours)) {
      foreach ($office_hours[$start_day_of_week] as $open_hours) {
        $message[] = $this
          ->renderOfficeHours($open_hours);
      }
      $this->context
        ->addViolation('Reservation begins at a time we are closed. We are open: %open', array(
        '%open' => implode(' ', $message),
      ));
    }
    else {
      $this->context
        ->addViolation($constraint->message);
    }
  }
  if ($end_valid == FALSE) {
    if (array_key_exists($end_day_of_week, $office_hours)) {
      foreach ($office_hours[$end_day_of_week] as $open_hours) {
        $message[] = $this
          ->renderOfficeHours($open_hours);
      }
      $this->context
        ->addViolation('Reservation ends at a time we are closed. We are open: %open', array(
        '%open' => implode(' ', $message),
      ));
    }
    else {
      $this->context
        ->addViolation($constraint->message);
    }
  }
}