/** * @return ValidationResult */ protected function validate() { if (!$this->TypeID) { $this->assignEventType(); } $valid = parent::validate(); if (!$valid->valid()) { return $valid; } $summit_id = isset($_REQUEST['SummitID']) ? $_REQUEST['SummitID'] : $this->SummitID; $summit = Summit::get()->byID($summit_id); // validate that each speakers is assigned one time at one location $start_date = $summit->convertDateFromTimeZone2UTC($this->getStartDate()); $end_date = $summit->convertDateFromTimeZone2UTC($this->getEndDate()); $presentation_id = $this->getIdentifier(); $location_id = $this->LocationID; $speakers_id = array(); $speakers = $this->Speakers(); foreach ($speakers as $speaker) { array_push($speakers_id, $speaker->ID); } $speakers_id = implode(', ', $speakers_id); if (empty($start_date) || empty($end_date) || empty($speakers_id)) { return $valid; } $query = <<<SQL SELECT COUNT(P.ID) FROM Presentation P INNER JOIN SummitEvent E ON E.ID = P.ID WHERE E.Published = 1 AND E.StartDate <= '{$end_date}' AND '{$start_date}' <= E.EndDate AND E.ID <> {$presentation_id} AND E.LocationID = {$location_id} AND E.LocationID <> 0 AND EXISTS ( \tSELECT PS.ID FROM Presentation_Speakers PS WHERE PresentationSpeakerID IN ({$speakers_id}) AND \tPresentationID = P.ID ); SQL; $qty = intval(DB::query($query)->value()); if ($qty > 0) { return $valid->error('There is a speaker assigned to another presentation on that date/time range !'); } return $valid; }