コード例 #1
0
ファイル: ShowList.class.php プロジェクト: ratbird/hope
    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;
    }
コード例 #2
0
ファイル: evaluate_values.php プロジェクト: ratbird/hope
            }
        }

        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 * * *
コード例 #3
0
ファイル: AssignObject.class.php プロジェクト: ratbird/hope
 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;
     }
 }