From db7549d68128ea2267e65d2449113f4d10e40323 Mon Sep 17 00:00:00 2001
From: Roman Steinberg <roman.accs@gmail.com>
Date: Sat, 7 Oct 2017 19:52:30 +0300
Subject: [PATCH] ADD: update discipline while synchronization

---
 db/migrations/stored/R__functions.sql         | 42 +++++++++++++++++++
 db/migrations/stored/R__procedures.sql        | 18 ++++++++
 .../classes/Controller/Api/V0/StudyPlan.php   | 32 ++++++--------
 .../application/classes/Model/Discipline.php  | 28 +++++++++++++
 4 files changed, 101 insertions(+), 19 deletions(-)

diff --git a/db/migrations/stored/R__functions.sql b/db/migrations/stored/R__functions.sql
index 5bfd45a42..6b016bf2d 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 4e5c5ae4b..746ce0303 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 6b1af2b8d..9f96ac0d3 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 6c0cedafd..7b28a515d 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'];
+    }
 }
-- 
GitLab