Working on Case2: New League Creation after Qualification

This commit is contained in:
Torsten 2017-11-02 16:41:07 +01:00
parent d8a7f78cbd
commit 66671b1e81
11 changed files with 12726 additions and 40 deletions

View file

@ -8,6 +8,8 @@ use App\Season;
use App\Round;
use App\User;
use App\Leagues\LeagueMember;
use DB;
use Log;
@ -64,17 +66,26 @@ class League extends Model
public static function cmpScore($score1, $score2) {
// [0] = user-id
$_score1 = $score1[1];
// [4] = rank
$_score1 = $score1[1];
$goals1 = $score1[2];
$cGoals1 = $score1[3];
$rank1 = -1;
if (array_key_exists(4, $score1 )) { $rank1 = $score1[4]; }
$_score2 = $score2[1];
$_score2 = $score2[1];
$goals2 = $score2[2];
$cGoals2 = $score2[3];
$rank2 = -1;
if (array_key_exists(4, $score2 )) {$rank2 = $score2[4]; }
$diff1 = $goals1-$cGoals1;
$diff2 = $goals2-$cGoals2;
if ($rank1 < $rank2) return true;
if ($rank2 < $rank1) return false;
if ($_score1 == $_score2) {
if ($diff1==$diff2) {
if ($goals1 == $goals2) {
@ -131,6 +142,8 @@ class League extends Model
// Für Auf/Abstiegsberechnung - wird auf previous Season angewendet.
// Unified bezieht sich (nur) auf Gruppen-Übergreifende Listung (also alle Untergruppen)
// Rank = -1 bedeutet über alle Rank (benötigt für Auf- und Abstieg über alle Ligen)
public static function getUnifiedRanking($rank, $seasonId=-1) {
$leagueScores = League::getRanking($rank, $seasonId);
$unifiedScores = array();
@ -144,6 +157,29 @@ class League extends Model
return $unifiedScores;
}
// Nur für Auf und Abstieg
public static function getTotalRankingOverall($seasonId=-1) {
$totalRanking=array();
foreach([1,2,3,4] as $rank) {
foreach (League::getUnifiedRanking($rank, $seasonId) as $rankEntry) {
// Tuple: [0] = userId, [1] = league_score [2] = goals, [3] = counter_goals
$tpl = array();
$tpl[0] = $rankEntry[0];
$tpl[1] = $rankEntry[1];
$tpl[2] = $rankEntry[2];
$tpl[3] = $rankEntry[3];
$tpl[4] = $rank;
array_push($totalRanking, $tpl);
}
}
usort($totalRanking, array('App\Leagues\League','cmpScore'));
return $totalRanking;
}
// ausfaktoriert aus LeaguesController::createLeagues()
// TODO: $round_count ist nur im Quali-Modus relevant und steuert, wieviele Quali-Gruppen benötigt werden.
// TODO: Sobald es Liga1 und Liga2 gibt, wird der round_count immer 21 sein, da Liga1 und Liga2 auf
@ -166,7 +202,7 @@ class League extends Model
$active_member_count=sizeof(User::getActives());
Log::info("Aktive Spieler: ".$active_member_count);
$neededLeagues = League::neededLeagues($active_member_count, $round_count);
Log::info("Benötigte Quali-Gruppen: ".$neededLeagues);
Log::info("Benötigte Liga-Gruppen: ".$neededLeagues);
$league_ids=array();
@ -177,6 +213,7 @@ class League extends Model
// Alle Spieler werden gleichmässig auf Qualifikationsgruppen aufgeteilt
// Dieser Modus wird gewählt, wenn es keine Vorsaison gibt, es also
// die erste Saison im System ist.
Log::info("League::createLeagues => No previous season detected.");
for ($league_nr=1; $league_nr<=$neededLeagues; $league_nr+=1) {
$league = League::create([
'is_qualification' => true,
@ -204,7 +241,6 @@ class League extends Model
'league_id' => $league_ids[$league_index]
]);
$leagueMember->save();
$league_index+=1;
if (sizeof($league_ids)==$league_index) { $league_index=0; }
}
@ -217,6 +253,9 @@ class League extends Model
// - 4.) Member den Ligen zuordnen
// Erzeugung der Ligen
$createdLeagues=array();
$neededLeagues=0;
$league_size1= min(22,$active_member_count);
$league1 = League::create([
'is_qualification' => false,
@ -227,7 +266,7 @@ class League extends Model
'season_id' => $currentSeason->id,
'start_round_id' => $start_round_id
]);
array_push($createdLeagues, $league1);
$league_size2=min(22,$active_member_count - $league_size1);
if ($league_size2>0) {
@ -240,7 +279,7 @@ class League extends Model
'season_id' => $currentSeason->id,
'start_round_id' => $start_round_id
]);
array_push($createdLeagues, $league2);
$league_size3 = $active_member_count - $league_size1 - $league_size2;
if ($league_size3>0) {
@ -256,12 +295,58 @@ class League extends Model
'start_round_id' => $start_round_id
]);
$league->save();
array_push($createdLeagues,$league);
}
}
// TODO: LeagueMembers zu den Leagues hinzufügen, abhängig vom zuzuordnenden Platz
$unifiedList = League::getTotalRankingOverall($previousSeason->id);
$currentCount = 1;
//TODO: Auf- und Abstieg
Log::info("-- CREATED LEAGUES --");
foreach($createdLeagues as $createdLeague) {
Log::info("-> ".$createdLeague->id.") ".$createdLeague->name);
//TODO: Member erzeugen / zuordnen
}
$nr=1;
$leagueNr=1;
$neededSize3=0;
$subLeague=1; // for rank 3 leagues only
$leagueCount=1;
$leagueIndex=0;
Log::info("unified list size= ".sizeof($unifiedList));
foreach($unifiedList as $entry) {
if ($nr==23) { $leagueNr=2; $leagueCount=1; $leagueIndex=1; }
if ($nr==45) {
$leagueNr=3; $leagueCount=1; $leagueIndex=2;
$neededSize3=intdiv(($active_member_count-44),$neededLeagues); // $neededLeagues = needed Groups for rank 3 leagues
Log::info("Needed min/switch size for rank 3 leagues: ".$neededSize3);
}
if ($nr>45 && $leagueCount > $neededSize3) {
$subLeague+=1;
$leagueCount=1;
$leagueIndex+=1;
}
Log::info("#".$leagueCount." Liga ".$leagueNr."-".$subLeague.")".$nr." ".$entry[0]);
$league=$createdLeagues[$leagueIndex];
$leagueMember = LeagueMember::create([
'user_id' => $entry[0],
'league_id' => $league->id
]);
$leagueMember->save();
$leagueCount+=1;
$nr++;
}
}
}
}