/**
  * 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);
 }