Skip to content
Snippets Groups Projects
Rating.php 15.2 KiB
Newer Older
<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Teacher_Rating extends Controller_UserEnvi {

    public function before() {
        Cookie::set('fD', 'true'); // Ставим кук fD, чтоб иметь возможность скачать отчет TODO

        $this->model_rating = new Model_Teacher_Rating;
        $this->model_discipline = new Model_Teacher_Map;

        parent::before();
    }

    // Получить из кука SGID выбранную ранее группу для данной дисциплины
    private function getStudyGroupID_ForFilter($id)
    // Настройки дисциплины и выбранная группа(для фильтра)
    private function getDisciplineInformation($id) {

        $temp = $this->model_discipline->getDisciplineInfoByID($id);
        $disciplineInfo['ExamType'] = $temp[0]['ExamType'];
        $disciplineInfo['ID'] = $id;
PavelBegunkov's avatar
PavelBegunkov committed
        $disciplineInfo['isMilestone'] = $temp[0]['isMilestone'];
        $disciplineInfo['StudyGroupID_Filter'] = $this->getStudyGroupID_ForFilter($id);

        return $disciplineInfo;
    }


    // Страница оценивания в течение семестра
    public function action_edit()
    {
        $twig = Twig::factory('teacher/rating');
        $twig->User = $this->UserInfo;
        // Шапка таблицы: структура УКД (модули и мероприятия)
PavelBegunkov's avatar
PavelBegunkov committed
        $structure = $this->model_rating->GetMapForDiscipline($this->UserInfo['TeacherID'], $id);
        if($structure->count() == 0)
            throw HTTP_Exception::factory (404, "Для дисциплины с ID $id не создана УКД или такой дисциплины не существует!");
		$structureHandled = array();
        foreach($structure as $row)
            if(!isset($structureHandled[$i]['SubmodulesCount']))
                $structureHandled[$i]['SubmodulesCount'] = 0;
                $structureHandled[$i]['MaxRate'] = 0;
            $j = $structureHandled[$i]['SubmodulesCount'] += 1;
            $structureHandled[$i]['MaxRate'] += (int) $row['MaxRate'];
            $structureHandled[$i]['ModuleTitle'] = $row['ModuleName'];
            $structureHandled[$i]['ModuleType'] = $row['ModuleType'];
PavelBegunkov's avatar
PavelBegunkov committed
            if ($row['ModuleType'] == "exam") {
                $twig->examSubmoduleID = $row['SubmoduleID'];
PavelBegunkov's avatar
PavelBegunkov committed
            }
            $structureHandled[$i][$j]['SubmoduleID'] = $row['SubmoduleID'];
            $structureHandled[$i][$j]['Title'] = $row['SubModuleName'];
            //$structureHandled[$i][$j]['Description'] = $row['SubmoduleDescription']; // Описание
            $structureHandled[$i][$j]['MaxRate'] = (int) $row['MaxRate'];
PavelBegunkov's avatar
PavelBegunkov committed

            if ($row['ModuleType'] == "exam" || $row['ModuleType'] == "extra") {
                $structureHandled[$i][$j]['SubmoduleID'] = -1;
            }
        $structureHandled['ModulesCount'] = $i;
        $structureHandled['MaxRate'] = (int) $maxRate; 
        // end Шапка таблицы


        // Студенты и их баллы
        $students = $this->model_rating->GetStudentsForRating($this->UserInfo['TeacherID'], $id);
PavelBegunkov's avatar
PavelBegunkov committed

        $rateHandled = array();
        $groupsHandled = array();
        $i_g = 0; $i_s = 0; $curGroup = 0;
                $curGroup = $row['GroupID'];
                $i_g++;
                $rateHandled[$i_g]['GroupID'] = $row['GroupID'];
                $rateHandled[$i_g]['GroupNum'] = $row['GroupNum']; // № группы
                $rateHandled[$i_g]['GradeNum'] = $row['GradeNum']; // № курса
                $rateHandled[$i_g]['isAttached'] = $row['isAttached']; // #1

                if ($row['Degree'] == 'bachelor')
                    $rateHandled[$i_g]['GradeTitle'] = $row['GradeNum'].' курс';

                if ($row['Degree'] == 'specialist')
                    $rateHandled[$i_g]['GradeTitle'] = $row['GradeNum'].' курс';

                if ($row['Degree'] == 'master')
                    $rateHandled[$i_g]['GradeTitle'] = 'Магистратура, '.$row['GradeNum'].' год';

                $groupsHandled[$curGroup] = $rateHandled[$i_g]['GradeTitle']." ".$row['GroupNum']." группа"; 
            }
            $curStudent = array();
            $i_s++;
            $curStudent['ID'] = $row['ID'];
            $curStudent['Last'] = $row['Last'];
            $curStudent['First'] = $row['First'];
            $curStudent['Second'] = $row['Second'];
            $curStudent['isAttached'] = $row['isAttached']; // #1

            // Баллы студента
            $rates = $this->model_rating->getMapForStudent($row['ID'], $id);
            $i_r = 0;
            $curStudent['RateResult'] = 0;
            foreach($rates as $r) {
                $i_r++;
                $curStudent['Rates'][$i_r]['Rate'] = $r['Rate'];
                $curStudent['RateResult'] += $r['Rate'];

                if ($r['ModuleType'] == 'exam')
                    $curStudent['Rates'][$i_r]['SubmoduleID'] = -1;
                else if ($r['ModuleType'] == 'extra')
                    $curStudent['Rates'][$i_r]['SubmoduleID'] = -2;
                else 
                    $curStudent['Rates'][$i_r]['SubmoduleID'] = $r['SubmoduleID'];

                $curStudent['Rates'][$i_r]['Type'] = $r['ModuleType'];
            }
            $rateHandled[$i_g]['Students'][$i_s] = $curStudent;

            /*
            $i_s++;
            $rateHandled[$i_g]['Students'][$i_s]['ID'] = $row['ID'];
            $rateHandled[$i_g]['Students'][$i_s]['Last'] = $row['Last'];
            $rateHandled[$i_g]['Students'][$i_s]['First'] = $row['First'];
            $rateHandled[$i_g]['Students'][$i_s]['Second'] = $row['Second'];
            $rateHandled[$i_g]['Students'][$i_s]['isAttached'] = $row['isAttached']; // #1
            $i_r = 0;
            $rateHandled[$i_g]['Students'][$i_s]['RateResult'] = 0;
            foreach($rate as $r) {
                $i_r++;
                $rateHandled[$i_g]['Students'][$i_s]['Rates'][$i_r]['Rate'] = $r['Rate'];
                $rateHandled[$i_g]['Students'][$i_s]['RateResult'] += $r['Rate'];
PavelBegunkov's avatar
PavelBegunkov committed

RomanSteinberg's avatar
RomanSteinberg committed
                if ($r['ModuleType'] == 'exam')
PavelBegunkov's avatar
PavelBegunkov committed
                    $rateHandled[$i_g]['Students'][$i_s]['Rates'][$i_r]['SubmoduleID'] = -1;
RomanSteinberg's avatar
RomanSteinberg committed
				else if ($r['ModuleType'] == 'extra')
					$rateHandled[$i_g]['Students'][$i_s]['Rates'][$i_r]['SubmoduleID'] = -2;
                else 
PavelBegunkov's avatar
PavelBegunkov committed
                    $rateHandled[$i_g]['Students'][$i_s]['Rates'][$i_r]['SubmoduleID'] = $r['SubmoduleID'];
        $twig->rateTable = $rateHandled;
        $twig->groups = $groupsHandled;
        $twig->disciplineInfo = $this->getDisciplineInformation($id);
        $twig->disciplineInfo_JSON = json_encode($twig->disciplineInfo);
Антон Шалимов's avatar
Антон Шалимов committed

Антон Шалимов's avatar
Антон Шалимов committed
    public function action_exam()
Антон Шалимов's avatar
Антон Шалимов committed
    {
        $twig = Twig::factory('teacher/exam');
        $twig->User = $this->UserInfo;
        $id = $this->request->param('id');
        // Шапка таблицы: структура УКД (модули и мероприятия)
        $structure = $this->model_rating->GetMapForDisciplineExam($this->UserInfo['TeacherID'], $id);
RomanSteinberg's avatar
RomanSteinberg committed
		$disciplineInfo = $this->getDisciplineInformation($id);

        if($structure->count() == 0)
            throw HTTP_Exception::factory (404, "Страница не найдена");

        
        $structureHandled = array();
        $maxRate = 0; $i = 0; $temp_moduleID = 0; $try_1 = 0; // try = 1 - экзамен, = 2, 3 - пересдачи
PavelBegunkov's avatar
PavelBegunkov committed
        $try = 0;

        foreach($structure as $row)
        {
PavelBegunkov's avatar
PavelBegunkov committed
            {
PavelBegunkov's avatar
PavelBegunkov committed
            }
            if ($i == 1)
            if(!isset($structureHandled[$i]['SubmodulesCount']))
            {
                $structureHandled[$i]['SubmodulesCount'] = 0;
                $structureHandled[$i]['MaxRate'] = 0;
            }
            $j = $structureHandled[$i]['SubmodulesCount'] += 1;
            $structureHandled[$i]['MaxRate'] += (int) $row['MaxRate'];
            $structureHandled[$i]['ModuleTitle'] = $row['ModuleName'];
            $structureHandled[$i]['ModuleType'] = $row['ModuleType'];
            if ($row['ModuleType'] == "exam")
                $twig->examSubmoduleID = $row['SubmoduleID'];
                    
            $structureHandled[$i][$j]['SubmoduleID'] = $row['SubmoduleID'];
PavelBegunkov's avatar
PavelBegunkov committed
            if ($row['ModuleType'] == 'extra') {
                $structureHandled[$i][$j]['Title'] = 'Добор баллов';
PavelBegunkov's avatar
PavelBegunkov committed
                $maxRate += $row['MaxRate'];
PavelBegunkov's avatar
PavelBegunkov committed
            }
PavelBegunkov's avatar
PavelBegunkov committed
                if ($try === 0)
                    $structureHandled[$i][$j]['Title'] = 'Основная сдача';
                else
                    $structureHandled[$i][$j]['Title'] = 'Пересдача '.$try;
                $try++;
            //$structureHandled[$i][$j]['Description'] = $row['SubmoduleDescription']; // Описание
            $structureHandled[$i][$j]['MaxRate'] = (int) $row['MaxRate'];
PavelBegunkov's avatar
PavelBegunkov committed
           
        }
        $structureHandled['ModulesCount'] = $i;
        $structureHandled['MaxRate'] = (int) $maxRate; 
        // end Шапка таблицы

        // Студенты и их баллы по экзамену
        $students = $this->model_rating->GetStudentsForRating($this->UserInfo['TeacherID'], $id);

        $rateHandled = array();
        $groupsHandled = array();
PavelBegunkov's avatar
PavelBegunkov committed
        $i_g = 0; 
        $i_s = 0; 
        $curGroupID = 0;

        foreach($students as $row) {
PavelBegunkov's avatar
PavelBegunkov committed
            // Группа 
PavelBegunkov's avatar
PavelBegunkov committed
            if ($curGroupID !== $row['GroupID']) {
                $curGroupID = $row['GroupID'];
                $i_g++;
                $rateHandled[$i_g]['GroupID'] = $row['GroupID'];
                $rateHandled[$i_g]['GroupNum'] = $row['GroupNum']; // № группы
                $rateHandled[$i_g]['GradeNum'] = $row['GradeNum']; // № курса
                $rateHandled[$i_g]['isAttached'] = $row['isAttached']; // #1

                if ($row['Degree'] == 'bachelor')
                    $rateHandled[$i_g]['GradeTitle'] = $row['GradeNum'].' курс';

                if ($row['Degree'] == 'specialist')
                    $rateHandled[$i_g]['GradeTitle'] = $row['GradeNum'].' курс';

                if ($row['Degree'] == 'master')
                    $rateHandled[$i_g]['GradeTitle'] = 'Магистратура, '.$row['GradeNum'].' год';

PavelBegunkov's avatar
PavelBegunkov committed
                $groupsHandled[$curGroupID] = $rateHandled[$i_g]['GradeTitle']." ".$row['GroupNum']." группа"; 
PavelBegunkov's avatar
PavelBegunkov committed
                $i_s = 0;
PavelBegunkov's avatar
PavelBegunkov committed
            $curStudent = array();
PavelBegunkov's avatar
PavelBegunkov committed
            $curStudent['ID'] = $row['ID'];
            $curStudent['Last'] = $row['Last'];
            $curStudent['First'] = $row['First'];
            $curStudent['Second'] = $row['Second'];
            $curStudent['isAttached'] = $row['isAttached']; // #1
PavelBegunkov's avatar
PavelBegunkov committed
            $curStudent['RateResult'] = 0;

            // Баллы студента
            $i_r = 0;
PavelBegunkov's avatar
mx  
PavelBegunkov committed
            $extraNum = 0;
PavelBegunkov's avatar
PavelBegunkov committed

PavelBegunkov's avatar
PavelBegunkov committed
            $lastExam = -1;
            $lastExtra = -1;
PavelBegunkov's avatar
PavelBegunkov committed
            $lastNilExam = -1;
            $lastNilExtra = -1;
			
			$curStudent['RateSemesterResult'] = 0;
PavelBegunkov's avatar
PavelBegunkov committed

            foreach($rate as $r) {
PavelBegunkov's avatar
PavelBegunkov committed
                
				if (($r['ModuleType'] == 'exam') or ($r['ModuleType'] == 'extra')) {
					$curStudent['Rates'][$i_r] = array();
					$curStudent['Rates'][$i_r]['SubmoduleID'] = $r['SubmoduleID'];
					$curStudent['Rates'][$i_r]['Rate'] = $r['Rate'];
					$curStudent['Rates'][$i_r]['ModuleType'] = $r['ModuleType'];
				}
				
				switch ($r['ModuleType'])
				{
				case 'regular':
					$curStudent['RateSemesterResult'] += $r['Rate'];
					break;
				case 'exam':
					if (!is_null($r['Rate'])) {
						if ($lastExam >= 0) {
PavelBegunkov's avatar
PavelBegunkov committed
	    					$curStudent['Rates'][$lastExam]['Block'] = 'True';
	        			}
	        			$lastExam = $i_r;
					} else {
						if ($lastNilExam < 0) {
							$lastNilExam = $i_r;
						} else {
							$curStudent['Rates'][$i_r]['Block'] = 'True';
						}
					}
					break;
				case 'bonus':
					$curStudent['Bonus'] = $r['Rate'];
					break;
				case 'extra':
					if (!is_null($r['Rate'])) {
						if ($lastExtra >= 0) {
PavelBegunkov's avatar
PavelBegunkov committed
	    					$curStudent['Rates'][$lastExtra]['Block'] = 'True';
	        			}
	        			$lastExtra = $i_r;
PavelBegunkov's avatar
PavelBegunkov committed
	        			$curStudent['Rate'] += $r['Rate'];
					} else {
						if ($lastNilExtra < 0) {
							$lastNilExtra = $i_r;
						} else {
							$curStudent['Rates'][$i_r]['Block'] = 'True';
						}
PavelBegunkov's avatar
PavelBegunkov committed
					}
					break;
				default:
					throw HTTP_Exception::factory (500, "Некорректный тип модуля!");
				}
				
PavelBegunkov's avatar
PavelBegunkov committed
                $i_r++;
PavelBegunkov's avatar
PavelBegunkov committed

            $total = $total[0]['Num'];
            if (is_null($total)) $total = 0;
PavelBegunkov's avatar
PavelBegunkov committed
            
PavelBegunkov's avatar
PavelBegunkov committed
            if ($lastExam >= 0) {
PavelBegunkov's avatar
PavelBegunkov committed
        		$curStudent['RateResult'] += $curStudent['Rates'][$lastExam]['Rate'];
PavelBegunkov's avatar
PavelBegunkov committed
            }
PavelBegunkov's avatar
PavelBegunkov committed
            $curStudent['RateResult'] = $total;
Антон Шалимов's avatar
Антон Шалимов committed

RomanSteinberg's avatar
RomanSteinberg committed
            $bottomLimit = 0;
            $topLimit = ($disciplineInfo['ExamType'] == 'exam') ? 38 : 60;
PavelBegunkov's avatar
PavelBegunkov committed

            $max_extra_rate = 0;
RomanSteinberg's avatar
RomanSteinberg committed
            if ($curStudent['RateSemesterResult'] >= $bottomLimit && 
            	$curStudent['RateSemesterResult'] < $topLimit) // студент задолженик
PavelBegunkov's avatar
PavelBegunkov committed
            {
            	$max_extra_rate = $topLimit - $curStudent['RateSemesterResult'];
PavelBegunkov's avatar
PavelBegunkov committed
        	}
PavelBegunkov's avatar
PavelBegunkov committed
        	if ($lastExtra >= 0) {
	            $curStudent['Rates'][$lastExtra]['MaxRate'] = $max_extra_rate;
PavelBegunkov's avatar
PavelBegunkov committed
            } 
            if ($lastNilExtra >= 0) {
    			$curStudent['Rates'][$lastNilExtra]['MaxRate'] = $max_extra_rate;
PavelBegunkov's avatar
PavelBegunkov committed
        	}
PavelBegunkov's avatar
PavelBegunkov committed

PavelBegunkov's avatar
PavelBegunkov committed
            $rateHandled[$i_g]['Students'][$i_s] = $curStudent;
PavelBegunkov's avatar
PavelBegunkov committed
            $i_s++;
        $twig->rateTable = $rateHandled;
        $twig->groups = $groupsHandled;

RomanSteinberg's avatar
RomanSteinberg committed
        $twig->disciplineInfo = $disciplineInfo;
Антон Шалимов's avatar
Антон Шалимов committed

Антон Шалимов's avatar
Антон Шалимов committed
        $this->response->body($twig);
    }