$red_flag_rooms = array(); //gruppierte Termine durchlaufen foreach($groupedDates['groups'] as $group_id => $group) { $events = array(); foreach ($assignObjects as $assObj) { if ($group['termin_ids'][$assObj->getAssignUserId()]) { foreach ($assObj->getEvents() as $evtObj) { $events[$evtObj->getId()] = $evtObj; if (($evtObj->getBegin() < $first_event) || (!$first_event)) $first_event = $evtObj->getBegin(); } } } $multiOverlaps->checkOverlap($events, $tmp_result, "assign_user_id"); $overlaps = array(); if (is_array($tmp_result)) { foreach ($tmp_result as $room => $data) { $tmp_overlap_count = 0; foreach($data as $ovl_termin_id => $ovl_termine) { $result[$room][$ovl_termin_id] = $ovl_termine; foreach ($ovl_termine as $termin) { foreach($events as $an_event) { if ( ($termin['begin'] >= $an_event->begin && $termin['begin'] < $an_event->end) || ($termin['begin'] <= $an_event->begin && $termin['end'] > $an_event->begin) ) { $tmp_overlap_count++; } } }
function showSearchList($search_array, $check_assigns = FALSE) { //create the query if ($search_array['resources_search_range']){ $search_only = $this->getResourcesSearchRange($search_array['resources_search_range']); } $parameters = array(); if ($search_array['properties']) { $query = "SELECT a.resource_id, COUNT(a.resource_id) AS resource_id_count FROM resources_objects_properties AS a LEFT JOIN resources_objects AS b USING (resource_id) LEFT JOIN resources_categories USING (category_id)"; if (!hasGlobalOccupationAccess()) { $query .= " LEFT JOIN `resources_user_resources` AS rur ON (rur.`resource_id` = b.`resource_id`)"; } $query .= " WHERE "; $conditions = array(); $i = 0; foreach ($search_array['properties'] as $key => $val) { // if ($val == 'on') { // $val = 1; // } //let's create some possible wildcards if (strpos($val, '<=') !== false) { $val = (int) substr($val, strpos($val, '<=') + 2); $linking = '<='; } elseif (strpos($val, '>=') !== false) { $val = (int) substr($val, strpos($val, '>=') + 2); $linking = '>='; } elseif (strpos($val, '<') !== false) { $val = (int) substr($val, strpos($val, '<') + 1); $linking = '<'; } elseif (strpos($val, '>') !== false) { $val = (int) substr($val, strpos($val, '>') + 1); $linking = '>'; } else { $linking = '='; } $conditions[] = "(property_id = :key{$i} AND state {$linking} :state{$i})"; $parameters[':key' . $i] = $key; $parameters[':state' . $i] = $val; $i += 1; } $query .= (count($conditions) > 0) ? implode(' OR ', $conditions) : '1'; $query .= " AND b.name LIKE CONCAT('%', :needle, '%')"; $parameters[':needle'] = $search_array['search_exp']; if ($this->supress_hierachy_levels) { $query .= " AND b.category_id != ''"; } if ($this->show_only_rooms) { $query .= " AND is_room = 1"; } if ($search_array['resources_search_range']) { $query .= " AND b.resource_id IN (:resource_ids)"; $parameters[':resource_ids'] = $resource_ids ?: ''; } if (!hasGlobalOccupationAccess()) { $query .= " AND (b.`owner_id`=:user OR rur.`user_id`=:user)"; $parameters[':user'] = $GLOBALS['user']->id; } $query .= " GROUP BY a.resource_id HAVING resource_id_count = :count"; $parameters[':count'] = $i; $query .=" ORDER BY b.name"; } else { $query = "SELECT resource_id FROM resources_objects AS ro LEFT JOIN resources_categories USING (category_id)"; if (!hasGlobalOccupationAccess()) { $query .= " LEFT JOIN `resources_user_resources` USING (`resource_id`)"; } $query .= " WHERE ro.name LIKE CONCAT('%', :needle, '%')"; $parameters[':needle'] = $search_array['search_exp']; if ($this->supress_hierachy_levels) { $query .= " AND ro.category_id != ''"; } if ($this->show_only_rooms) { $query .= " AND is_room = 1"; } if ($search_array['resources_search_range']) { $query .= " AND ro.resource_id IN (:resource_ids)"; $parameters[':resource_ids'] = $search_only ?: ''; } if (!hasGlobalOccupationAccess()) { $query .= " AND (ro.`owner_id`=:user OR `user_id`=:user)"; $parameters[':user'] = $GLOBALS['user']->id; } $query .= " ORDER BY ro.name"; } $statement = DBManager::get()->prepare($query); $statement->execute($parameters); $resource_ids = $statement->fetchAll(PDO::FETCH_COLUMN); //if we have an empty result if (count($resource_ids) == 0 && $level == 0) { return FALSE; } foreach ($resource_ids as $resource_id) { $found_resources[$resource_id] = TRUE; } $day_of_week = false; //do further checks to determine free resources inthe given time range if ($search_array["search_assign_begin"] && $check_assigns) { $multiOverlaps = new CheckMultipleOverlaps; // >> changed for advanced search for room administrators if ($search_array["search_repeating"]) { // is this slot empty for the rest of the term? $semester_data = new SemesterData(); $semester = $semester_data->getSemesterDataByDate($search_array["search_assign_begin"]); // create the dummy assign object $assObj = new AssignObject(''); $assObj->setBegin($search_array["search_assign_begin"]); $assObj->setEnd($search_array["search_assign_end"]); $assObj->setRepeatEnd($semester["vorles_ende"]); $assObj->setRepeatInterval(1); $assObj->setRepeatQuantity(-1); // calculate stud.IP-day-of-week $day_of_week = date("w", $search_array["search_assign_begin"]); $day_of_week = $day_of_week == 0 ? 7 : $day_of_week; $assObj->setRepeatDayOfWeek($day_of_week); // set time range for checks $multiOverlaps->setAutoTimeRange(Array($assObj)); // generate and get the events represented by assign object $events = $assObj->getEvents(); foreach($events as $ev) { $event[$ev->getId()] = $ev; } } else { // the code for one specific slot $assEvt = new AssignEvent('', $search_array["search_assign_begin"], $search_array["search_assign_end"], '', ''); $multiOverlaps->setTimeRange($search_array["search_assign_begin"], $search_array["search_assign_end"]); $event[$assEvt->getId()] = $assEvt; } // << changed for advanced search for room administrators //add the found resources to the check-set foreach ($found_resources as $key=>$val) { $multiOverlaps->addResource($key, $day_of_week); } $multiOverlaps->checkOverlap($event, $result); //output foreach ($found_resources as $key=>$val) { if (!$result[$key]) { $this->showListObject($key); $result_count++; } } } else { //output foreach ($found_resources as $key=>$val) { $this->showListObject($key); $result_count++; } } return $result_count; }
function bookable_rooms_action() { if (!getGlobalPerms($GLOBALS['user']->id) == 'admin') { $resList = new ResourcesUserRoomsList($GLOBALS['user']->id, false, false, false); if (!$resList->roomsExist()) { throw new AccessDeniedException(); } } $select_options = Request::optionArray('rooms'); $rooms = array_filter($select_options, function ($v) { return strlen($v) === 32; }); $events = array(); $dates = array(); $timestamps = array(); if (count(Request::getArray('new_date'))) { $new_date = array(); foreach (Request::getArray('new_date') as $one) { if ($one['name'] == 'startDate') { $dmy = explode('.', $one['value']); $new_date['day'] = (int) $dmy[0]; $new_date['month'] = (int) $dmy[1]; $new_date['year'] = (int) $dmy[2]; } $new_date[$one['name']] = (int) $one['value']; } if (check_singledate($new_date['day'], $new_date['month'], $new_date['year'], $new_date['start_stunde'], $new_date['start_minute'], $new_date['end_stunde'], $new_date['end_minute'])) { $start = mktime($new_date['start_stunde'], $new_date['start_minute'], 0, $new_date['month'], $new_date['day'], $new_date['year']); $ende = mktime($new_date['end_stunde'], $new_date['end_minute'], 0, $new_date['month'], $new_date['day'], $new_date['year']); $timestamps[] = $start; $timestamps[] = $ende; $event = new AssignEvent('new_date', $start, $ende, null, null, ''); $events[$event->getId()] = $event; } } foreach (Request::optionArray('selected_dates') as $one) { $date = new SingleDate($one); if ($date->getStartTime()) { $timestamps[] = $date->getStartTime(); $timestamps[] = $date->getEndTime(); $event = new AssignEvent($date->getTerminID(), $date->getStartTime(), $date->getEndTime(), null, null, ''); $events[$event->getId()] = $event; $dates[$date->getTerminID()] = $date; } } if (count($events)) { $result = array(); $checker = new CheckMultipleOverlaps(); $checker->setTimeRange(min($timestamps), max($timestamps)); foreach ($rooms as $room) { $checker->addResource($room); } $checker->checkOverlap($events, $result, "assign_id"); foreach ((array) $result as $room_id => $details) { foreach ($details as $termin_id => $conflicts) { if ($termin_id == 'new_date' && Request::option('singleDateID')) { $assign_id = SingleDateDB::getAssignID(Request::option('singleDateID')); } else { $assign_id = SingleDateDB::getAssignID($termin_id); } $filter = function ($a) use($assign_id) { if ($a['assign_id'] && $a['assign_id'] == $assign_id) { return false; } return true; }; if (!count(array_filter($conflicts, $filter))) { unset($result[$room_id][$termin_id]); } } } $result = array_filter($result); $this->render_json(array_keys($result)); return; } $this->render_nothing(); }
/** * handle common tasks for the romm request form * (set properties, searching etc.) */ public static function process_form($request, $admission_turnout = null) { if (Request::submitted('room_request_form')) { CSRFProtection::verifyUnsafeRequest(); if (Request::submitted('send_room')) { $request->setResourceId(Request::option('select_room')); } else { $request->setResourceId(Request::option('selected_room')); } if (Request::submitted('reset_resource_id')) { $request->setResourceId(''); } if (Request::submitted('reset_room_type')) { $request->setCategoryId(''); } if (Request::get('comment') !== null) { $request->setComment(Request::get('comment')); } if (Request::get('reply_recipients') !== null) { $request->reply_recipients = Request::get('reply_recipients'); } if (!Request::submitted('reset_room_type')) { $request->setCategoryId(Request::option('select_room_type')); } //Property Requests if ($request->getCategoryId()) { $request_property_val = Request::getArray('request_property_val'); foreach ($request->getAvailableProperties() as $prop) { if ($prop["system"] == 2) { //it's the property for the seat/room-size! if (Request::get('seats_are_admission_turnout') && $admission_turnout) { $request->setPropertyState($prop['property_id'], $admission_turnout); } else { if (!Request::submitted('send_room_type')) { $request->setPropertyState($prop['property_id'], abs($request_property_val[$prop['property_id']])); } } } else { $request->setPropertyState($prop['property_id'], $request_property_val[$prop['property_id']]); } } } if (Request::get('search_exp_room') && Request::submitted('search_room') || Request::submitted('search_properties')) { $tmp_search_result = $request->searchRoomsToRequest(Request::get('search_exp_room'), Request::submitted('search_properties')); $search_by_properties = Request::submitted('search_properties'); $search_result = array(); if (count($tmp_search_result)) { $timestamps = $events = array(); foreach ($request->getAffectedDates() as $date) { if (!isset($date->room_assignment)) { $timestamps[] = $date->date; $timestamps[] = $date->end_time; $event = new AssignEvent($date->id, $date->date, $date->end_time, null, null, ''); $events[$event->getId()] = $event; } } $check_result = array(); if (count($events)) { $checker = new CheckMultipleOverlaps(); $checker->setTimeRange(min($timestamps), max($timestamps)); foreach (array_keys($tmp_search_result) as $room) { $checker->addResource($room); } $checker->checkOverlap($events, $check_result, "assign_id"); } foreach ($tmp_search_result as $room_id => $name) { if (isset($check_result[$room_id])) { $details = $check_result[$room_id]; if (count($details) >= round(count($events) * Config::get()->RESOURCES_ALLOW_SINGLE_ASSIGN_PERCENTAGE / 100)) { $overlap_status = 'status-red'; } elseif (count($details)) { $overlap_status = 'status-yellow'; } } else { $overlap_status = 'status-green'; } $search_result[$room_id] = array('name' => $name, 'overlap_status' => $overlap_status); } } } } return compact('search_result', 'search_by_properties', 'request', 'admission_turnout'); }
function checkOverlap($check_locks = TRUE) { global $user; $resObject = ResourceObject::Factory($this->resource_id); //we check overlaps always for a whole day $start = mktime(0, 0, 0, date("n", $this->begin), date("j", $this->begin), date("Y", $this->begin)); if ($this->repeat_end) { $end = mktime(23, 59, 59, date("n", $this->repeat_end), date("j", $this->repeat_end), date("Y", $this->repeat_end)); } else { $end = mktime(23, 59, 59, date("n", $this->end), date("j", $this->end), date("Y", $this->end)); } //load the events of the actual assign... $events = $this->getEvents(); //check, if an assign_lock for one of the events is active (results in an "overlap" so assign cant be saved) if (Config::get()->RESOURCES_ASSIGN_LOCKING_ACTIVE && $resObject->isLockable() && $resObject->isRoom() && getGlobalPerms($user->id) !== 'admin' && $check_locks) { foreach ($events as $obj) { $lock = getLockPeriod('assign', $obj->getBegin(), $obj->getEnd()); if ($lock) { $overlaps[] = array('begin' => $obj->getBegin(), 'end' => $obj->getEnd(), 'lock' => TRUE, 'lock_begin' => $lock[0], 'lock_end' => $lock[1], 'lock_id' => $lock[2]); } } if ($overlaps) { return $overlaps; } } //check for regular overlaps if (!$resObject->getMultipleAssign()) { //when multiple assigns are allowed, we need no check... $multiChecker = new CheckMultipleOverlaps(); $multiChecker->setAutoTimeRange(array($this)); $multiChecker->addResource($this->resource_id); $check_events = array(); foreach ($events as $evtObj) { $check_events[$evtObj->getId()] = $evtObj; } $multiChecker->checkOverlap($check_events, $result); $overlaps = array(); if (is_array($result[$this->resource_id][$this->id])) { foreach ($result[$this->resource_id][$this->id] as $overlapping_event) { $overlaps[$overlapping_event["assign_id"]]["begin"] = $overlapping_event["begin"]; $overlaps[$overlapping_event["assign_id"]]["end"] = $overlapping_event["end"]; } } return $overlaps; } else { return false; } }