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; }
} } if (is_array($assignObjects) && sizeof($assignObjects) > 0) { //add already assigned resource_ids to the check-set and remember those assigns foreach($assignObjects as $assObj){ if ($assObj->getResourceId()){ if(!$_SESSION['resources_data']["requests_working_on"][$_SESSION['resources_data']["requests_working_pos"]]["considered_resources"][$assObj->getResourceId()]) $_SESSION['resources_data']["requests_working_on"][$_SESSION['resources_data']["requests_working_pos"]]["considered_resources"][$assObj->getResourceId()] = array("type"=>"matching"); } $_SESSION['resources_data']["requests_working_on"][$_SESSION['resources_data']["requests_working_pos"]]["assign_objects"][$assObj->getId()] = array("resource_id" => $assObj->getResourceId()); } //set the time range to check; $multiOverlaps->setAutoTimeRange($assignObjects); //add the considered resources to the check-set if (is_array($_SESSION['resources_data']["requests_working_on"][$_SESSION['resources_data']["requests_working_pos"]]["considered_resources"])) { foreach ($_SESSION['resources_data']["requests_working_on"][$_SESSION['resources_data']["requests_working_pos"]]["considered_resources"] as $key => $val) { $multiOverlaps->addResource($key); } } //do checks $result = array(); $first_event = FALSE; /* * * * * * * * * * * * * * * * * Group the dates * * *
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; } }