public function prihlasNaTermin(Trace $trace, $terminIndex)
 {
     $terminy = $this->executor->readTable(array(), 'terminy');
     // Jemna napodobenina logiky pre prihlasovanie,
     // checkuje ci uz nie som zapisany na iny termin s vyslednou znamkou.
     foreach ($terminy as $index => $unused) {
         $info = $this->executor->readTable(array('termin' => $index), 'prihlas');
         if (isset($info['jePrihlaseny']) && $info['jePrihlaseny']) {
             $znamka = $info['prihlasenyData'][self::MOJE_TERMINY_ZNAMKA];
             if (!Znamka::isSame($znamka, 'Fx')) {
                 throw new Exception("Už si prihlásený na iný termín z tohoto predmetu!");
             }
         }
     }
     $info = $this->executor->readTable(array('termin' => $terminIndex), 'prihlas');
     if (!isset($info['mozePrihlasit']) || !$info['mozePrihlasit']) {
         $dovod = isset($info['nemozePrihlasitDovod']) ? $info['nemozePrihlasitDovod'] : 'neznámy';
         throw new Exception("Nemôžem prihlásiť na termín - dôvod: " . $dovod);
     }
     if (isset($info['jePrihlaseny']) && $info['jePrihlaseny']) {
         throw new Exception("Na daný termín si už prihlásený.");
     }
     $info['jePrihlaseny'] = true;
     $this->executor->writeTable(array('termin' => $terminIndex), 'prihlas', $info);
     $this->closeIfNeeded($trace);
     return true;
 }
 public function mozeSaPrihlasit($prihlasTerminyRow, $time)
 {
     $predmet = $prihlasTerminyRow[PrihlasTerminyFields::PREDMET_SKRATKA];
     if (isset($this->hodnoteniaData[$predmet][HodnoteniaFields::ZNAMKA])) {
         $znamka = $this->hodnoteniaData[$predmet][HodnoteniaFields::ZNAMKA];
     } else {
         $znamka = "";
     }
     // Note(PPershing): never use $this->hodnoteniaData[$predmet][HodnoteniaFields::MOZE_PRIHLASIT]
     // AiS will incorrectly report that you can't sign up if you have FX!
     $mozePredmet = $prihlasTerminyRow[ZoznamTerminovFields::MOZE_PRIHLASIT] == 'A';
     if ($znamka != "" && !Znamka::isSame($znamka, 'Fx') && !$mozePredmet) {
         return self::PRIHLASIT_NEMOZE_ZNAMKA;
     }
     $prihlasRange = AIS2Utils::parseAISDateTimeRange($prihlasTerminyRow[PrihlasTerminyFields::PRIHLASOVANIE_DATUM]);
     if (!($prihlasRange['od'] < $time && $prihlasRange['do'] > $time)) {
         return self::PRIHLASIT_NEMOZE_CAS;
     }
     if ($prihlasTerminyRow[PrihlasTerminyFields::MAX_POCET] !== '' && $prihlasTerminyRow[PrihlasTerminyFields::MAX_POCET] <= $prihlasTerminyRow[PrihlasTerminyFields::POCET_PRIHLASENYCH]) {
         return self::PRIHLASIT_NEMOZE_POCET;
     }
     if (!$mozePredmet) {
         return self::PRIHLASIT_NEMOZE_INE;
     }
     if ($znamka != "" && !Znamka::isSame($znamka, 'Fx') && $mozePredmet) {
         return self::PRIHLASIT_MOZE_ZNAMKA;
     }
     return self::PRIHLASIT_MOZE;
 }
 public function mozeSaPrihlasit($prihlasTerminyRow, $time)
 {
     $predmet = $prihlasTerminyRow[PrihlasTerminyFields::PREDMET_SKRATKA];
     if (isset($this->hodnoteniaData[$predmet][HodnoteniaFields::ZNAMKA])) {
         $znamka = $this->hodnoteniaData[$predmet][HodnoteniaFields::ZNAMKA];
     } else {
         $znamka = "";
     }
     if (isset($this->hodnoteniaData[$predmet][HodnoteniaFields::MOZE_PRIHLASIT]) && $this->hodnoteniaData[$predmet][HodnoteniaFields::MOZE_PRIHLASIT] == 'N') {
         $mozePredmet = false;
     } else {
         $mozePredmet = true;
     }
     if ($znamka != "" && !Znamka::isSame($znamka, 'Fx') && !$mozePredmet) {
         return self::PRIHLASIT_NEMOZE_ZNAMKA;
     }
     $prihlasRange = AIS2Utils::parseAISDateTimeRange($prihlasTerminyRow[PrihlasTerminyFields::PRIHLASOVANIE_DATUM]);
     if (!($prihlasRange['od'] < $time && $prihlasRange['do'] > $time)) {
         return self::PRIHLASIT_NEMOZE_CAS;
     }
     if ($prihlasTerminyRow[PrihlasTerminyFields::MAX_POCET] !== '' && $prihlasTerminyRow[PrihlasTerminyFields::MAX_POCET] <= $prihlasTerminyRow[PrihlasTerminyFields::POCET_PRIHLASENYCH]) {
         return self::PRIHLASIT_NEMOZE_POCET;
     }
     if (!$mozePredmet) {
         return self::PRIHLASIT_NEMOZE_INE;
     }
     if ($znamka != "" && !Znamka::isSame($znamka, 'Fx') && $mozePredmet) {
         return self::PRIHLASIT_MOZE_ZNAMKA;
     }
     return self::PRIHLASIT_MOZE;
 }
 public function testPorovnavaniaZnamok()
 {
     $this->assertTrue(Znamka::isSame('a', 'a'));
     $this->assertTrue(Znamka::isSame('a', 'A'));
     $this->assertTrue(Znamka::isSame('A', 'a'));
     $this->assertTrue(Znamka::isSame('Fx', 'Fx'));
     $this->assertTrue(Znamka::isSame('FX', 'Fx'));
     $this->assertTrue(Znamka::isSame('Fx', 'FX'));
     $this->assertTrue(Znamka::isSame('fX', 'fx'));
     $this->assertTrue(Znamka::isSame('fX', 'FX'));
     $this->assertFalse(Znamka::isSame('a', 'B'));
     $this->assertFalse(Znamka::isSame('Fx', 'Fxx'));
     $this->assertFalse(Znamka::isSame('C', 'EC'));
 }
 /**
  * Prida predmet s danou znamkou, zarata do neohodnotenych ak
  * sa znamku nepodarilo rozpoznat alebo nie je vyplnena
  * @param string $castRoka do ktorej casti roka sa ma znamka zaratat
  * @param string $znamkaText nazov znamky (A, B, ...)
  * @param int $kredity pocet kreditov pre danu znamku
  */
 public function add($castRoka, $znamkaText, $kredity)
 {
     Preconditions::check(in_array($castRoka, array(self::SEMESTER_LETNY, self::SEMESTER_ZIMNY, self::AKADEMICKY_ROK)), "Neplatná časť študijného roka.");
     $znamka = null;
     if ($znamkaText !== '') {
         $znamka = Znamka::fromString($znamkaText);
     }
     $this->obdobia[$castRoka]->add($kredity, $znamka);
     // Ak pridavame do akademickeho roka, tak hodnotu nechceme zaratat dvakrat
     if ($castRoka !== self::AKADEMICKY_ROK) {
         $this->obdobia[self::AKADEMICKY_ROK]->add($kredity, $znamka);
     }
 }
 /**
  * Vypocita vazeny priemer, vaha sa berie z kreditov
  * @param boolean $neohodnotene true ak sa maju zapocitat aj neohodnotene
  *                              predmety so znamkou Fx
  * @returns float hodnota vazeneho priemeru
  */
 public function vazenyPriemer($neohodnotene = true)
 {
     $suma = $this->sucetVah;
     $pocet = $this->pocetKreditovOhodnotenych;
     if ($neohodnotene) {
         $hodnotaFx = Znamka::fromString('Fx')->getNumerickaHodnota();
         $suma += $this->pocetKreditovNeohodnotenych * $hodnotaFx;
         $pocet += $this->pocetKreditovNeohodnotenych;
     }
     if ($pocet == 0) {
         return null;
     }
     return $suma / $pocet;
 }