diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 9dd6e8d..56fec3e 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -6,6 +6,32 @@ // kein direkter Zugriff defined('_JEXEC') or die('Restricted access'); +function UhrzeitWandlerDE($Zeitstempel) +{ + //Jürgen Meyer 07.03.2025 + + $Temp = explode(' ',$Zeitstempel); + $Datum = $Temp[0]; + $Uhrzeit = $Temp[1]; + if (preg_match("/\d{2}\.\d{2}\.\d{4}/", $Datum)) + { + $Datum = substr($Datum,6,4)."-".substr($Datum,3,2)."-".substr($Datum,0,2); + } + else if (preg_match("/\d{4}\-\d{2}\-\d{2}/", $Datum)) + { + return $Zeitstempel; + } + return $Datum." ".$Uhrzeit; + +} + +function validateDate($date, $format = 'Y-m-d H:i:s') +{ + //Jürgen Meyer 07.03.2025 + $d = DateTime::createFromFormat($format, $date); + return $d && $d->format($format) == $date; +} + function adminUebersicht() { $db = getDatabase(); global $params; @@ -10761,6 +10787,152 @@ function Gruppenspiele($anzahlteams) { return $spiele; } +function GruppenspieleMatrix($anzahlteams) +{ + /* Generiert Gruppenspiele von 4 bis 14 Teams über eine Setzliste + * bei denen jedes Team genau einmal gegen jedes andere Team spielt, + * die Spiele an Anzahl Teams - 1 Spieltagen ausgetragen werden und + * jedes Team an jedem Tag genau ein Spiel austrägt + * Manschaften die am selben Spieltag auf 1,2 oder 3,4 oder 5,6 usw. haben nie gleichzeitig Heimspiel. + * + * Rückgabewert: Dreidimensionales Array mit Spieltag als erstem Index (1, ..., Anzahl Teams - 1), + * Spiel-Nr. als zweitem Index (1, ..., Anzahl Teams / 2) und als drittem Index 0 für das erste + * und 1 für das zweite Team, wobei jeweils die Teamnummer enthalten ist (1, ..., Anzahl Teams) + * + * (C) Jürgen Meyer 09.03.2025 + */ + + switch ($anzahlteams) { + case 4: + $Spalte_Heim = 12; + break; + case 6: + $Spalte_Heim = 10; + break; + case 8: + $Spalte_Heim = 8; + break; + case 10: + $Spalte_Heim = 6; + break; + case 12: + $Spalte_Heim = 4; + break; + case 14: + $Spalte_Heim = 2; + break; + } + + +//Spieltag_Nr;Spiel_Nr;Heim14;Gast14;Heim12;Gast12;Heim10;Gast10;Heim8;Gast8;Heim6;Gast6;Heim4;Gast4 +//Folgende Zeilen dürfen nicht eingrückt werden. +$str_Setzliste_Matrix = +"1;1;1;4;1;4;1;4;1;4;1;4;1;4 +1;2;3;2;3;2;3;2;3;2;3;2;3;2 +1;3;5;14;5;12;5;10;5;8;5;6;; +1;4;7;12;7;10;7;8;7;6;;;; +1;5;9;10;9;8;9;6;;;;;; +1;6;11;8;11;6;;;;;;;; +1;7;13;6;;;;;;;;;; +2;1;3;1;3;1;3;1;8;1;2;5;2;1 +2;2;2;5;2;5;2;5;2;5;3;4;3;4 +2;3;6;4;6;4;6;4;3;7;6;1;; +2;4;8;13;8;11;8;9;6;4;;;; +2;5;10;11;10;9;10;7;;;;;; +2;6;12;9;12;7;;;;;;;; +2;7;14;7;;;;;;;;;; +3;1;1;6;1;6;1;6;1;6;1;2;1;3 +3;2;4;8;4;8;4;8;4;2;4;6;4;2 +3;3;5;3;5;3;5;3;5;3;5;3;; +3;4;7;2;7;2;7;2;7;8;;;; +3;5;9;14;9;12;9;10;;;;;; +3;6;11;12;11;10;;;;;;;; +3;7;13;10;;;;;;;;;; +4;1;5;1;5;1;5;9;5;1;5;1;; +4;2;2;9;2;9;2;4;2;7;2;4;; +4;3;3;7;3;7;3;7;3;4;3;6;; +4;4;8;6;8;6;8;6;8;6;;;; +4;5;10;4;10;4;10;1;;;;;; +4;6;12;13;12;11;;;;;;;; +4;7;14;11;;;;;;;;;; +5;1;1;8;1;8;1;8;1;3;1;3;; +5;2;4;12;4;12;4;10;4;8;4;5;; +5;3;6;10;6;10;6;3;6;2;6;2;; +5;4;7;5;7;5;7;5;7;5;;;; +5;5;9;3;9;3;9;2;;;;;; +5;6;11;2;11;2;;;;;;;; +5;7;13;14;;;;;;;;;; +6;1;7;1;7;1;7;9;7;4;;;; +6;2;2;13;2;4;2;6;2;1;;;; +6;3;3;11;3;11;3;4;3;8;;;; +6;4;5;9;5;9;5;1;5;6;;;; +6;5;10;8;10;8;10;8;;;;;; +6;6;12;6;12;6;;;;;;;; +6;7;14;4;;;;;;;;;; +7;1;1;10;1;10;1;2;1;7;;;; +7;2;4;2;4;3;4;7;4;5;;;; +7;3;6;14;6;2;6;10;6;3;;;; +7;4;8;12;8;12;8;5;8;2;;;; +7;5;9;7;9;7;9;3;;;;;; +7;6;11;5;11;5;;;;;;;; +7;7;13;3;;;;;;;;;; +8;1;9;1;9;1;7;1;;;;;; +8;2;2;6;2;8;2;8;;;;;; +8;3;3;4;3;6;3;10;;;;;; +8;4;5;13;5;4;5;6;;;;;; +8;5;7;11;7;11;9;4;;;;;; +8;6;12;10;12;10;;;;;;;; +8;7;14;8;;;;;;;;;; +9;1;1;12;1;12;4;5;;;;;; +9;2;4;5;4;7;1;9;;;;;; +9;3;6;3;6;5;6;7;;;;;; +9;4;8;2;8;3;8;3;;;;;; +9;5;10;14;10;2;10;2;;;;;; +9;6;11;9;11;9;;;;;;;; +9;7;13;7;;;;;;;;;; +10;1;11;1;11;1;;;;;;;; +10;2;2;10;2;12;;;;;;;; +10;3;3;8;3;10;;;;;;;; +10;4;5;6;5;8;;;;;;;; +10;5;7;4;7;6;;;;;;;; +10;6;9;13;9;4;;;;;;;; +10;7;14;12;;;;;;;;;; +11;1;1;14;1;2;;;;;;;; +11;2;4;9;4;11;;;;;;;; +11;3;6;7;6;9;;;;;;;; +11;4;8;5;8;7;;;;;;;; +11;5;10;3;10;5;;;;;;;; +11;6;12;2;12;3;;;;;;;; +11;7;13;11;;;;;;;;;; +12;1;13;1;;;;;;;;;; +12;2;2;14;;;;;;;;;; +12;3;3;12;;;;;;;;;; +12;4;5;10;;;;;;;;;; +12;5;7;8;;;;;;;;;; +12;6;9;6;;;;;;;;;; +12;7;11;4;;;;;;;;;; +13;1;1;2;;;;;;;;;; +13;2;4;13;;;;;;;;;; +13;3;6;11;;;;;;;;;; +13;4;8;9;;;;;;;;;; +13;5;10;7;;;;;;;;;; +13;6;12;5;;;;;;;;;; +13;7;14;3;;;;;;;;;;"; + + $Spieltage = explode("\n",$str_Setzliste_Matrix); + $Zeile = 0; + foreach($Spieltage as $value) + { + $Spiel = explode(";",$value); + if($Spiel[$Spalte_Heim] == "") continue; + $Zeile++; + $Matrix[$Spiel[0]][$Spiel[1]][0] = $Spiel[$Spalte_Heim]; + $Matrix[$Spiel[0]][$Spiel[1]][1] = $Spiel[$Spalte_Heim+1]; + } + + return $Matrix; +} + function adminBegegnungenGenerierenForm() { $db = getDatabase(); $jinput = JFactory::getApplication()->input; @@ -10794,6 +10966,8 @@ function adminBegegnungenGenerierenForm() { } function adminBegegnungenGenerieren() { + //geändert am 07.03.2025 von Jürgen Meyer + $db = getDatabase(); $jinput = JFactory::getApplication()->input; @@ -10822,24 +10996,99 @@ function adminBegegnungenGenerieren() { } $teams = $db->loadObjectList(); + //Erstellen des Array Teams mit Überprüfung der Mannschaften + $teams_ok = true; for ($i = 1; $i <= $anzahlteams; $i++) { - $teamids[$i] = $jinput->get('team_id_' . $i, 0, 'INT'); - if ($teamids[$i] == 0) die("Wrong id!"); + $team_id_form = $jinput->get('team_id_' . $i, 0, 'INT'); + if ($team_id_form == "") + { + $teams_ok = false; + } + else + { + if (!isset($teamids)) + { + $teamids[$i] = $team_id_form; + } + else + { + if (!in_array($team_id_form,$teamids)) + { + $teamids[$i] = $team_id_form; + } + else + { + $teams_ok = false; + } + } + } } - - $spieltage = $anzahlteams % 2 != 0 ? $anzahlteams : $anzahlteams - 1; + + //Bei 1 wird nur Hinrunde gespielt, bei 2 wird Rückrunde gespielt + $runden = $jinput->get('runden', 0, 'INT'); + $generierung = $jinput->get('generierung', 0, 'var'); + //Bei 1 wird Datum überprüft, bei 0 nicht. + $datumscheck = $jinput->get('datumscheck', 0, 'INT'); + + $spieltage = $anzahlteams % 2 != 0 ? $anzahlteams : $anzahlteams - 1; $spieltag_basis = array(); - for ($i = 1; $i <= ($spieltage * 2); $i++) { + for ($i = 1; $i <= ($spieltage * $runden); $i++) { $jahr = $jinput->get('datum_jahr_' . $i, 0, 'INT'); $kw = $jinput->get('datum_kw_' . $i, 0, 'INT'); - if ($jahr == 0 || $kw == 0) die("Wrong date!"); + $spieltag_nr = $jinput->get('spieltag_nr_' . $i, 0, 'INT'); + $startzeit = $jinput->get('startzeit_' . $i, 0, 'var'); + $startzeit = UhrzeitWandlerDE($startzeit); + if (!validateDate($startzeit)){$startzeit = "";} + if ($jahr == 0 && $kw == 0) die("Wrong date!"); $spieltag_basis[$i] = array(); $spieltag_basis[$i]["jahr"] = $jahr; $spieltag_basis[$i]["kw"] = $kw; + $spieltag_basis[$i]["startzeit"] = $startzeit; + $spieltag_basis[$i]["spieltag_nr"] = $spieltag_nr; + } - - $spiele = Gruppenspiele($anzahlteams % 2 != 0 ? $anzahlteams + 1 : $anzahlteams); - + + //Überprüfung der Spieltag Nummer + $spieltage_ok = true; + foreach ($spieltag_basis as $value) + { + $spieltag_nr_form = $value["spieltag_nr"]; + if ($spieltag_nr_form == "") + { + $spieltage_ok = false; + } + else + { + if (!isset($spieltage_check)) + { + $spieltage_check[] = $spieltag_nr_form; + } + else + { + if (!in_array($spieltag_nr_form,$spieltage_check)) + { + $spieltage_check[] = $spieltag_nr_form; + } + else + { + $spieltage_ok = false; + } + } + } + } + + if ($generierung == "Setzliste") + { + //Generieren des Spielplans über Setzliste + $spiele = GruppenspieleMatrix($anzahlteams % 2 != 0 ? $anzahlteams + 1 : $anzahlteams); + } + if ($generierung == "Automatisch") + { + //Automatisches generieren des Spielplans + $spiele = Gruppenspiele($anzahlteams % 2 != 0 ? $anzahlteams + 1 : $anzahlteams); + } + $Zeile = 0; + $datumsangaben = true; for ($spieltag = 1; $spieltag <= $spieltage; $spieltag++) { for ($spielnr = 1; $spielnr <= ($anzahlteams % 2 != 0 ? $anzahlteams + 1 : $anzahlteams) / 2; $spielnr++) { if ($spiele[$spieltag][$spielnr][0] > $anzahlteams || $spiele[$spieltag][$spielnr][1] > $anzahlteams) @@ -10855,7 +11104,7 @@ function adminBegegnungenGenerieren() { break; } } - if ($heim_team == null) die("Team id not found!"); + if ($heim_team == null) continue; $gast_team = null; foreach ($teams as $t) { @@ -10864,46 +11113,333 @@ function adminBegegnungenGenerieren() { break; } } - if ($gast_team == null) die("Team id not found!"); + if ($gast_team == null) continue; - if ($heim_team->heimspiel_wochentag == 0) - $zeitpunkt = null; - else { - $ts = getdate(mondaykw($spieltag_basis[$spieltag]["kw"], $spieltag_basis[$spieltag]["jahr"], $heim_team->heimspiel_wochentag - 1)); - $zeitpunkt = sprintf("%04d-%02d-%02d %02d:%02d", $ts["year"], $ts["mon"], $ts["mday"], floor($heim_team->heimspiel_uhrzeit / 100), $heim_team->heimspiel_uhrzeit % 100); + if ($spieltag_basis[$spieltag]["startzeit"] != "") + { + $zeitpunkt = $spieltag_basis[$spieltag]["startzeit"]; } - - $query = "INSERT INTO #__sportsmanager_begegnung (zeitpunkt, spieltag, heim_team_id, gast_team_id)" - . "\n VALUES (" . ($zeitpunkt != null ? "'$zeitpunkt'" : "NULL") . ", '$spieltag', '$heim_team_id', '$gast_team_id');"; - $db->setQuery($query); - if (!$result = $db->execute()) { - die($db->stderr(true)); + else + { + if ($heim_team->heimspiel_wochentag == 0 OR $spieltag_basis[$spieltag]["kw"] == 0) + $zeitpunkt = NULL; + else { + $ts = getdate(mondaykw($spieltag_basis[$spieltag]["kw"], $spieltag_basis[$spieltag]["jahr"], $heim_team->heimspiel_wochentag - 1)); + $zeitpunkt = sprintf("%04d-%02d-%02d %02d:%02d:00", $ts["year"], $ts["mon"], $ts["mday"], floor($heim_team->heimspiel_uhrzeit / 100), $heim_team->heimspiel_uhrzeit % 100); + } } - - $weiterer_spieltag = $spieltag + $spieltage; - if ($gast_team->heimspiel_wochentag == 0) - $zeitpunkt = null; - else { - $ts = getdate(mondaykw($spieltag_basis[$weiterer_spieltag]["kw"], $spieltag_basis[$weiterer_spieltag]["jahr"], $gast_team->heimspiel_wochentag - 1)); - $zeitpunkt = sprintf("%04d-%02d-%02d %02d:%02d", $ts["year"], $ts["mon"], $ts["mday"], floor($gast_team->heimspiel_uhrzeit / 100), $gast_team->heimspiel_uhrzeit % 100); + + $spieltag_nr = $spieltag_basis[$spieltag]["spieltag_nr"]; + if (!validateDate($zeitpunkt)) + { + $zeitpunkt = NULL; + if ($datumscheck) $datumsangaben = false; } + + $Begegnung[$Zeile]['spieltag'] = $spieltag_nr; + $Begegnung[$Zeile]['zeitpunkt'] = $zeitpunkt; + $Begegnung[$Zeile]['heim_team_id'] = $heim_team_id; + $Begegnung[$Zeile]['gast_team_id'] = $gast_team_id; + $Zeile++; - $query = "INSERT INTO #__sportsmanager_begegnung (zeitpunkt, spieltag, heim_team_id, gast_team_id)" - . "\n VALUES (" . ($zeitpunkt != null ? "'$zeitpunkt'" : "NULL") . ", '$weiterer_spieltag', '$gast_team_id', '$heim_team_id');"; - $db->setQuery($query); - if (!$result = $db->execute()) { - die($db->stderr(true)); + + if ($runden == 2) + { + $weiterer_spieltag = $spieltag + $spieltage; + + if ($spieltag_basis[$weiterer_spieltag]["startzeit"] != "") + { + $zeitpunkt = $spieltag_basis[$weiterer_spieltag]["startzeit"]; + } + else + { + if ($gast_team->heimspiel_wochentag == 0 OR $spieltag_basis[$weiterer_spieltag]["kw"] == 0) + $zeitpunkt = NULL; + else { + $ts = getdate(mondaykw($spieltag_basis[$weiterer_spieltag]["kw"], $spieltag_basis[$weiterer_spieltag]["jahr"], $gast_team->heimspiel_wochentag - 1)); + $zeitpunkt = sprintf("%04d-%02d-%02d %02d:%02d:00", $ts["year"], $ts["mon"], $ts["mday"], floor($gast_team->heimspiel_uhrzeit / 100), $gast_team->heimspiel_uhrzeit % 100); + } + } + + $spieltag_nr = $spieltag_basis[$weiterer_spieltag]["spieltag_nr"]; + if (!validateDate($zeitpunkt)) + { + $zeitpunkt = NULL; + if ($datumscheck) $datumsangaben = false; + } + + $Begegnung[$Zeile]['spieltag'] = $spieltag_nr; + $Begegnung[$Zeile]['zeitpunkt'] = $zeitpunkt; + $Begegnung[$Zeile]['heim_team_id'] = $heim_team_id; + $Begegnung[$Zeile]['gast_team_id'] = $gast_team_id; + $Zeile++; + } } } + + if ($datumsangaben and $teams_ok and $spieltage_ok) + { + $Zeile = 1; + $query = "INSERT INTO #__sportsmanager_begegnung (spieltag, zeitpunkt, heim_team_id, gast_team_id) VALUES "; + foreach($Begegnung as $value) + { + if ($Zeile > 1){$query .= ", ";} + $query .= "(".$value['spieltag'].",".($value['zeitpunkt'] != NULL ? "'".$value['zeitpunkt']."'" : "NULL").",".$value['heim_team_id'].",".$value['gast_team_id'].") "; + $Zeile++; + } + $query .= ";"; + echo $query; + $db->setQuery($query); + + if (!$result = $db->execute()) { + die($db->stderr(true)); + } + else + { + redirectSportsManagerURL('&task=admin_begegnungen&veranstaltungid=' . $veranstaltungid, count($Begegnung)." ".JText::_('COM_SPORTSMANAGER_IMPORT_GROUP_GAME_CREATED')); + } + } + else + { + if (!$datumsangaben) + { + echo "
| Spieltag | "; + echo "Spielstart | "; + echo "Heim | "; + echo "Gast | "; + echo "
|---|---|---|---|
| ".$data[$Titelzeile['Spieltag_Nr']]." | "; + if (!validateDate($Begegnung[$Zeile]['zeitpunkt'])) + { + $bgcolor ="red"; + $import = false; + } + else + { + $bgcolor ="green"; + } + echo "".$data[$Titelzeile['Spielstart']]." | "; + if ($Begegnung[$Zeile]['heim_team_id'] == "") + { + if ($data[$Titelzeile['Heim']] == "spielfrei") + { + $bgcolor ="orange"; + $import_zeile = false; + } + else + { + $bgcolor ="red"; + $import = false; + } + } + else + { + $bgcolor ="green"; + } + echo "".utf8_encode($data[$Titelzeile['Heim']])." | "; + if ($Begegnung[$Zeile]['gast_team_id'] == "") + { + if ($data[$Titelzeile['Gast']] == "spielfrei") + { + $bgcolor ="orange"; + $import_zeile = false; + } + else + { + $bgcolor ="red"; + $import = false; + } + } + else + { + $bgcolor ="green"; + } + echo "".utf8_encode($data[$Titelzeile['Gast']])." | "; + echo "