/** * finish the contest */ public function close() { if (!($this->contest->state == 'scheduled' && $this->contest->untilTime < time())) { throw new Exception('contest needs to be scheduled, and time has to be over.'); } // make a jury instance from the contst owner $jury = ContestJury::find($this->contest->contestID, $this->contest->userID, $this->contest->groupID); if ($jury === null) { $jury = ContestJuryEditor::create($this->contest->contestID, $this->contest->userID, $this->contest->groupID, $state = 'accepted'); } $userID = $this->contest->userID; if ($userID == 0 && $this->contest->groupID > 0) { $sql = "SELECT userID\n\t\t\t\tFROM wcf" . WCF_N . "_user_to_groups\n\t\t\t\tWHERE groupID = " . intval($this->contest->groupID); $row = WCF::getDB()->getFirstRow($sql); $userID = $row['userID']; } if (!$userID) { throw new Exception('cannot determine a user from which the ratings will be added.'); } $classIDs = array_keys($this->contest->getClasses()); $ratingoptionIDs = array_keys(ContestRatingoption::getByClassIDs($classIDs)); if (empty($ratingoptionIDs)) { throw new Exception('cannot determine a ratingoption from classes [' . implode(',', $classIDs) . '] needed for contest ratings to be added.'); } // get interactions $interactionList = new ContestInteractionList($this->contest); $interactionList->sqlLimit = 0; $interactionList->readObjects(); $owners = $interactionList->getObjects(); foreach ($owners as $owner) { $this->sum += $owner->c; } // get prices $priceList = new ContestPriceList(); $priceList->sqlConditions .= 'contest_price.state = "accepted" AND contest_price.contestID = ' . intval($this->contest->contestID); $priceList->sqlLimit = 0; $priceList->readObjects(); $score = 5 + $priceList->countObjects(); foreach ($priceList->getObjects() as $price) { // choose a winner $owner = $this->chooseWinner($price, $owners); // error, there are more prices than participants if (!$owner) { throw new Exception('there are more prices than participants.'); } $lang = 'wcf.contest.interaction.tickets.solution'; $message = WCF::getLanguage()->getDynamicVariable($lang, array('tickets' => $owner->c)); // create pseudo solution $solution = ContestSolutionEditor::create($this->contest->contestID, $owner->participantID, $message, $state = 'accepted'); foreach ($ratingoptionIDs as $ratingOptionID) { // create pseudo rating $rating = ContestSolutionRatingEditor::create($solution->solutionID, $ratingOptionID, $score, $userID); } // decrease score $score--; } // close contest state $this->contest->getEditor()->updateState('closed'); }
/** * @see Form::readParameters() */ public function readParameters() { parent::readParameters(); // get entry if (isset($_REQUEST['contestID'])) { $this->contestID = intval($_REQUEST['contestID']); } $this->entry = new ViewableContest($this->contestID); if (!$this->entry->contestID) { throw new IllegalLinkException(); } // get entry if (isset($_REQUEST['solutionID'])) { $this->solutionID = intval($_REQUEST['solutionID']); } $this->solutionObj = new ViewableContestSolution($this->solutionID); if (!$this->solutionObj->solutionID) { throw new IllegalLinkException(); } if (isset($_REQUEST['sendPickNotification'])) { $this->sendPickNotification = true; } // init comment list $this->commentList = new ContestSolutionCommentList(); $this->commentList->sqlConditions .= 'contest_solution_comment.solutionID = ' . intval($this->solutionID); $this->commentList->sqlOrderBy = 'contest_solution_comment.time DESC'; // init rating list $this->ratingList = new ContestSolutionRatingSummaryList(); $this->ratingList->sqlConditions .= 'contest_solution_rating.solutionID = ' . intval($this->solutionID); $classIDs = array_keys($this->entry->getClasses()); $ratingoptionIDs = array_keys(ContestRatingoption::getByClassIDs($classIDs)); $this->ratingList->sqlConditionsClasses = implode(',', $ratingoptionIDs); }