diff --git a/db/migrations/stored/R__functions.sql b/db/migrations/stored/R__functions.sql index 5bfd45a42aa94c7f0782aebf1a51737f7242e51a..6b016bf2dd82cee2fd155b105f32eb68da5a802f 100644 --- a/db/migrations/stored/R__functions.sql +++ b/db/migrations/stored/R__functions.sql @@ -991,6 +991,48 @@ READS SQL DATA RETURN pID; END // +-- Обновление данных дисциплины при синхронизации +DROP FUNCTION IF EXISTS Discipline_Update// +CREATE FUNCTION Discipline_Update ( + pDisciplineID INT, + pTeacherID INT, + pGradeID INT, + pSubjectID INT, + pExamType enum('exam', 'credit', 'grading_credit'), + pLectureCount INT, + pPracticeCount INT, + pLabCount INT, + pFacultyID INT, + pSemesterID INT, + pSubtype enum('scientific_coursework', 'disciplinary_coursework') +) RETURNS int(11) +NO SQL +BEGIN + DECLARE vDisciplineID INT DEFAULT -1; + DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1; + + IF pSubtype IS NOT NULL THEN + SET pSubjectID = 346; + END IF; + + # create discipline + UPDATE `disciplines` + SET disciplines.AuthorID = COALESCE(pTeacherID, disciplines.AuthorID), + disciplines.GradeID = COALESCE(pGradeID, disciplines.GradeID), + disciplines.SubjectID = COALESCE(pSubjectID, disciplines.SubjectID), + disciplines.ExamType = COALESCE(pExamType, disciplines.ExamType), + disciplines.LectureCount = COALESCE(pLectureCount, disciplines.LectureCount), + disciplines.PracticeCount = COALESCE(pPracticeCount, disciplines.PracticeCount), + disciplines.LabCount = COALESCE(pLabCount, disciplines.LabCount), + disciplines.SemesterID = COALESCE(pSemesterID, disciplines.SemesterID), + disciplines.FacultyID = COALESCE(pFacultyID, disciplines.FacultyID), + disciplines.Subtype = COALESCE(pSubtype, disciplines.Subtype) + WHERE disciplines.ID = pDisciplineID; + + RETURN 0; +END // + + DROP FUNCTION IF EXISTS ChangeDisciplineSubjectUnsafe// CREATE FUNCTION ChangeDisciplineSubjectUnsafe ( pDisciplineID INT, diff --git a/db/migrations/stored/R__procedures.sql b/db/migrations/stored/R__procedures.sql index 4e5c5ae4b50d7d23a7b81bc8c7e4e546e472ce08..746ce0303967be58bbbf6dcd08d080ab8fda28d0 100644 --- a/db/migrations/stored/R__procedures.sql +++ b/db/migrations/stored/R__procedures.sql @@ -800,6 +800,24 @@ BEGIN view_disciplines_recordbooks.Type <=> 'attach'; END // +DELIMITER // +DROP PROCEDURE IF EXISTS Discipline_Find// +CREATE PROCEDURE Discipline_Find ( + IN pFacultyID INT, + IN pSemesterID INT, + IN pSubjectID INT, + IN pExamType enum('exam', 'credit', 'grading_credit') +) +READS SQL DATA +BEGIN + SELECT disciplines.ID + FROM `disciplines` + WHERE disciplines.FacultyID = pFacultyID AND + disciplines.SemesterID = pSemesterID AND + disciplines.SubjectID = pSubjectID AND + disciplines.ExamType = pExamType; +END // + # ------------------------------------------------------------------------------------------- # Label: rating # ------------------------------------------------------------------------------------------- diff --git a/~dev_rating/application/classes/Controller/Api/V0/StudyPlan.php b/~dev_rating/application/classes/Controller/Api/V0/StudyPlan.php index 6b1af2b8df5fab63fc554e460335db81dbf1111a..9f96ac0d3438aad5abce92d683f9416904ef8c86 100644 --- a/~dev_rating/application/classes/Controller/Api/V0/StudyPlan.php +++ b/~dev_rating/application/classes/Controller/Api/V0/StudyPlan.php @@ -69,28 +69,28 @@ class Controller_Api_V0_StudyPlan extends Controller_Handler_Api private function processDisciplines($data, $semesterID, $facultyID) { $res = []; try { -// echo Debug::vars($data->disciplines); foreach ($data->disciplines as $discipline) { if ($discipline == null) continue; - if (isset($discipline->id)) { - // ToDo: update discipline - } else { - print_r($discipline); + $disciplineModel = null; + if (isset($discipline->subjectID)) { + $disciplineModel = Model_Discipline::find($facultyID, $semesterID, + $discipline->subjectID, $discipline->type); + } - $plan = Model_Plan::load($data->id); - $gradeID = $plan->GradeID; - $newDiscipline = Model_Discipline::make() + if ($disciplineModel !== null) { + $disciplineModel->update(); + } else { + $disciplineModel = Model_Discipline::make() ->author($discipline->teacherIDs[0]) - ->subject($discipline->SubjectID) + ->subject($discipline->subjectID) ->semester($semesterID) ->type($discipline->type) ->faculty($facultyID) - ->grade($gradeID) ->create(); - $res[] = $newDiscipline->ID; } + $res[] = $disciplineModel->ID; } } catch (InvalidArgumentException $e) { $this->badRequestError($this->makeErrorMsg($data, $e->getMessage())); @@ -114,6 +114,7 @@ class Controller_Api_V0_StudyPlan extends Controller_Handler_Api * @apiParam {Array} disciplines */ public function action_put_index() { + $res = []; try { if ($this->request->query('batch') !== NULL) { $data = json_decode($this->request->body()); @@ -123,23 +124,16 @@ class Controller_Api_V0_StudyPlan extends Controller_Handler_Api $requestInfo = array( 'Year' => $data->year, - 'SemesterID' => Model_Semesters::find($data->year, $data->semester), + 'SemesterID' => (int)Model_Semesters::find($data->year, $data->semester)->ID, 'FacultyID' => Model_Faculties::getIdByExternalID($data->faculty), ); - $res = []; foreach ($data->plans as $item) { $res[] = $this->processData($item, $requestInfo); - if (count($res) > 10) { - echo Debug::vars($res); exit; - } -// return $res; } } else { throw new InvalidArgumentException('No batch data received!'); -// $data = $this->request->query(); -// $res[] = $this->processData($data); } } catch (Exception $e) { $this->badRequestError($e->getMessage()); diff --git a/~dev_rating/application/classes/Model/Discipline.php b/~dev_rating/application/classes/Model/Discipline.php index 6c0cedafdbd76f27f5790adecd9c9951f50825e3..7b28a515d9000c71f40b54accc75dabe2d458233 100644 --- a/~dev_rating/application/classes/Model/Discipline.php +++ b/~dev_rating/application/classes/Model/Discipline.php @@ -195,4 +195,32 @@ class Model_Discipline extends Model_Container ])->execute(); } + public static function find($facultyID, $semesterID, $subjectID, $type) { + $sql = 'CALL `Discipline_Find`(:facultyID, :semesterID, :subjectID, :type)'; + $data = DB::query(Database::SELECT, $sql) + ->parameters([ + ':facultyID' => $facultyID, + ':semesterID' => $semesterID, + ':subjectID' => $subjectID, + ':type' => $type, + ])->execute(); + $cnt = count($data); + if ($cnt > 1) { + throw new Database_Exception('There are '.$cnt.' disciplines were found, but only one was expected!'); + } + elseif ($cnt == 1) { + return Model_Discipline::load($data[0]['ID']); + } + + return null; + } + + public function update() { + $sql = 'SELECT `Discipline_Update` (ID, AuthorID, GradeID, SubjectID, Type, Lectures, Practice, + Labs, FacultyID, SemesterID, Subtype) AS `Success`'; + $res = DB::query(Database::SELECT, $sql) + ->parameters($this->getRawData($this->ID)) + ->execute(); + return $res['Success']; + } }