/**
  * @see Form::readData()
  */
 public function readData()
 {
     parent::readData();
     // read objects
     $this->priceList->sqlOffset = ($this->pageNo - 1) * $this->itemsPerPage;
     $this->priceList->sqlLimit = $this->itemsPerPage;
     $this->priceList->readObjects();
     $this->isSponsor = $this->entry->isSponsor();
     // init sidebar
     $this->sidebar = new ContestSidebar($this->entry, array('priceList', 'advertiseSponsor'));
 }
 /**
  * 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');
 }
 /**
  * when winners are not allowed to take the prices on their own, this is done automatically
  */
 public function updatePricechoices()
 {
     require_once WCF_DIR . 'lib/data/contest/solution/ContestSolution.class.php';
     // check if there are already solutions with prices
     $solutionIDs = array();
     foreach (ContestSolution::getWinners($this->contestID) as $solution) {
         if ($solution->hasPrice()) {
             return;
         }
         $solutionIDs[] = $solution->solutionID;
     }
     require_once WCF_DIR . 'lib/data/contest/price/ContestPriceList.class.php';
     $priceList = new ContestPriceList();
     $priceList->sqlConditions .= 'contest_price.state = "accepted" AND contest_price.contestID = ' . intval($this->contestID);
     $priceList->sqlLimit = count($solutionIDs);
     $priceList->readObjects();
     $i = 0;
     foreach ($priceList->getObjects() as $price) {
         $price->getEditor()->pick($solutionIDs[$i], $i + 1);
         $i++;
     }
 }
 /**
  * returns all sidebar data in format, which can be cached
  */
 protected function _init()
 {
     // get classes
     $classList = new ContestClassTree();
     $classList->readObjects();
     // get jurys
     if (!$this->contest || $this->contest->isEnabledJury()) {
         $juryList = new ContestJuryList();
         if ($this->contest !== null) {
             $juryList->sqlConditions .= 'contest_jury.contestID = ' . $this->contest->contestID . ' AND contest_jury.state = "accepted" ';
         } else {
             $juryList->sqlJoins .= " INNER JOIN wcf" . WCF_N . "_contest contest ON contest.contestID = contest_jury.contestID ";
             $juryList->sqlConditions .= 'contest.state IN ("scheduled", "closed") AND contest_jury.state = "accepted" ';
         }
         $juryList->sqlOrderBy = 'juryID DESC';
         $juryList->readObjects();
     } else {
         $juryList = null;
     }
     // get participants
     $participantList = new ContestParticipantList();
     if ($this->contest !== null) {
         $participantList->sqlConditions .= 'contest_participant.contestID = ' . $this->contest->contestID . ' AND contest_participant.state = "accepted" ';
     } else {
         $participantList->sqlJoins .= " INNER JOIN wcf" . WCF_N . "_contest contest ON contest.contestID = contest_participant.contestID ";
         $participantList->sqlConditions .= 'contest.state IN ("scheduled", "closed") AND contest_participant.state = "accepted" ';
     }
     $participantList->sqlLimit = 10;
     $participantList->sqlOrderBy = 'participantID DESC';
     $participantList->readObjects();
     // get sponsors
     $sponsorList = new ContestSponsorList();
     if ($this->contest !== null) {
         $sponsorList->sqlConditions .= 'contest_sponsor.contestID = ' . $this->contest->contestID . ' AND contest_sponsor.state = "accepted" ';
     } else {
         $sponsorList->sqlJoins .= " INNER JOIN wcf" . WCF_N . "_contest contest ON contest.contestID = contest_sponsor.contestID ";
         $sponsorList->sqlConditions .= 'contest.state IN ("scheduled", "closed") AND contest_sponsor.state = "accepted" ';
     }
     $sponsorList->sqlOrderBy = 'sponsorID DESC';
     $sponsorList->readObjects();
     // get prices
     $priceList = new ContestPriceList();
     if ($this->contest !== null) {
         $priceList->sqlConditions .= 'contest_price.contestID = ' . $this->contest->contestID . ' AND contest_price.state != "declined" ';
     } else {
         $priceList->sqlJoins .= " INNER JOIN wcf" . WCF_N . "_contest contest ON contest.contestID = contest_price.contestID ";
         $priceList->sqlConditions .= 'contest.state IN ("scheduled", "closed") AND contest_price.state != "declined" ';
     }
     $priceList->sqlOrderBy = 'position ASC';
     $priceList->readObjects();
     // get tag cloud
     $tagList = null;
     if (MODULE_TAGGING) {
         $tagList = new ContestTagList($this->contest, WCF::getSession()->getVisibleLanguageIDArray());
         $tagList->readObjects();
     }
     // get latest entries
     $latestEntryList = new ContestList();
     if ($this->contest !== null) {
         $latestEntryList->sqlConditions .= 'contest.contestID != ' . $this->contest->contestID;
     }
     $latestEntryList->sqlLimit = 10;
     $latestEntryList->readObjects();
     // get latest solutions
     if (!$this->contest || $this->contest->enableSolution) {
         $latestSolutionList = new ContestSolutionList();
         if ($this->contest !== null) {
             $latestSolutionList->sqlConditions .= 'contest_solution.contestID = ' . $this->contest->contestID;
         }
         $latestSolutionList->sqlOrderBy = 'solutionID DESC';
         $latestSolutionList->sqlLimit = 5;
         $latestSolutionList->readObjects();
     } else {
         $latestSolutionList = null;
     }
     return array('classList' => $classList, 'juryList' => $juryList, 'participantList' => $participantList, 'sponsorList' => $sponsorList, 'priceList' => $priceList, 'tagList' => $tagList, 'latestEntryList' => $latestEntryList, 'latestSolutionList' => $latestSolutionList);
 }