Newer
Older
<?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]);
protected static function processCompounds($disciplines) {
foreach ($disciplines as $disc) {
$mixID = self::getMixedDiscID($disc['CompoundDiscID'], $disc['ID']);
$res[$mixID] = $disc;
protected static function processGlobal($disciplines, $students, $rates) {
$res = [];
$subjectsToGlobals = [];
$disciplinesToGlobals = [];
$nextGlobalNum = 1;
foreach ($disciplines as $disc) {
if ($disc['IsGlobal']) {
$subj = $disc['SubjectID'];
if (array_key_exists($subj, $subjectsToGlobals)) {
$disciplinesToGlobals[$disc['ID']] = $nextGlobalNum - 1;
$subjectsToGlobals[$subj] = $nextGlobalNum;
$disciplinesToGlobals[$disc['ID']] = $nextGlobalNum;
$newGlobalDiscipline = [
'ID' => $nextGlobalNum,
'SubjectName' => $disc["SubjectName"],
];
$res[$nextGlobalNum] = $newGlobalDiscipline;
$nextGlobalNum++;
}
foreach($students as $student) {
$rate = $rates[$student['ID']][$disc['ID']];
if ($rate) {
$res[$disciplinesToGlobals[$disc['ID']]][$student['ID']] = $disc['ID'];
}
}
}
}
return $res;
}
$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($lazy = false, $semesterID, $showglobal = true);
$disciplines = Arr::groupByUniqueKey('ID', $disciplines);
$discWithCompounds = self::processCompounds($disciplines);
$rates = Model_Rating::getRatesForGroupAll($groupID, $semesterID);
$ratesMap = self::getRateMap($rates, $disciplines);
$globalDisciplines = self::processGlobal($disciplines, $students, $ratesMap);
$this->twig->set_filename(static::OFFICE . 'bill')
'Disciplines' => $discWithCompounds,
'GlobalDisciplines' => $globalDisciplines,
'Students' => $students,
'Rates' => $ratesMap,