/** * @param Group $group * @param PlanningOptions $options * @return array */ private function populateGroup(Group $group, PlanningOptions $options) { $matches = array(); $teams = $group->getTeams(); $check = array(); /* @var $teamA Team */ foreach ($teams as $teamA) { $idx = 0; /* @var $teamB Team */ foreach ($teams as $teamB) { if ($teamA->getId() != $teamB->getId() && !isset($check[$teamB->getId()])) { $switch = $idx % 2 == 0 || $options->isDoublematch(); $match = new MatchPlan(); $match->setTeamA($switch ? $teamA : $teamB); $match->setTeamB($switch ? $teamB : $teamA); $match->setFixed(false); $matches[] = $match; $idx++; } } if (!$options->isDoublematch()) { $check[$teamA->getId()] = $teamA; } } return $matches; }
/** * Update tournament schedule with qualified teams * @param $tournamentid * @return array */ public function updateTournamentSchedule($tournamentid) { $groups = $this->map($this->logic->listGroupsByTournament($tournamentid)); $playgrounds = $this->map($this->logic->listPlaygroundsByTournament($tournamentid)); $settledGroups = array(); /* @var $group Group */ foreach ($groups as $group) { $settledGroups[$group->getId()] = $this->order->sortCompletedGroup($group->getId()); } $matches = array(); $matchList = $this->match->listOpenQMatchesByTournament($tournamentid); /* @var $qmatch QMatch */ foreach ($matchList as $qmatch) { $sortedGrpA = $settledGroups[$qmatch->getGroupA()]; $sortedGrpB = $settledGroups[$qmatch->getGroupB()]; if ($sortedGrpA && $sortedGrpB) { $match = new MatchPlan(); $match->setMatchno($qmatch->getMatchno()); $match->setDate($qmatch->getDate()); $match->setTime($qmatch->getTime()); $match->setGroup($groups[$qmatch->getPid()]); $match->setCategory($match->getGroup()->getCategory()); $match->setPlayground($playgrounds[$qmatch->getPlayground()]); $match->setTeamA($this->getTeam($sortedGrpA[$qmatch->getRankA()])); $match->setTeamB($this->getTeam($sortedGrpB[$qmatch->getRankB()])); $matches[] = array('Q' => $qmatch, 'M' => $match); } else { $matches[] = array('Q' => $qmatch, 'M' => null); } } return $matches; }
/** * Check if two match records share the same team * @param MatchPlan $match * @param MatchPlan $replanMatch * @return bool */ private function teamsMatch(MatchPlan $match, MatchPlan $replanMatch) { return $match->getTeamA()->getId() == $replanMatch->getTeamA()->getId() || $match->getTeamA()->getId() == $replanMatch->getTeamB()->getId() || $match->getTeamB()->getId() == $replanMatch->getTeamA()->getId() || $match->getTeamB()->getId() == $replanMatch->getTeamB()->getId(); }
private function makeMatchSchedule(Tournament $tournament, MatchPlan $match) { // for QMatchPlan, group and team are undefined - use classification and litra instead if ($match instanceof QMatchPlan) { /* @var $match QMatchPlan */ $ms = new QMatchSchedule(); $ms->setTournament($tournament); $ms->setCategory($this->em->merge($match->getCategory())); $ms->setBranch(''); $ms->setClassification($match->getClassification()); $ms->setLitra($match->getLitra()); $hr = new QMatchScheduleRelation(); $hr->setBranch($match->getRelA()->getBranch()); $hr->setClassification($match->getRelA()->getClassification()); $hr->setLitra($match->getRelA()->getLitra()); $hr->setRank($match->getRelA()->getRank()); $hr->setAwayteam(false); $ms->addQMatchRelation($hr); $ar = new QMatchScheduleRelation(); $ar->setBranch($match->getRelB()->getBranch()); $ar->setClassification($match->getRelB()->getClassification()); $ar->setLitra($match->getRelB()->getLitra()); $ar->setRank($match->getRelB()->getRank()); $ar->setAwayteam(true); $ms->addQMatchRelation($ar); } else { $ms = new MatchSchedule(); $ms->setTournament($tournament); $ms->setGroup($this->em->merge($match->getGroup())); $hr = new MatchScheduleRelation(); $hr->setTeam($this->em->merge($match->getTeamA())); $hr->setAwayteam(false); $ms->addMatchRelation($hr); $ar = new MatchScheduleRelation(); $ar->setTeam($this->em->merge($match->getTeamB())); $ar->setAwayteam(true); $ms->addMatchRelation($ar); } return $ms; }
private function prepareUnassignedMatch(MatchPlan $match, $msid, &$ts, &$catcnt) { $match->setTime(''); $match->setPlayground(null); $match->setDate(''); $match->setFixed(false); $category = $match->getCategory(); if (isset($catcnt[$category->getId()])) { $catcnt[$category->getId()]['matchcount']++; } else { $catcnt[$category->getId()] = array('category' => $category, 'matchcount' => 1); } $malts = array(); /* @var $ma MatchAlternative */ foreach ($this->logic->listMatchAlternatives($msid) as $ma) { $pattr = $ma->getPlaygroundAttribute(); if (isset($ts[$pattr->getId()])) { $malts[] = $ts[$pattr->getId()]; } } usort($malts, function (PA $ats1, PA $ats2) { $p1 = $ats2->getTimeleft() - $ats1->getTimeleft(); $p2 = $ats1->getPlayground()->getNo() - $ats2->getPlayground()->getNo(); $p3 = $ats1->getTimeslot()->getId() - $ats2->getTimeslot()->getId(); $test = min(1, max(-1, $p1)) * 4 + min(1, max(-1, $p2)) * 2 + min(1, max(-1, $p3)); return min(1, max(-1, $test)); }); $alternatives = array(); /* @var $alt PA */ foreach ($malts as $alt) { $alternatives[date_format($alt->getSchedule(), "Y/m/d")][] = $alt; } return array('id' => $msid, 'match' => $match, 'alternatives' => $alternatives); }
private function freeTeamCapacity(Team $team, MatchPlan $match, Timeslot $timeslot) { $date = Date::getDate($match->getSchedule()); $time = Date::getTime($match->getSchedule()); $key = $this->makeKey($team, $date, $timeslot); unset($this->teams[$key][$time]); }