aboutsummaryrefslogtreecommitdiff
path: root/lib/models/MvvOverlappingSelection.php
diff options
context:
space:
mode:
authorPeter Thienel <thienel@data-quest.de>2024-12-18 11:13:59 +0000
committerPeter Thienel <thienel@data-quest.de>2024-12-18 11:13:59 +0000
commit061f8168db6de9c1dded98c176d756cbbf24cb57 (patch)
tree1f65dad592a6d0720f21f9d5676c5d6be26b9e5a /lib/models/MvvOverlappingSelection.php
parent6c14b24a0ff71f26bea19c827860220371e5eccf (diff)
Resolve "Stundenplanansicht für Überschneidungsfreiheitschecks"
Closes #3323 Merge request studip/studip!2337
Diffstat (limited to 'lib/models/MvvOverlappingSelection.php')
-rw-r--r--lib/models/MvvOverlappingSelection.php141
1 files changed, 69 insertions, 72 deletions
diff --git a/lib/models/MvvOverlappingSelection.php b/lib/models/MvvOverlappingSelection.php
index 525076c..89a765c 100644
--- a/lib/models/MvvOverlappingSelection.php
+++ b/lib/models/MvvOverlappingSelection.php
@@ -33,12 +33,7 @@
class MvvOverlappingSelection extends SimpleORMap
{
- /**
- * Configures the model.
- *
- * @param array $config Configuration
- */
- protected static function configure($config = array())
+ protected static function configure($config = array()): void
{
$config['db_table'] = 'mvv_ovl_selections';
$config['belongs_to']['semester'] = [
@@ -78,16 +73,17 @@ class MvvOverlappingSelection extends SimpleORMap
* Creates a selection id and stores the selection.
*
* @throws UnexpectedValueException if there are forbidden NULL values
- * @return number|boolean
+ * @return int|boolean
*/
- public function store()
+ public function store(): int|bool
{
if ($this->isNew() && $this->selection_id == '') {
$this->selection_id = self::createSelectionId(
$this->base_version,
- $this->comp_version,
- $this->fachsems,
- $this->semtypes
+ [$this->comp_version],
+ [$this->fachsems],
+ [$this->semtypes],
+ $this->semester_id
);
}
return parent::store();
@@ -97,14 +93,12 @@ class MvvOverlappingSelection extends SimpleORMap
* Sets the given Fachsemester. Expects an array or a comma
* separated list of Fachsemester.
*
- * @param array|string $semtypes
+ * @param string[] $fachsems
*/
- public function setFachsemester($fachsems)
+ public function setFachsemester(array $fachsems): void
{
- if (is_array($fachsems)) {
- sort($fachsems, SORT_NUMERIC);
- $fachsems = implode(',', $fachsems);
- }
+ sort($fachsems, SORT_NUMERIC);
+ $fachsems = implode(',', $fachsems);
$this->fachsems = $fachsems;
}
@@ -112,14 +106,13 @@ class MvvOverlappingSelection extends SimpleORMap
* Sets the given course types (semtypes). Expects an array or a comma
* separated list of course types.
*
- * @param array|string $semtypes
+ * @param string[] $semtypes
+ * @return void
*/
- public function setCoursetypes($semtypes)
+ public function setCourseTypes(array $semtypes): void
{
- if (is_array($semtypes)) {
- sort($semtypes, SORT_NUMERIC);
- $semtypes = implode(',', $semtypes);
- }
+ sort($semtypes, SORT_NUMERIC);
+ $semtypes = implode(',', $semtypes);
$this->semtypes = $semtypes;
}
@@ -131,7 +124,6 @@ class MvvOverlappingSelection extends SimpleORMap
*/
public function storeConflicts()
{
-
$query = "
SELECT DISTINCT `cbase`.`metadate_id` AS `cbase_metadate_id`,
`cbase`.`seminar_id` AS `cbase_seminar_id`,
@@ -145,14 +137,16 @@ class MvvOverlappingSelection extends SimpleORMap
INNER JOIN (
SELECT `mvv_lvgruppe_seminar`.`seminar_id`,
`mvv_stgteilabschnitt_modul`.`abschnitt_id`,
- `mvv_modulteil`.`modulteil_id`
+ `mvv_modulteil`.`modulteil_id`,
+ `semester_courses`.`semester_id`
FROM `mvv_stgteilabschnitt`
INNER JOIN `mvv_stgteilabschnitt_modul` USING (`abschnitt_id`)
INNER JOIN `mvv_modul` USING (`modul_id`)
INNER JOIN `mvv_modulteil` USING (`modul_id`)
INNER JOIN `mvv_lvgruppe_modulteil` USING (`modulteil_id`)
INNER JOIN `mvv_lvgruppe_seminar` USING (`lvgruppe_id`)
- INNER JOIN `seminare` USING (`seminar_id`)
+ INNER JOIN `seminare` ON `mvv_lvgruppe_seminar`.`seminar_id` = `seminare`.`Seminar_id`
+ INNER JOIN `semester_courses` ON `seminare`.`Seminar_id` = `semester_courses`.`course_id`
INNER JOIN `mvv_modulteil_stgteilabschnitt`
ON (`mvv_stgteilabschnitt_modul`.`abschnitt_id` =
`mvv_modulteil_stgteilabschnitt`.`abschnitt_id`
@@ -162,7 +156,6 @@ class MvvOverlappingSelection extends SimpleORMap
ON (`mvv_modul`.`start` = `start_sem`.`semester_id`)
LEFT JOIN `semester_data` AS `end_sem`
ON (`mvv_modul`.`end` = `end_sem`.`semester_id`)
- LEFT JOIN `semester_courses` ON (`seminare`.`Seminar_id` = `semester_courses`.`course_id`)
WHERE `mvv_stgteilabschnitt`.`version_id` = :base_version
AND `mvv_modulteil_stgteilabschnitt`.`fachsemester` IN (:fachsem)
AND ((`start_sem`.`beginn` < :sem_end OR ISNULL(`start_sem`.`beginn`))
@@ -189,15 +182,16 @@ class MvvOverlappingSelection extends SimpleORMap
INNER JOIN (
SELECT `mvv_lvgruppe_seminar`.`seminar_id`,
`mvv_stgteilabschnitt_modul`.`abschnitt_id`,
- `mvv_modulteil`.`modulteil_id`
+ `mvv_modulteil`.`modulteil_id`,
+ `semester_courses`.`semester_id`
FROM `mvv_stgteilabschnitt`
INNER JOIN `mvv_stgteilabschnitt_modul` USING (`abschnitt_id`)
INNER JOIN `mvv_modul` USING (`modul_id`)
- INNER JOIN `mv" .
- "v_modulteil` USING (`modul_id`)
+ INNER JOIN `mvv_modulteil` USING (`modul_id`)
INNER JOIN `mvv_lvgruppe_modulteil` USING (`modulteil_id`)
INNER JOIN `mvv_lvgruppe_seminar` USING (`lvgruppe_id`)
- INNER JOIN `seminare` USING (`seminar_id`)
+ INNER JOIN `seminare` ON `mvv_lvgruppe_seminar`.`seminar_id` = `seminare`.`Seminar_id`
+ INNER JOIN `semester_courses` ON (`seminare`.`Seminar_id` = `semester_courses`.`course_id`)
INNER JOIN `mvv_modulteil_stgteilabschnitt`
ON (`mvv_stgteilabschnitt_modul`.`abschnitt_id` =
`mvv_modulteil_stgteilabschnitt`.`abschnitt_id`
@@ -207,7 +201,6 @@ class MvvOverlappingSelection extends SimpleORMap
ON (`mvv_modul`.`start` = `start_sem`.`semester_id`)
LEFT JOIN `semester_data` AS `end_sem`
ON (`mvv_modul`.`end` = `end_sem`.`semester_id`)
- LEFT JOIN `semester_courses` ON (`seminare`.`Seminar_id` = `semester_courses`.`course_id`)
WHERE `mvv_stgteilabschnitt`.`version_id` = :comp_version
AND `mvv_modulteil_stgteilabschnitt`.`fachsemester` IN (:fachsem)
AND ((`start_sem`.`beginn` < :sem_end OR ISNULL(`start_sem`.`beginn`))
@@ -217,16 +210,16 @@ class MvvOverlappingSelection extends SimpleORMap
) AS `semcomp` ON (`semcomp`.`seminar_id` = `ccomp`.`seminar_id`)
INNER JOIN `mvv_modulteil_stgteilabschnitt` AS `mms1`
ON (`mms1`.`abschnitt_id` = `semcomp`.`abschnitt_id` AND `mms1`.`modulteil_id` = `semcomp`.`modulteil_id`)
- WHERE `mms1`.`fachsemester` IN (
- SELECT `fachsemester`
- FROM `mvv_modulteil_stgteilabschnitt` AS `mms2`
- WHERE `mms2`.`abschnitt_id` = `sembase`.`abschnitt_id`
- AND `mms2`.`modulteil_id` = `sembase`.`modulteil_id`)
+ WHERE `mms1`.`fachsemester` IN (
+ SELECT `fachsemester`
+ FROM `mvv_modulteil_stgteilabschnitt` AS `mms2`
+ WHERE `mms2`.`abschnitt_id` = `sembase`.`abschnitt_id`
+ AND `mms2`.`modulteil_id` = `sembase`.`modulteil_id`)
ORDER BY `cbase_seminar_id`";
// if no filter is set use all types and fachsems
- $fachsems = $this->fachsems ? $this->fachsems : implode(',', range(1, 6));
- $semtypes = $this->semtypes ? $this->semtypes : implode(',', array_keys(SemType::getTypes()));
+ $fachsems = $this->fachsems ?: implode(',', range(1, 6));
+ $semtypes = $this->semtypes ?: implode(',', array_keys(SemType::getTypes()));
$db = DBManager::get();
$conflicts = $db->fetchAll($query, [
@@ -239,7 +232,6 @@ class MvvOverlappingSelection extends SimpleORMap
':semester_id' => $this->semester->id
]);
- $conlicts = [];
foreach ($conflicts as $conflict) {
$ovl_conflict = new MvvOverlappingConflict();
$ovl_conflict->selection_id = $this->id;
@@ -260,10 +252,13 @@ class MvvOverlappingSelection extends SimpleORMap
* Returns all conflicts of all selections with the given selection id.
*
* @param string $selection_id The selection id.
- * @param boolean $only_visible Returns only visible conflicts.
+ * @param bool $only_visible Returns only visible conflicts.
* @return SimpleORMapCollection All conflicts of appropriate selections.
*/
- public static function getConflictsBySelection($selection_id, $only_visible = false)
+ public static function getConflictsBySelection(
+ string $selection_id,
+ bool $only_visible = false
+ ) : SimpleORMapCollection
{
$excluded_courses = [];
$visible_sql = '';
@@ -287,40 +282,42 @@ class MvvOverlappingSelection extends SimpleORMap
/**
* Returns a md5 hash over all given parameters.
*
- * @param string $base_version The id of the base version.
- * @param string $comp_versions The id of the compared version.
- * @param array|string $fachsems An array or a string with comma separated fachsem numbers.
- * @param array|string $semtypes An array or a string with comma separated course types.
+ * @param StgteilVersion $base_version The id of the base version.
+ * @param StgteilVersion[] $comp_versions The id of the compared version.
+ * @param string[] $fachsems An array or a string with comma separated fachsem numbers.
+ * @param string[] $semtypes An array or a string with comma separated course types.
* @param string|null $user_id User id that created the selection (defaults to current user)
* @return string The md5 id.
*/
- public static function createSelectionId($base_version, $comp_versions, $fachsems, $semtypes, string $user_id = null)
+ public static function createSelectionId(
+ StgteilVersion $base_version,
+ array $comp_versions,
+ array $fachsems,
+ array $semtypes,
+ string $semester_id,
+ string|null $user_id = null) : string
{
- if (is_array($fachsems)) {
- sort($fachsems, SORT_NUMERIC);
- $fachsems = implode(',', $fachsems);
- }
- if (is_array($semtypes)) {
- sort($semtypes, SORT_NUMERIC);
- $semtypes = implode(',', $semtypes);
+ sort($fachsems, SORT_NUMERIC);
+ $fachsems = implode(',', $fachsems);
+ sort($semtypes, SORT_NUMERIC);
+ $semtypes = implode(',', $semtypes);
+ $comp_version_ids = [];
+ foreach ($comp_versions as $comp_version) {
+ $comp_version_ids[] = $comp_version->id;
}
- if (is_array($comp_versions)) {
- $comp_version_ids = [];
- foreach ($comp_versions as $comp_version) {
- $comp_version_ids[] = $comp_version->id;
- }
- sort($comp_version_ids);
- $comp_versions = implode(',', $comp_version_ids);
- } else {
- $comp_versions = $comp_versions->id;
- }
- return md5(implode('_', [
- $base_version->id,
- $comp_versions,
- trim($fachsems) ? $fachsems : 'x',
- trim($semtypes) ? $semtypes : 'x',
- $user_id ?? $GLOBALS['user']->id,
- ]));
+ sort($comp_version_ids);
+ $comp_versions = implode(',', $comp_version_ids);
+
+ return md5(implode('_',
+ [
+ $base_version->id,
+ $comp_versions,
+ trim($fachsems) ? $fachsems : 'x',
+ trim($semtypes) ? $semtypes : 'x',
+ $semester_id,
+ $user_id ?? $GLOBALS['user']->id,
+ ]
+ ));
}
/**
@@ -328,7 +325,7 @@ class MvvOverlappingSelection extends SimpleORMap
*
* @return SimpleORMapCollection The excluded (hidden) conflicts.
*/
- public function getExcludedConflicts()
+ public function getExcludedConflicts(): SimpleORMapCollection
{
return $this->conflicts->findBy(
'comp_course_id',