diff --git a/db/migrations/stored/R__functions.sql b/db/migrations/stored/R__functions.sql index 85b866306b9b8c493b7c3cc4b6f896eae05e4d86..e5230b72ce0a80e7a1184de8d243e9f7dd28e9f2 100644 --- a/db/migrations/stored/R__functions.sql +++ b/db/migrations/stored/R__functions.sql @@ -162,33 +162,36 @@ DROP FUNCTION IF EXISTS CreateGroup// CREATE FUNCTION CreateGroup ( pGradeID INT, pGroupNum INT, - pSpecializationID INT, - pGroupName VARCHAR(50) CHARSET utf8, + pSpecName VARCHAR(200) CHARSET utf8, + pFacultyID INT, pYear INT ) RETURNS int(11) # group id NO SQL BEGIN - DECLARE vGroupID, vFacultyID, vGroupYear, vIsSpecMatch INT DEFAULT -1; + DECLARE vGroupID, vSpecId, vGroupYear, vIsSpecMatch INT DEFAULT -1; DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1; - SET vFacultyID = (SELECT FacultyID FROM specializations WHERE specializations.ID = pSpecializationID LIMIT 1); + # create specialization + INSERT INTO specializations (Name, Abbr, FacultyID) VALUES (pSpecName, NULL, pFacultyID) + ON DUPLICATE KEY UPDATE + specializations.ID = LAST_INSERT_ID(specializations.ID); + SET vSpecId = LAST_INSERT_ID(); - # create discipline - INSERT INTO study_groups (GradeID, GroupNum, FacultyID) VALUES (pGradeID, pGroupNum, vFacultyID) + # create group + INSERT INTO study_groups (GradeID, GroupNum, FacultyID) VALUES (pGradeID, pGroupNum, pFacultyID) ON DUPLICATE KEY UPDATE study_groups.ID = LAST_INSERT_ID(study_groups.ID); SET vGroupID = LAST_INSERT_ID(); - SELECT groups_years.GroupID, (groups_years.SpecializationID = pSpecializationID AND - (pGroupName IS NULL OR groups_years.Name <=> pGroupName)) + SELECT groups_years.GroupID, groups_years.SpecializationID = vSpecId INTO vGroupYear, vIsSpecMatch FROM groups_years WHERE groups_years.GroupID = vGroupID AND groups_years.Year = pYear LIMIT 1; IF vGroupYear = -1 THEN - INSERT INTO groups_years (GroupID, Year, SpecializationID, Name) - VALUES (vGroupID, pYear, pSpecializationID, pGroupName); + INSERT INTO groups_years (GroupID, Year, SpecializationID) + VALUES (vGroupID, pYear, vSpecId); ELSEIF NOT vIsSpecMatch THEN RETURN -1; END IF; @@ -719,18 +722,12 @@ CREATE FUNCTION CreateStudentEx ( ) RETURNS int(11) NO SQL BEGIN - DECLARE vAccountID, vGradeID, vSpecID, vGroupID, vYear INT DEFAULT -1; + DECLARE vGradeID, vGroupID, vYear INT DEFAULT -1; DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1; - # get specialization id - INSERT INTO specializations (Name, Abbr, FacultyID) VALUES (pSpecName, NULL, pFacultyID) - ON DUPLICATE KEY UPDATE - specializations.ID = LAST_INSERT_ID(specializations.ID); - SET vSpecID = LAST_INSERT_ID(); - SET vYear = COALESCE((SELECT Year FROM semesters WHERE semesters.ID = pSemesterID LIMIT 1), -1); SET vGradeID = CreateGrade(pGradeNum, pDegree); - SET vGroupID = CreateGroup(vGradeID, pGroupNum, vSpecID, NULL, vYear); + SET vGroupID = CreateGroup(vGradeID, pGroupNum, pSpecName, pFacultyID, vYear); RETURN CreateStudent(pLastName, pFirstName, pSecondName, vGroupID, pActivationCode, pSemesterID); END // diff --git a/~dev_rating/application/classes/Controller/Api/V0/Student.php b/~dev_rating/application/classes/Controller/Api/V0/Student.php index 29e32c19d9fd2aff0ef530ba538428ee66abb9ba..59fedd5837036db1038f1bdeda2ae17943d2c1d6 100644 --- a/~dev_rating/application/classes/Controller/Api/V0/Student.php +++ b/~dev_rating/application/classes/Controller/Api/V0/Student.php @@ -167,7 +167,14 @@ class Controller_Api_V0_Student extends Controller_Handler_Api { throw new InvalidArgumentException('RecordBook: grade not found'); } - $group = Model_Group::find($gradeID, $recordBookData->group, $recordBookData->facultyID); + $speciality = $recordBookData->speciality; + if (strpos($speciality, ' - ') == 8) { + $speciality = substr($speciality, 11); + } + + $year = Model_Plan::load($recordBookData->planID)->Year; + + $group = Model_Group::findOrCreate($gradeID, $recordBookData->group, $speciality, $recordBookData->facultyID, $year); if (is_null($group)) { throw new InvalidArgumentException('RecordBook: group not found'); } diff --git a/~dev_rating/application/classes/Model/Group.php b/~dev_rating/application/classes/Model/Group.php index f4c759360b5649b297d60e815dd6a724f01baf38..e7d65539e0eeb9f805bfa326d4af221752350f51 100644 --- a/~dev_rating/application/classes/Model/Group.php +++ b/~dev_rating/application/classes/Model/Group.php @@ -14,12 +14,14 @@ class Model_Group extends Model return $g; } - public static function find($gradeID, $groupNum, $facultyID) { - $sql = 'SELECT `FindGroup`(:gradeID, :groupNum, :facultyID) AS `ID`'; + public static function findOrCreate($gradeID, $groupNum, $specialization, $facultyID, $year) { + $sql = 'SELECT `CreateGroup`(:gradeID, :groupNum, :specialization, :facultyID, :year) AS `ID`'; $id = DB::query(Database::SELECT, $sql) ->param(':gradeID', $gradeID) ->param(':groupNum', $groupNum) + ->param(':specialization', $specialization) ->param(':facultyID', $facultyID) + ->param(':year', $year) ->execute()->get('ID'); if ($id <= 0) { return null;