<?php defined('SYSPATH') || die('No direct script access.'); class Controller_Office_Bill extends Controller_Environment_Office { const TYPE_SUCCESS = 0; const TYPE_DEBT = 1; const TYPE_REPASS = 2; public function before() { parent::before(); Cookie::set('fD', 'true'); } // notice: side effect! protected static function concatNames(&$students) { foreach ($students as &$student) { // todo: SecondName may be empty $student['FullName'] = $student['LastName'] . ' ' . $student['FirstName'] . ' ' . $student['SecondName']; } } protected static function calcRes(&$r, $disc) { $row = $r; $rate = $r['intermediate'] + $r['bonus'] + $r['extra'] + $r['exam']; $rate = ($rate > 100)? '100+': $rate; $row['rating'] = $rate; $type = ($r['examCnt'] > 1)? self::TYPE_REPASS: self::TYPE_SUCCESS; $type = ($r['intermediate'] + $r['exam'] < 0.6 * $disc['CurRate'])? self::TYPE_DEBT: $type; $type = ($disc['Type'] == 'exam' && $r['exam'] < 22 && $r['examCnt'] > 0)? self::TYPE_DEBT: $type; $row['Type'] = $type; return $row; } // todo: dirty negate hack! protected static function getMixedDiscID($compID, $discID) { return ($compID)? -$compID : $discID; } protected static function getRateMap(&$ratesRaw, &$disciplines) { $ratesMap = []; foreach ($ratesRaw as $r) { $studentID = $r['StudentID']; $discID = $r['DisciplineID']; $mixID = self::getMixedDiscID($r['CompoundDiscID'], $discID); // todo: check, students in 2 disc $ratesMap[$studentID][$mixID] = self::calcRes($r, $disciplines[$discID]); } return $ratesMap; } protected static function processCompounds($disciplines) { $res = []; foreach ($disciplines as $disc) { $mixID = self::getMixedDiscID($disc['CompoundDiscID'], $disc['ID']); $res[$mixID] = $disc; } return $res; } public function action_show() { $semesterID = $this->request->post('semesterID'); $groupID = $this->request->post('groupID'); $students = Model_Students::ofGroup($groupID, $semesterID); self::concatNames($students); // TODO: refactor after new groups implemented $disciplines = Model_Group::with($groupID)->getDisciplines(false, $semesterID); $disciplines = Arr::groupByUniqueKey('ID', $disciplines); $discWithCompounds = self::processCompounds($disciplines); $rates = Model_Rating::getRatesForGroupAll($groupID, $semesterID); $ratesMap = self::getRateMap($rates, $disciplines); $this->twig->set_filename(static::OFFICE . 'bill') ->set([ 'Disciplines' => $discWithCompounds, 'Students' => $students, 'Rates' => $ratesMap, ]); } }