Files
WKVS/www/intern/scripts/riegeneinteilung/ajax_auto_riegeneinteilung.php

234 lines
7.6 KiB
PHP

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
// Show all errors except deprecation notices (these come from vendor libraries
// that aren't yet typed for newer PHP versions). Long-term fix: update
// dependencies to versions compatible with your PHP runtime.
error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED);
if (!isset($baseDir)) {
$baseDir = $_SERVER['DOCUMENT_ROOT'];
}
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('wk_leitung');
verify_csrf();
$type = 'wkl';
$dbconnection = require $baseDir . '/../scripts/db/db-verbindung-script.php';
if ($dbconnection['success'] !== true){
echo 'Critical DB Error.';
exit;
}
require $baseDir . '/../scripts/db/db-functions.php';
require $baseDir . '/../scripts/db/db-tables.php';
$allGeraete = db_select($mysqli, $tableGeraete, "id, name, start_index", "", [], "start_index ASC");
$allAbt = db_select($mysqli, $tableAbt, "name, id", "", [], "name ASC");
$maxTurnerinnenGruppe = 8;
// $allGeraete[] = ['name' => 'null', 'id' => 'null'];
// $allAbt[] = ['name' => 'null', 'id' => 'null'];
/*$stmt = $mysqli->prepare("
SELECT
t.id,
t.programm,
t.verein,
GROUP_CONCAT(ta.id SEPARATOR ', ') AS abt_table_id
FROM $tableTurnerinnen t
LEFT JOIN $tableTurnerinnenAbt ta ON ta.turnerin_id = t.id
GROUP BY t.id, t.programm, t.verein
ORDER BY t.id DESC
");
$stmt->execute();
$result = $stmt->get_result();
$allTurnerinnen = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
print_r($allTurnerinnen);*/
$allTurnerinnen = db_select($mysqli, $tableTurnerinnen, "id, programm, verein, name" , "", [], "programm ASC");
$grouped = [];
foreach ($allTurnerinnen as $t) {
$sanitasedprogramm = str_replace(['-kader'], '', strtolower($t['programm']));
$grouped[$sanitasedprogramm][$t['verein']][] = $t;
}
function getMinKey(array $array): string|int {
return array_search(min($array), $array, true);
}
function arrayRiegeneiteilung($allturnerinnen, $maxTurnerinnenGruppe, $allGeraete) {
$indabt = 1;
$arrayAutoRiegeneinteilung = [];
foreach ($allturnerinnen as $prog => $vereine) {
// ABTEILUNG BERECHNEN
$countturterinnenprog = 0;
foreach ($vereine as $verein => $turnerinnen) {
foreach ($turnerinnen as $ind => $turnerin) {
$countturterinnenprog++;
$abt = intdiv($countturterinnenprog, $maxTurnerinnenGruppe * count($allGeraete)) + $indabt;
$allturnerinnen[$prog][$verein][$ind]['abt'] = $abt;
$arrayAbt[$abt][$verein][] = $turnerin;
}
}
$indabt += intdiv($countturterinnenprog - 1, $maxTurnerinnenGruppe * count($allGeraete)) + 1;
}
foreach ($arrayAbt as $abt => $vereine) {
// AUSGLEICHEN DER GRUPPEN
$arrayAbt = [];
$arrayGruppen = [];
foreach ($allGeraete as $geraet) {
$arrayGruppen[$geraet['id']] = 0;
}
$turnerinnenCount = 0;
foreach ($vereine as $verein => $turnerinnen) {
$turnerinnenCount += count($turnerinnen);
}
foreach ($vereine as $verein => $turnerinnen) {
if (count($turnerinnen) > $maxTurnerinnenGruppe || count($turnerinnen) > $turnerinnenCount / count($allGeraete)) {
if (count($turnerinnen) > $turnerinnenCount / count($allGeraete)) {
$maxTurnerinnenGruppeTemp = ceil($turnerinnenCount / count($allGeraete));
} else {
$maxTurnerinnenGruppeTemp = $maxTurnerinnenGruppe;
}
// AUFTEILEN IN MEHRERE GRUPPEN
$chunks = array_chunk($turnerinnen, $maxTurnerinnenGruppeTemp);
foreach ($chunks as $chunk) {
$minKey = getMinKey($arrayGruppen);
$arrayGruppen[$minKey] += count($chunk);
foreach ($chunk as $ind =>$turnerin) {
$arrayAutoRiegeneinteilung[$abt][$minKey][] = $turnerin;
}
}
continue;
}
$minKey = getMinKey($arrayGruppen);
$arrayGruppen[$minKey] += count($turnerinnen);
foreach ($turnerinnen as $ind =>$turnerin) {
$arrayAutoRiegeneinteilung[$abt][$minKey][] = $turnerin;
}
}
}
foreach ($arrayAutoRiegeneinteilung as $indAbt => $abt) {
foreach ($abt as $indGeraet => $geraet) {
foreach ($geraet as $indTurnerin => $turnerin) {
$arrayAutoRiegeneinteilung[$indAbt][$indGeraet][$indTurnerin]['turnerin_index'] = $indTurnerin + 1;
}
}
}
return $arrayAutoRiegeneinteilung;
}
$arrayAutoRiegeneinteilung = arrayRiegeneiteilung($grouped, $maxTurnerinnenGruppe, $allGeraete);
$stmt = $mysqli->prepare("DELETE FROM $tableTurnerinnenAbt");
$stmt->execute();
$stmt->close();
$stmt = $mysqli->prepare("DELETE FROM $tableAbt");
$stmt->execute();
$stmt->close();
foreach ($arrayAutoRiegeneinteilung as $indAbt => $abt) {
$stmt = $mysqli->prepare("INSERT INTO $tableAbt (name) VALUES (?)");
$stmt->bind_param("s", $indAbt);
$stmt->execute();
$idAbt = $stmt->insert_id;
$stmt->close();
foreach ($abt as $indGeraet => $geraet) {
foreach ($geraet as $indTurnerin => $turnerin) {
$stmt = $mysqli->prepare("INSERT INTO $tableTurnerinnenAbt (turnerin_id, abteilung_id, geraet_id, turnerin_index) VALUES (?, ?, ?, ?)");
$stmt->bind_param("ssss", $turnerin['id'], $idAbt, $indGeraet, $turnerin['turnerin_index']);
$stmt->execute();
$stmt->close();
}
}
}
return http_response_code(201);
/*foreach ($grouped as $ind => $g) {
echo $ind;
foreach ($g as $verein) {
foreach ($verein as $turnerin) {
echo '<div class="riegeneinteilung_turnerin_row" data-turnerin_id="' . $turnerin['id'] . '">';
echo '<div class="riegeneinteilung_turnerin_info">';
echo '<span class="riegeneinteilung_turnerin_name">' . htmlspecialchars($turnerin['name']) . '</span>';
echo '<span class="riegeneinteilung_turnerin_verein">(' . htmlspecialchars($turnerin['verein']) . ')</span>';
echo '<span class="riegeneinteilung_turnerin_verein">(' . htmlspecialchars($turnerin['abt']) . ')</span>';
echo '<span class="riegeneinteilung_turnerin_verein">(' . htmlspecialchars($turnerin['geraet_id']) . ')</span>';
echo '</div>';
echo '</div></div>';
}
}
echo '<br><br>';
}
foreach ($arrayAutoRiegeneinteilung as $ind => $abt) {
echo '<br>ABT:' . $ind;
foreach ($abt as $g) {
echo '<br>GERÄT';
foreach ($g as $turnerin) {
echo '<div class="riegeneinteilung_turnerin_row" data-turnerin_id="' . $turnerin['id'] . '">';
echo '<div class="riegeneinteilung_turnerin_info">';
echo '<span class="riegeneinteilung_turnerin_name">' . htmlspecialchars($turnerin['name']) . '</span>';
echo '<span class="riegeneinteilung_turnerin_verein">(' . htmlspecialchars($turnerin['verein']) . ')</span>';
echo '<span class="riegeneinteilung_turnerin_verein">(' . htmlspecialchars($turnerin['turnerin_index']) . ')</span>';
echo '<span class="riegeneinteilung_turnerin_verein">(' . htmlspecialchars($turnerin['programm']) . ')</span>';
echo '</div>';
echo '</div></div>';
}
}
echo '<br><br>';
}
print_r($arrayAutoRiegeneinteilung);*/