public function testFromVoixAndExprimes()
 {
     $score = Score::fromVoixAndExprimes(500, 1000);
     $this->assertEquals(500, $score->toVoix());
     $this->assertLessThanOrEqual(50.001, $score->toPourcentage());
     $this->assertGreaterThanOrEqual(49.999, $score->toPourcentage());
 }
 private function doScoreQuery(Echeance $echeance, $territoire, $candidat)
 {
     $query = $this->em->createQuery('SELECT SUM(score.scoreVO.voix)
             FROM
                 AppBundle\\Domain\\Election\\Entity\\Election\\ScoreAssignment
                 score
             JOIN score.election election
             WHERE  score.territoire  = :territoire
                 AND score.candidat
                     IN (' . $this->getCandidatSubquery($candidat) . ')
                 AND election.echeance = :echeance')->setParameters(array('echeance' => $echeance, 'territoire' => $territoire));
     if ($candidat instanceof CandidatNuanceSpecification) {
         $query->setParameter('nuances', $candidat->getNuances());
     } else {
         $query->setParameter('candidat', $candidat);
     }
     $result = $query->getSingleScalarResult();
     return $result ? Score::fromVoix($result) : null;
 }
 private function doScoreQuery(Echeance $echeance, $territoire, $candidat)
 {
     $result = $this->fetchScoreResult($echeance, $territoire, $candidat, 'doScoreQuery');
     if (is_integer($result)) {
         return Score::fromVoix($result);
     }
     if (false === $result) {
         return;
     }
     $query = $this->em->createQuery('SELECT candidat_ AS candidat, score.scoreVO.voix AS voix
             FROM
                 AppBundle\\Domain\\Election\\Entity\\Candidat\\Candidat
                 candidat_,
                 AppBundle\\Domain\\Election\\Entity\\Election\\ScoreAssignment
                 score
             JOIN score.election election
             WHERE score.territoire  = :territoire
                 AND score.candidat = candidat_
                 AND election.echeance = :echeance
             GROUP BY candidat_')->setParameters(array('echeance' => $echeance, 'territoire' => $territoire));
     $results = $query->getResult();
     $this->cacheScoreResult($echeance, $territoire, $results, 'doScoreQuery');
     $result = $this->fetchScoreResult($echeance, $territoire, $candidat, 'doScoreQuery');
     return is_integer($result) ? Score::fromVoix($result) : null;
 }
 /**
  * Mettre à jour le nombre de voix d'un candidat sur un territoire donné,
  * ou par défaut sur la circonscription de l'élection. Si le nombre de
  * suffrages exprimés est déjà réglé dans l'élection, le pourcentage est
  * mis à jour automatiquement. Sinon, pourcentage et voix sont effacés et
  * remplacés par cette donnée.
  *
  * @param int                $voix       Le nombre de voix du candidat.
  * @param CandidatInterface  $candidat   Le candidat dont il s'agit.
  * @param AbstractTerritoire $territoire Le territoire du score.
  */
 public function setVoixCandidat($voix, CandidatInterface $candidat, AbstractTerritoire $territoire = null)
 {
     if (!in_array($candidat, $this->getCandidats(), true)) {
         throw new \Exception('Le candidat doit déjà participer à l\'élection' . 'avant d\'avoir un score');
     }
     if (null === $territoire) {
         $territoire = $this->circonscription;
     }
     $voteInfo = $this->getVoteInfo($territoire);
     if ($voteInfo) {
         $exprimes = $voteInfo->getExprimes();
     }
     if (isset($exprimes)) {
         $score = Score::fromVoixAndExprimes($voix, $exprimes);
     } else {
         $score = Score::fromVoix($voix);
     }
     $scoreAssignment = $this->getScoreAssignmentCandidat($candidat, $territoire);
     $scoreAssignment->setScoreVO($score);
 }