Skip to content
Snippets Groups Projects
Bill.php 4.33 KiB
Newer Older
<?php defined('SYSPATH') || die('No direct script access.');
dmitry.s's avatar
dmitry.s committed

class Controller_Office_Bill extends Controller_Environment_Office
dmitry.s's avatar
dmitry.s committed
{
    const TYPE_SUCCESS = 0;
    const TYPE_DEBT = 1;
    const TYPE_REPASS = 2;

dmitry.s's avatar
dmitry.s committed
    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;
Korvin's avatar
Korvin committed
        $type = ($r['examCnt'] > 1)? self::TYPE_REPASS: self::TYPE_SUCCESS;
        $type = ($r['intermediate'] + $r['exam'] < 0.6 * $disc['CurRate'])? self::TYPE_DEBT: $type;
Korvin's avatar
Korvin committed
        $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]);
dmitry.s's avatar
dmitry.s committed
        }
        return $ratesMap;
dmitry.s's avatar
dmitry.s committed
    }
dmitry.s's avatar
dmitry.s committed

    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'];
    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($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')
dmitry.s's avatar
dmitry.s committed
            ->set([
                'Disciplines'   => $discWithCompounds,
                'GlobalDisciplines' => $globalDisciplines,
                'Students'      => $students,
                'Rates'         => $ratesMap,
dmitry.s's avatar
dmitry.s committed
    }
}