diff --git a/db/NewEmpty.sql b/db/NewEmpty.sql index bb1e08b9cf76c83e85c7e54163297785d18593a9..a43c222880cf980168920c74820e7076c66842cb 100644 --- a/db/NewEmpty.sql +++ b/db/NewEmpty.sql @@ -3,9 +3,9 @@ -- http://www.phpmyadmin.net -- -- РҐРѕСЃС‚: 127.0.0.1:3306 --- Время создания: РђРІРі 19 2014 Рі., 01:56 --- Версия сервера: 5.5.37-log --- Версия PHP: 5.3.28 +-- Время создания: РђРІРі 20 2014 Рі., 23:08 +-- Версия сервера: 5.5.38-log +-- Версия PHP: 5.4.29 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; @@ -17,8 +17,1573 @@ SET time_zone = "+00:00"; /*!40101 SET NAMES utf8 */; -- --- База данных: `Sample3` --- +-- База данных: `kohana` +-- + +DELIMITER $$ +-- +-- Процедуры +-- +CREATE DEFINER=`root`@`%` PROCEDURE `GetAccInfoByID`(IN `UserID` VARCHAR(50) CHARSET utf8 ) + NO SQL +BEGIN + SELECT accounts.ID, + accounts.`Login`, + accounts.`E-Mail`, + accounts.Type, + accounts.isEnabled, + ( accounts.ActivationCode IS NULL) AS 'isActivated', + accounts.UserAgent + FROM accounts + WHERE accounts.`ID` = UserID; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetCurSemesterInfo`( ) + NO SQL +BEGIN + SELECT semesters.ID, + semesters.Num, + semesters.Year + FROM `general_settings` + INNER JOIN `semesters` ON general_settings.Val = semesters.ID + WHERE general_settings.ID = 1; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetDisciplineInfoByID`(IN `DiscID` INT) + NO SQL +BEGIN + + SELECT disciplines.AuthorID, + disciplines.Grade AS 'DisciplineGrade', + disciplines.ExamType, + disciplines.Type AS 'LessonType', + disciplines.LectionCount, + disciplines.PracticeCount, + disciplines.SemesterID, + subjects.ID AS 'SubjectID', + subjects.Name AS 'SubjectName', + subjects.Abbr AS 'SubjectAbbr' + + + FROM `disciplines` + INNER JOIN `subjects` ON subjects.ID = disciplines.SubjectID + WHERE disciplines.ID = DiscID; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetDisciplinesForStudent`(IN `StudentID` INT) + NO SQL +BEGIN + DECLARE groupID, semID INT; + SELECT students.StudyGroupID INTO groupID FROM `students` WHERE students.ID = StudentID LIMIT 1; + SET semID = GetCurSemesterID(); + + SELECT DISTINCT disciplines.ID AS 'DisciplineID', + subjects.ID AS 'SubjectID', + subjects.Name AS 'SubjectName', + disciplines.ExamType, + GetRateForDisc(StudentID, `disciplines`.`ID` ) AS 'Rate', + GetMaxRateForDisc(StudentID, `disciplines`.`ID` ) AS 'MaxCurrentRate' + FROM `disciplines` + INNER JOIN `subjects` ON disciplines.SubjectID = subjects.ID + CROSS JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID + CROSS JOIN `lessons` ON lessons.DisciplineTeacherID = disciplines_teachers.ID + INNER JOIN `attending_groups` ON attending_groups.ID = lessons.AttendingGroupID AND + attending_groups.SemesterID = semID + LEFT JOIN `attending_groups_bases` ON attending_groups_bases.AttendingGroupID = attending_groups.ID AND + attending_groups_bases.StudyGroupID = groupID + LEFT JOIN `attending_groups_pool` ON attending_groups_pool.AttendingGroupID = attending_groups.ID AND + attending_groups_pool.StudentID = StudentID + WHERE disciplines.SemesterID = semID AND + attending_groups.SemesterID = semID AND + ( attending_groups_pool.Type = 'attach' OR + ( (attending_groups_pool.Type is NULL OR attending_groups_pool.Type != 'detach') AND + attending_groups_bases.StudyGroupID IS NOT NULL AND + attending_groups_bases.StudyGroupID = groupID + ) + ) + ORDER BY disciplines.ExamType ASC, Rate DESC; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetDisciplinesForTeacher`(IN `TeacherID` INT) + NO SQL +BEGIN + DECLARE groupID, semID INT; + SET semID = GetCurSemesterID(); + + SELECT DISTINCT disciplines.ID AS 'DisciplineID', + disciplines.ExamType AS 'DisciplineType', + subjects.ID AS 'SubjectID', + subjects.Name AS 'SubjectName', + disciplines_teachers.ID AS 'DisciplineTeacherID', + study_groups.ID AS 'StudyGroupID', + study_groups.GroupNum AS 'StudyGroupNum', + study_groups.Grade AS 'StudyGroupGrade', + study_groups.Name AS 'StudyGroupName' + FROM `disciplines_teachers` + INNER JOIN `disciplines` ON disciplines.ID = disciplines_teachers.DisciplineID + INNER JOIN `subjects` ON subjects.ID = disciplines.SubjectID + CROSS JOIN `lessons` ON lessons.DisciplineTeacherID = disciplines_teachers.ID + INNER JOIN `attending_groups` ON attending_groups.ID = lessons.AttendingGroupID + CROSS JOIN `attending_groups_bases` ON attending_groups_bases.AttendingGroupID = attending_groups.ID + INNER JOIN `study_groups` ON study_groups.ID = attending_groups_bases.StudyGroupID + WHERE disciplines_teachers.TeacherID = TeacherID AND + disciplines.SemesterID = semID +ORDER BY subjects.ID ASC, + disciplines.ID ASC, + study_groups.Grade ASC, + study_groups.GroupNum ASC; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetFirstRequests`( IN `CountN` INT ) + NO SQL +BEGIN + DECLARE allNum, countClone INT; + SELECT COUNT(requests.ID) INTO allNum FROM `requests`; + SET countClone = CountN; + IF CountN = -1 THEN + SET countClone = allNum; + END IF; + + SELECT requests.ID, + requests.AccountID, + requests.Information, + requests.Date, + requests.Status + FROM `requests` + WHERE requests.Status = 0 + LIMIT countClone; + +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetLastRequests`( IN `CountN` INT ) + NO SQL +BEGIN + DECLARE offsetN, allNum, countClone INT; + SELECT COUNT(requests.ID) INTO allNum FROM `requests`; + SET countClone = CountN; + IF CountN = -1 THEN + SET countClone = allNum; + END IF; + + SET offsetN = allNum - CountN; + IF offsetN < 0 THEN + SET offsetN = 0; + END IF; + + SELECT requests.ID, + requests.AccountID, + requests.Information, + requests.Date, + requests.Status + FROM `requests` + WHERE requests.Status = 0 + LIMIT countClone OFFSET offsetN; + +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetMapForDiscipline`( IN `TeacherID` INT, + IN `DisciplineID` INT ) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT disciplines_teachers.ID + INTO checker + FROM `disciplines_teachers` + WHERE disciplines_teachers.DisciplineID = DisciplineID AND + disciplines_teachers.TeacherID = TeacherID + LIMIT 1; + + IF checker > 0 THEN + SELECT subjects.ID AS 'SubjectID', + subjects.Name AS 'SubjectName', + modules.ID AS 'ModuleID', + modules.Name AS 'ModuleName', + submodules.ID AS 'SubmoduleID', + submodules.Name AS 'SubModuleName', + submodules.Description AS 'SubmoduleDescription', + submodules.MaxRate, + submodules.Type AS 'SubmoduleControl' + FROM `disciplines` + INNER JOIN `subjects` ON disciplines.SubjectID = subjects.ID + CROSS JOIN `modules` ON modules.DisciplineID = disciplines.ID + CROSS JOIN `submodules` ON submodules.ModuleID = modules.ID + WHERE disciplines.ID = DisciplineID + ORDER BY modules.OrderNum ASC, + submodules.OrderNum ASC; + ELSE + SELECT NULL AS 'SubjectID', + NULL AS 'SubjectName', + NULL AS 'ModuleID', + NULL AS 'ModuleName', + NULL AS 'SubmoduleID', + NULL AS 'SubModuleName', + NULL AS 'SubmoduleDescription', + NULL AS 'MaxRate' + LIMIT 0; + END IF; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetMapsForTeacher`(IN `TeacherID` INT) + NO SQL +BEGIN + DECLARE semID INT; + SET semID = GetCurSemesterID(); + + SELECT subjects.ID AS 'SubjectID', + subjects.Name AS 'SubjectName', + modules.ID AS 'ModuleID', + modules.Name AS 'ModuleName', + submodules.ID AS 'SubmoduleID', + submodules.Name AS 'SubModuleName', + submodules.Description AS 'SubmoduleDescription', + submodules.MaxRate AS 'MaxRate', + submodules.Type AS 'SubmoduleControl' + FROM `disciplines_teachers` + INNER JOIN `disciplines` ON disciplines_teachers.DisciplineID = disciplines.ID + INNER JOIN `subjects` ON disciplines.SubjectID = subjects.ID + CROSS JOIN `modules` ON modules.DisciplineID = disciplines.ID + CROSS JOIN `submodules` ON submodules.ModuleID = modules.ID + WHERE disciplines_teachers.TeacherID = TeacherID AND disciplines.SemesterID = semID + ORDER BY modules.OrderNum ASC, + submodules.OrderNum ASC; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetPersonalInfoByID`(IN `UserID` INT ) + NO SQL +BEGIN + DECLARE varType INT; + SELECT accounts.Type FROM accounts WHERE accounts.ID = UserID LIMIT 1 INTO varType; + IF varType = 1 THEN + + SELECT students.ID AS 'StudentID', + students.LastName, + students.FirstName, + students.SecondName, + study_groups.ID AS 'StudyGroupID', + study_groups.Grade AS 'Grade', + study_groups.GroupNum AS 'Group', + study_groups.Name AS 'StudyGroupName', + specializations.ID AS 'SpecID', + specializations.Name AS 'SpecName', + specializations.Abbr AS 'SpecAbbr', + faculties.ID AS 'FacultyID', + faculties.Name AS 'FacultyName', + faculties.Abbr AS 'FacultyAbbreviation' + FROM `students` + INNER JOIN study_groups ON students.StudyGroupID = study_groups.ID + INNER JOIN faculties ON study_groups.FacultyID = faculties.ID + INNER JOIN specializations ON study_groups.SpecializationID = specializations.ID + WHERE students.AccountID = UserID; + + ELSE + SELECT teachers.ID AS 'TeacherID', + teachers.LastName, + teachers.FirstName, + teachers.SecondName, + degrees.Name AS 'Degree', + departments.ID AS 'DepartmentID', + departments.Name AS 'DepartmentName', + faculties.ID AS 'FacultyID', + faculties.Name AS 'FacultyName', + faculties.Abbr AS 'FacultyAbbreviation' + FROM `teachers` + INNER JOIN `departments` ON departments.ID = teachers.DepartmentID + INNER JOIN `faculties` ON departments.FacultyID = faculties.ID + INNER JOIN `degrees` ON degrees.ID = teachers.DegreeID + WHERE teachers.AccountID = UserID; + + END IF; + +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetStudentsByStudyGroups`( IN `StudyGroupID` INT ) + NO SQL +BEGIN + SELECT students.ID AS 'StudentID', + students.LastName, + students.FirstName, + students.SecondName + FROM `students` + WHERE students.StudyGroupID = StudyGroupID; + +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetStudentsForDiscipline`(IN `TeacherID` INT, + IN `DisciplineID` INT ) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT disciplines_teachers.ID + INTO checker + FROM `disciplines_teachers` + WHERE disciplines_teachers.DisciplineID = DisciplineID AND + disciplines_teachers.TeacherID = TeacherID + LIMIT 1; + + IF checker > 0 THEN + SELECT DISTINCT students.ID AS 'StudentID', + students.LastName, + students.FirstName, + students.SecondName, + study_groups.Grade, + study_groups.GroupNum, + (attending_groups_pool.StudentID IS NOT NULL) AS 'isAttached' + + FROM `disciplines_teachers` + INNER JOIN `disciplines` ON disciplines.ID = disciplines_teachers.DisciplineID + CROSS JOIN `lessons` ON lessons.DisciplineTeacherID = disciplines_teachers.ID + INNER JOIN `attending_groups` ON attending_groups.ID = lessons.AttendingGroupID + CROSS JOIN `students` ON InternalOccurrenceChecker(students.ID, attending_groups.ID) = TRUE + LEFT JOIN `attending_groups_pool` ON attending_groups_pool.AttendingGroupID = attending_groups.ID AND attending_groups_pool.StudentID = students.ID + INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID + WHERE disciplines_teachers.TeacherID = TeacherID AND + disciplines_teachers.DisciplineID = DisciplineID + ORDER BY study_groups.Grade ASC, + study_groups.GroupNum ASC, + students.LastName ASC, + students.FirstName ASC, + students.SecondName ASC; + ELSE + SELECT NULL AS 'StudentID', + NULL AS 'LastName', + NULL AS 'FirstName', + NULL AS 'SecondName', + NULL AS 'Grade', + NULL AS 'Group' + LIMIT 0; + + END IF; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetStudyGroups`( IN `Grade` INT, + IN `FacultyID` INT ) + NO SQL +BEGIN + SELECT study_groups.ID, + study_groups.GroupNum, + specializations.ID AS 'SpecID', + specializations.Name AS 'SpecName', + specializations.Abbr AS 'SpecAbbr' + FROM `study_groups` + INNER JOIN `specializations` ON specializations.ID = study_groups.SpecializationID + WHERE study_groups.Grade = Grade AND study_groups.FacultyID = FacultyID; + +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetSubjectList`( ) + NO SQL +BEGIN + SELECT subjects.ID, + subjects.Name, + subjects.Abbr + FROM `subjects` + ORDER BY subjects.Name ASC; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetSubjectMapForStudent`(IN `StudentID` INT, IN `SubjectID` INT) +BEGIN + DECLARE groupID, semID INT; + SELECT students.StudyGroupID INTO groupID FROM `students` WHERE students.ID = StudentID LIMIT 1; + SET semID = GetCurSemesterID(); + + SELECT modules.ID AS 'ModuleID', + modules.Name AS 'ModuleName', + submodules.ID AS 'SubmoduleID', + submodules.Name AS 'SubModuleName', + submodules.Description AS 'SubmoduleDescription', + submodules.MaxRate, + submodules.Type AS 'SubmoduleControl', + rating_table.Rate, + rating_table.Date + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + LEFT JOIN `rating_table` ON submodules.ID = rating_table.SubModuleID AND rating_table.StudentID = StudentID + WHERE modules.DisciplineID IN + ( SELECT DISTINCT disciplines.ID + FROM `disciplines` + CROSS JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID + CROSS JOIN `lessons` ON lessons.DisciplineTeacherID = disciplines_teachers.ID + INNER JOIN `attending_groups` ON attending_groups.ID = lessons.AttendingGroupID AND + attending_groups.SemesterID = semID + LEFT JOIN `attending_groups_bases` ON attending_groups_bases.AttendingGroupID = attending_groups.ID AND + attending_groups_bases.StudyGroupID = groupID + LEFT JOIN `attending_groups_pool` ON attending_groups_pool.AttendingGroupID = attending_groups.ID AND + attending_groups_pool.StudentID = StudentID + WHERE disciplines.SubjectID = SubjectID AND + disciplines.SemesterID = semID AND + attending_groups.SemesterID = semID AND + ( attending_groups_pool.Type = 'attach' OR + ( (attending_groups_pool.Type is NULL OR attending_groups_pool.Type != 'detach') AND + attending_groups_bases.StudyGroupID IS NOT NULL AND + attending_groups_bases.StudyGroupID = groupID + ) + ) + ) + ORDER BY modules.OrderNum ASC, submodules.OrderNum ASC; +END$$ + +CREATE DEFINER=`root`@`%` PROCEDURE `GetTeachersForDiscipline`(IN `DiscID` INT) + NO SQL +BEGIN + + SELECT teachers.ID AS 'TeacherID', + teachers.LastName, + teachers.FirstName, + teachers.SecondName, + degrees.ID AS 'DegreeID', + degrees.Name AS 'Degree', + departments.ID AS 'DepartmentID', + departments.Name AS 'DepartmentName', + faculties.ID AS 'FacultyID', + faculties.Name AS 'FacultyName', + faculties.Abbr AS 'FacultyAbbreviation' + FROM `disciplines_teachers` + INNER JOIN `teachers` ON teachers.ID = disciplines_teachers.TeacherID + INNER JOIN `departments` ON departments.ID = teachers.DepartmentID + INNER JOIN `faculties` ON departments.FacultyID = faculties.ID + INNER JOIN `degrees` ON degrees.ID = teachers.DegreeID + WHERE disciplines_teachers.DisciplineID = DiscID; +END$$ + +-- +-- Функции +-- +CREATE DEFINER=`root`@`%` FUNCTION `ActivateAccount`(`Code` VARCHAR(40) CHARSET utf8, `Login` VARCHAR(50) CHARSET utf8, `Mail` VARCHAR(32) CHARSET utf8, `Password` VARCHAR(255) CHARSET utf8) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + DECLARE UserID INT; + SELECT COUNT(accounts.ID) INTO checker FROM accounts WHERE accounts.ActivationCode = Code; + IF ( Password IS NULL ) THEN + return -2; + END IF; + + IF checker = 1 THEN + SELECT accounts.ID + INTO UserID + FROM `accounts` + WHERE accounts.ActivationCode = Code; + + UPDATE `accounts` + SET accounts.Login = Login , + accounts.Password = Password , + accounts.`E-Mail` = Mail , + accounts.ActivationCode = NULL + WHERE accounts.ID = UserID ; + + RETURN UserID; + ELSE + RETURN -1; + END IF; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `AddDiscipline`( `TeacherID` INT, + `Grade` INT, + `SubjectID` INT, + `ExamType` VARCHAR(30), + `LectionCount` INT, + `PracticeCount` INT + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE semID, checker INT; + SET semID = GetCurSemesterID(); + + + INSERT INTO `disciplines` ( disciplines.AuthorID, + disciplines.Grade, + disciplines.SubjectID, + disciplines.ExamType, + disciplines.LectionCount, + disciplines.PracticeCount, + disciplines.SemesterID ) + VALUES ( TeacherID, Grade, SubjectID, ExamType, LectionCount, PracticeCount, semID ); + + -- RETURN ( SELECT disciplines.ID + -- FROM `disciplines` + -- WHERE disciplines.AuthorID = TeacherID AND + -- disciplines.SubjectID = SubjectID AND + -- disciplines.Grade = Grade + -- ORDER BY disciplines.ID DESC + -- LIMIT 1 + -- ); + SET checker = LAST_INSERT_ID(); + + + INSERT INTO `disciplines_teachers` + ( disciplines_teachers.DisciplineID, + disciplines_teachers.TeacherID ) + VALUES ( checker, TeacherID ); + + RETURN checker; + + +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `AddModule`( `TeacherID` INT, + `DisciplineID` INT, + `OrderNum` INT, + `Name` VARCHAR(50) ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT disciplines.ID + INTO checker + FROM `disciplines` + INNER JOIN `disciplines_teachers` ON disciplines_teachers.TeacherID = TeacherID AND disciplines_teachers.DisciplineID = disciplines.ID + WHERE disciplines.ID = DisciplineID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + SET checker = -1; + SELECT modules.ID + INTO checker + FROM `modules` + WHERE modules.DisciplineID = DisciplineID AND modules.OrderNum = OrderNum; + IF checker > 0 THEN + RETURN -2; + END IF; + + + INSERT INTO `modules` ( modules.Name, modules.OrderNum, modules.DisciplineID ) + VALUES ( Name , OrderNum , DisciplineID ); + + + RETURN ( SELECT modules.ID + FROM `modules` + WHERE modules.DisciplineID = DisciplineID AND + modules.OrderNum = OrderNum + ); + + +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `AddSubmodule`( `TeacherID` INT, + `ModuleID` INT, + `MaxRate` INT, + `OrderNum` INT, + `Name` VARCHAR(50), + `Description` VARCHAR(200), + `ControlType` VARCHAR(30) + + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT modules.ID + INTO checker + FROM `modules` + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.TeacherID = TeacherID AND disciplines_teachers.DisciplineID = disciplines.ID + WHERE modules.ID = ModuleID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + SET checker = -1; + SELECT submodules.ID + INTO checker + FROM `submodules` + WHERE submodules.ModuleID = ModuleID AND submodules.OrderNum = OrderNum + LIMIT 1; + IF checker > 0 THEN + RETURN -1; + END IF; + + INSERT INTO `submodules` ( submodules.ModuleID, submodules.MaxRate, submodules.OrderNum, submodules.Name, submodules.Description, submodules.Type ) + VALUES ( ModuleID, MaxRate, OrderNum, Name, Description, ControlType); + + RETURN ( SELECT submodules.ID + FROM `submodules` + WHERE submodules.ModuleID = ModuleID AND + submodules.OrderNum = OrderNum + ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `BindTeacher`( `BindingTeacher` INT, + `DisciplineID` INT + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SET checker = -1; + SELECT disciplines_teachers.ID + INTO checker + FROM `disciplines` + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = BindingTeacher + WHERE disciplines.ID = DisciplineID + LIMIT 1; + IF checker > 0 THEN + RETURN 0; + END IF; + + INSERT INTO `disciplines_teachers` + ( disciplines_teachers.DisciplineID, + disciplines_teachers.TeacherID ) + VALUES ( DisciplineID, BindingTeacher ); + RETURN 0; + +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeDiscipline`( `TeacherID` INT, + `DisciplineID` INT, + `ExamType` VARCHAR(30), + `LectionCount` INT, + `PracticeCount` INT, + `Grade` INT, + `SubjectID` INT + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT disciplines_teachers.ID + INTO checker + FROM `disciplines_teachers` + WHERE disciplines_teachers.DisciplineID = DisciplineID AND disciplines_teachers.TeacherID = TeacherID + LIMIT 1; + + IF checker IS NULL OR checker <=0 THEN + RETURN -1; + END IF; + + SET checker = -1; + SELECT rating_table.ID + INTO checker + FROM `rating_table` + INNER JOIN `submodules` ON submodules.ID = rating_table.SubmoduleID + INNER JOIN `modules` ON modules.ID = submodules.ModuleID + WHERE modules.DisciplineID = DisciplineID + LIMIT 1; + IF checker > 0 THEN + RETURN -1; + END IF; + + + UPDATE `disciplines` + SET disciplines.ExamType = ExamType, + disciplines.LectionCount = LectionCount, + disciplines.PracticeCount = PracticeCount, + disciplines.Grade = Grade, + disciplines.SubjectID = SubjectID + WHERE disciplines.ID = DisciplineID; + + RETURN 0; + +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeLogin`(`UserID` INT, `Login` VARCHAR(50) CHARSET utf8) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SET checker = ( SELECT COUNT(accounts.ID) FROM accounts WHERE accounts.ID = UserID ); + IF checker != 1 THEN + RETURN -1; + END IF; + + SET checker = -1; + SELECT accounts.ID + INTO checker + FROM accounts + WHERE accounts.Login = Login + LIMIT 1; + IF checker > 0 THEN + RETURN -1; + END IF; + + UPDATE accounts + SET accounts.Login = Login + WHERE ID = UserID; + + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeMail`(`UserID` INT, `mailN` VARCHAR(32) CHARSET utf8) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + SET checker = ( SELECT COUNT(accounts.ID) FROM accounts WHERE accounts.ID = UserID ); + IF checker != 1 THEN + RETURN -1; + END IF; + + SET checker = -1; + SELECT accounts.ID + INTO checker + FROM accounts + WHERE accounts.`E-Mail` = mailN + LIMIT 1; + IF checker > 0 THEN + RETURN -1; + END IF; + + + UPDATE accounts + SET accounts.`E-Mail` = mailN + WHERE ID = UserID; + + RETURN 0; + +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeModule`( `TeacherID` INT, + `ModuleID` INT, + `OrderNum` INT, + `Name` VARCHAR(50) ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT disciplines.ID + INTO checker + FROM `modules` + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE modules.ID = ModuleID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + SET checker = -1; + SELECT modules.ID + INTO checker + FROM `modules` + WHERE modules.DisciplineID = checker AND modules.OrderNum = OrderNum; + IF checker > 0 THEN + RETURN -1; + END IF; + + UPDATE `modules` + SET modules.OrderNum = OrderNum, + modules.Name = Name + WHERE modules.ID = ModuleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeModuleName`( `TeacherID` INT, + `ModuleID` INT, + `Name` VARCHAR(50) + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT modules.ID + INTO checker + FROM `modules` + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE modules.ID = ModuleID + LIMIT 1; + + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + UPDATE `modules` + SET modules.Name = Name + WHERE modules.ID = ModuleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeModuleOrder`( `TeacherID` INT, + `ModuleID` INT, + `OrderNum` INT + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT disciplines.ID + INTO checker + FROM `modules` + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE modules.ID = ModuleID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + SET checker = -1; + SELECT modules.ID + INTO checker + FROM `modules` + WHERE modules.DisciplineID = checker AND modules.OrderNum = OrderNum; + IF checker > 0 THEN + RETURN -1; + END IF; + + UPDATE `modules` + SET modules.OrderNum = OrderNum + WHERE modules.ID = ModuleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangePassword`(`UserID` INT, `Password` VARCHAR(255) CHARSET utf8) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + SET checker = ( SELECT COUNT(accounts.ID) FROM accounts WHERE accounts.ID = UserID ); + + IF checker = 1 THEN + UPDATE accounts + SET accounts.Password = Password + WHERE ID = UserID; + + RETURN 0; + ELSE + RETURN -1; + END IF; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeStudentRate`( `TeacherID` INT, + `StudentID` INT, + `SubmoduleID` INT, + `Rate` INT ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker, discID, OldVal, accID, groupID, rateID, semID INT; + SET discID = -1; + SET groupID = -1; + + SELECT disciplines.ID + INTO discID + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + + SELECT disciplines.ID + INTO checker + FROM `disciplines` + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND + disciplines_teachers.TeacherID = TeacherID + WHERE disciplines.ID = discID + LIMIT 1; + + + IF checker > 0 THEN + SELECT rating_table.ID + INTO rateID + FROM `rating_table` + WHERE rating_table.SubmoduleID = SubmoduleID AND + rating_table.TeacherID = TeacherID AND + rating_table.StudentID = StudentID + LIMIT 1; + + IF checker > 0 THEN + SELECT students.StudyGroupID INTO groupID FROM `students` WHERE students.ID = StudentID LIMIT 1; + SET semID = GetCurSemesterID(); + + SELECT disciplines.ID INTO checker + FROM `disciplines` + CROSS JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID + CROSS JOIN `lessons` ON lessons.DisciplineTeacherID = disciplines_teachers.ID + INNER JOIN `attending_groups` ON attending_groups.ID = lessons.AttendingGroupID AND + attending_groups.SemesterID = semID + LEFT JOIN `attending_groups_bases` ON attending_groups_bases.AttendingGroupID = attending_groups.ID AND + attending_groups_bases.StudyGroupID = groupID + LEFT JOIN `attending_groups_pool` ON attending_groups_pool.AttendingGroupID = attending_groups.ID AND + attending_groups_pool.StudentID = StudentID + WHERE disciplines.SubjectID = SubjectID AND + disciplines.SemesterID = semID AND + attending_groups.SemesterID = semID AND + ( attending_groups_pool.Type = 'attach' OR + ( (attending_groups_pool.Type is NULL OR attending_groups_pool.Type != 'detach') AND + attending_groups_bases.StudyGroupID IS NOT NULL AND + attending_groups_bases.StudyGroupID = groupID + ) + ) + LIMIT 1; + + IF checker > 0 THEN + SELECT rating_table.Rate + INTO OldVal + FROM `rating_table` + WHERE rating_table.ID = rateID + LIMIT 1; + + + SELECT accounts.ID + INTO accID + FROM `teachers` + INNER JOIN `accounts` ON teachers.AccountID = accounts.ID + WHERE teachers.ID = TeacherID + LIMIT 1; + + INSERT INTO `logs` ( logs.RatingTableID, logs.AccountID, logs.OldValue, logs.NewValue, logs.Date ) + VALUES ( rateID, accID, OldVal, Rate, NOW() ); + + + UPDATE `rating_table` + SET rating_table.Rate = Rate + WHERE rating_table.ID = rateID; + + RETURN 0; + + + END IF; + END IF; + END IF; + RETURN -1; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeSubmodule`( `TeacherID` INT, + `SubmoduleID` INT, + `MaxRate` INT, + `OrderNum` INT, + `Name` VARCHAR(50), + `Description` VARCHAR(200), + `ControlType` VARCHAR(30) + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT modules.ID + INTO checker + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + SET checker = -1; + SELECT submodules.ID + INTO checker + FROM `submodules` + WHERE submodules.ModuleID = checker AND submodules.OrderNum = OrderNum + LIMIT 1; + IF checker > 0 THEN + RETURN -1; + END IF; + + UPDATE `submodules` + SET submodules.MaxRate = MaxRate, + submodules.OrderNum = OrderNum, + submodules.Name = Name, + submodules.Description = Description, + submodules.Type = ControlType + WHERE submodules.ID = SubmoduleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeSubmoduleControlType`( `TeacherID` INT, + `SubmoduleID` INT, + `ControlType` VARCHAR(30) + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT submodules.ID + INTO checker + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + UPDATE `submodules` + SET submodules.Type = ControlType + WHERE submodules.ID = SubmoduleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeSubmoduleDescription`( `TeacherID` INT, + `SubmoduleID` INT, + `Description` VARCHAR(200) + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT submodules.ID + INTO checker + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + UPDATE `submodules` + SET submodules.Description = Description + WHERE submodules.ID = SubmoduleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeSubmoduleMaxRate`( `TeacherID` INT, + `SubmoduleID` INT, + `MaxRate` INT + + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT submodules.ID + INTO checker + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + UPDATE `submodules` + SET submodules.MaxRate = MaxRate + WHERE submodules.ID = SubmoduleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeSubmoduleName`( `TeacherID` INT, + `SubmoduleID` INT, + `Name` VARCHAR(50) + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT submodules.ID + INTO checker + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + UPDATE `submodules` + SET submodules.Name = Name + WHERE submodules.ID = SubmoduleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `ChangeSubmoduleOrder`( `TeacherID` INT, + `SubmoduleID` INT, + `OrderNum` INT + + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT modules.ID + INTO checker + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + + SET checker = -1; + SELECT submodules.ID + INTO checker + FROM `submodules` + WHERE submodules.ModuleID = checker AND submodules.OrderNum = OrderNum + LIMIT 1; + IF checker > 0 THEN + RETURN -1; + END IF; + + + UPDATE `submodules` + SET submodules.OrderNum = OrderNum + WHERE submodules.ID = SubmoduleID; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `CreateStudent`(`Last` VARCHAR(30) CHARSET utf8, `First` VARCHAR(30) CHARSET utf8, `Second` VARCHAR(30) CHARSET utf8, `Grade` INT, `GroupN` INT, `FacultyID` INT, `Code` VARCHAR(40) CHARSET utf8) RETURNS int(11) + NO SQL +BEGIN + DECLARE curID, StudyGroupID INT; + SET StudyGroupID = -1; + + SELECT study_groups.ID + INTO StudyGroupID + FROM `study_groups` + WHERE (study_groups.Grade = Grade ) AND + ( study_groups.GroupNum = GroupN ) AND + ( study_groups.FacultyID = FacultyID ) + LIMIT 1; + + IF ( (StudyGroupID > -1) AND ( Code IS NOT NULL ) ) THEN + + INSERT INTO `accounts` ( accounts.Login , accounts.Password , accounts.`E-Mail`, accounts.Type, accounts.ActivationCode ) + VALUES ( NULL, NULL, NULL, 'student', Code); + + SELECT accounts.ID + INTO curID + FROM `accounts` + WHERE accounts.ActivationCode = Code; + + INSERT INTO `students` (students.StudyGroupID, students.AccountID, students.LastName, students.FirstName, students.SecondName) + VALUES (StudyGroupID, curID, Last, First, Second); + + RETURN 0; + + + + END IF; + RETURN -1; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `CreateTeacher`(`Last` VARCHAR(30) CHARSET utf8, `First` VARCHAR(30) CHARSET utf8, `Second` VARCHAR(30) CHARSET utf8, `DegreeID` INT, `DepartmentID` INT, `Code` VARCHAR(40) CHARSET utf8) RETURNS int(11) + NO SQL +BEGIN + DECLARE curID, StudyGroupID, checker INT; + + SELECT departments.ID + INTO checker + FROM `departments` + WHERE departments.ID = DepartmentID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + SELECT degrees.ID + INTO checker + FROM `degrees` + WHERE degrees.ID = DegreeID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + + IF Code IS NOT NULL THEN + + INSERT INTO `accounts` ( accounts.Login , accounts.Password , accounts.`E-Mail`, accounts.Type, accounts.ActivationCode ) + VALUES ( NULL, NULL, NULL, 'teacher', Code); + + SELECT accounts.ID INTO curID + FROM `accounts` + WHERE accounts.ActivationCode = Code; + + INSERT INTO `teachers` ( teachers.AccountID, + teachers.LastName, + teachers.FirstName, + teachers.SecondName, + teachers.DegreeID, + teachers.DepartmentID) + VALUES (curID, Last, First, Second, DegreeID, DepartmentID); + RETURN 0; + + END IF; + RETURN -1; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `DeleteModule`( `TeacherID` INT, + `ModuleID` INT + ) RETURNS int(11) + NO SQL +BEGIN + + DECLARE checker INT; + + SELECT disciplines.ID + INTO checker + FROM `modules` + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.TeacherID = TeacherID AND + disciplines_teachers.DisciplineID = disciplines.ID + WHERE modules.ID = ModuleID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + + SET checker = -1; + SELECT submodules.ID + INTO checker + FROM `submodules` + WHERE submodules.ModuleID = ModuleID + LIMIT 1; + IF checker > 0 THEN + RETURN -1; + END IF; + + + DELETE FROM `modules` + WHERE modules.ID = ModuleID; + + + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `DeleteSubmodule`( `TeacherID` INT, + `SubmoduleID` INT + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker INT; + + SELECT modules.ID + INTO checker + FROM `submodules` + INNER JOIN `modules` ON modules.ID = submodules.ModuleID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.TeacherID = TeacherID AND disciplines_teachers.DisciplineID = disciplines.ID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + IF checker IS NULL OR checker <= 0 THEN + RETURN -1; + END IF; + + + + SET checker = -1; + SELECT rating_table.ID + INTO checker + FROM `rating_table` + WHERE rating_table.SubmoduleID = SubmoduleID + LIMIT 1; + IF checker > 0 THEN + RETURN -1; + END IF; + + + + DELETE FROM `submodules` + WHERE submodules.ID = SubmoduleID; + + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `GetAccNumByCode`( `Code` VARCHAR(40) CHARSET utf8 ) RETURNS int(11) + NO SQL +BEGIN + RETURN (SELECT COUNT(accounts.ID) FROM accounts WHERE accounts.ActivationCode = Code ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `GetAccNumByLogin`(`Login` VARCHAR(50) CHARSET utf8) RETURNS int(11) + NO SQL +BEGIN + RETURN ( SELECT COUNT(accounts.ID) FROM accounts WHERE accounts.Login = Login ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `GetAccNumByMail`(`Mail` VARCHAR(255) CHARSET utf8) RETURNS int(11) + NO SQL +BEGIN + RETURN ( SELECT COUNT(accounts.ID) FROM accounts WHERE accounts.`E-Mail` = Mail ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `GetCurSemesterID`( ) RETURNS int(11) + NO SQL +BEGIN + RETURN (SELECT general_settings.Val FROM `general_settings` WHERE general_settings.ID = 1 ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `GetHashKey`() RETURNS varchar(300) CHARSET utf8 + NO SQL +BEGIN + RETURN ( SELECT general_settings.ValS + FROM `general_settings` + WHERE general_settings.ID = 2 + ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `GetMaxRateForDisc`(`StudentID` INT, `DisciplineID` INT) RETURNS int(11) + NO SQL +BEGIN + RETURN ( SELECT SUM(submodules.MaxRate) + FROM `modules` + CROSS JOIN `submodules` ON submodules.ModuleID = modules.ID + CROSS JOIN `rating_table` ON rating_table.StudentID = StudentID AND + rating_table.SubmoduleID = submodules.ID + WHERE modules.DisciplineID = DisciplineID + ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `GetRateForDisc`(`StudentID` INT, `DisciplineID` INT) RETURNS int(11) + NO SQL +BEGIN + RETURN ( SELECT SUM(rating_table.Rate) + FROM `modules` + CROSS JOIN `submodules` ON submodules.ModuleID = modules.ID + CROSS JOIN `rating_table` ON rating_table.StudentID = StudentID AND + rating_table.SubmoduleID = submodules.ID + WHERE modules.DisciplineID = DisciplineID + ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `GetSemesterID`( `Year` INT, `Num` INT ) RETURNS int(11) + NO SQL +BEGIN + RETURN (SELECT semesters.ID FROM `semesters` WHERE semesters.Year = Year AND semesters.Num = Num ); +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `InternalOccurrenceChecker`( `StudentID` INT, + `AG_ID` INT ) RETURNS int(11) + NO SQL +BEGIN + + DECLARE mID INT; + SET mID = 0; + SELECT students.ID + INTO mID + FROM `students` + INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID + LEFT JOIN `attending_groups_bases` ON attending_groups_bases.AttendingGroupID = AG_ID AND attending_groups_bases.StudyGroupID = study_groups.ID + LEFT JOIN `attending_groups_pool` ON attending_groups_pool.AttendingGroupID = AG_ID AND attending_groups_pool.StudentID = StudentID + WHERE students.ID = StudentID AND + (( attending_groups_pool.Type IS NOT NULL AND attending_groups_pool.Type = 'attach') OR + ( (attending_groups_pool.Type IS NULL OR attending_groups_pool.Type != 'detach') AND attending_groups_bases.ID is NOT NULL) + ) + LIMIT 1; + + RETURN (mID>0); + +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `SetHashKey`( `Value` VARCHAR(300) ) RETURNS int(11) + NO SQL +BEGIN + UPDATE `general_settings` + SET general_settings.ValS = Value + WHERE general_settings.ID = 2; + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `SetStudentRate`( `TeacherID` INT, + `StudentID` INT, + `SubmoduleID` INT, + `Rate` INT ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker, discID, groupID, semID INT; + SET discID = -1; + SET groupID = -1; + + SELECT disciplines.ID + INTO discID + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + WHERE submodules.ID = SubmoduleID + LIMIT 1; + + SELECT disciplines.ID + INTO checker + FROM `disciplines` + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE disciplines.ID = discID + LIMIT 1; + + IF checker > 0 THEN + + SELECT COUNT(rating_table.ID) + INTO checker + FROM `rating_table` + WHERE rating_table.SubmoduleID = SubmoduleID AND + rating_table.TeacherID = TeacherID AND + rating_table.StudentID = StudentID; + + IF checker = 0 THEN + + SELECT students.StudyGroupID INTO groupID FROM `students` WHERE students.ID = StudentID LIMIT 1; + SET semID = GetCurSemesterID(); + + SELECT disciplines.ID INTO checker + FROM `disciplines` + CROSS JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID + CROSS JOIN `lessons` ON lessons.DisciplineTeacherID = disciplines_teachers.ID + INNER JOIN `attending_groups` ON attending_groups.ID = lessons.AttendingGroupID AND + attending_groups.SemesterID = semID + LEFT JOIN `attending_groups_bases` ON attending_groups_bases.AttendingGroupID = attending_groups.ID AND + attending_groups_bases.StudyGroupID = groupID + LEFT JOIN `attending_groups_pool` ON attending_groups_pool.AttendingGroupID = attending_groups.ID AND + attending_groups_pool.StudentID = StudentID + WHERE disciplines.SubjectID = SubjectID AND + disciplines.SemesterID = semID AND + attending_groups.SemesterID = semID AND + ( attending_groups_pool.Type = 'attach' OR + ( (attending_groups_pool.Type is NULL OR attending_groups_pool.Type != 'detach') AND + attending_groups_bases.StudyGroupID IS NOT NULL AND + attending_groups_bases.StudyGroupID = groupID + ) + ) + LIMIT 1; + + IF checker > 0 THEN + INSERT INTO `rating_table` ( rating_table.StudentID, rating_table.TeacherID, rating_table.SubmoduleID, rating_table.Rate, rating_table.Date ) + VALUES ( StudentID, TeacherID, SubmoduleID, Rate, CURDATE() ); + RETURN 0; + END IF; + RETURN -3; + END IF; + RETURN checker; + END IF; + RETURN -1; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `SignIn`( `Login` VARCHAR(255) CHARSET utf8, + `Password` VARCHAR(64) CHARSET utf8 + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE curID INT; + SELECT accounts.ID + INTO curID + FROM `accounts` + WHERE (accounts.Login = Login OR accounts.`E-Mail` = Login) AND + accounts.Password = Password + LIMIT 1; + + IF curID > 0 THEN + RETURN curID; + ELSE + RETURN -1; + END IF; + +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `SwapModuleOrder`( `TeacherID` INT, + `ModuleID1` INT, + `ModuleID2` INT + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker, ord1, ord2, disc1, disc2 INT; + + SELECT COUNT(modules.ID) + INTO checker + FROM `modules` + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE modules.ID = ModuleID1 OR modules.ID = ModuleID2 + LIMIT 2; + IF checker != 2 THEN + RETURN -1; + END IF; + + SELECT modules.OrderNum, + modules.DisciplineID + INTO ord1, disc1 + FROM `modules` + WHERE modules.ID = ModuleID1 + LIMIT 1; + + SELECT modules.OrderNum, + modules.DisciplineID + INTO ord2, disc2 + FROM `modules` + WHERE modules.ID = ModuleID2 + LIMIT 1; + + IF disc1 != disc2 THEN + RETURN -1; + END IF; + + UPDATE `modules` + SET modules.OrderNum = 13666 + WHERE modules.ID = ModuleID1; + + UPDATE `modules` + SET modules.OrderNum = ord1 + WHERE modules.ID = ModuleID2; + + UPDATE `modules` + SET modules.OrderNum = ord2 + WHERE modules.ID = ModuleID1; + + RETURN 0; +END$$ + +CREATE DEFINER=`root`@`%` FUNCTION `SwapSubmoduleOrder`( `TeacherID` INT, + `SubmoduleID1` INT, + `SubmoduleID2` INT + + ) RETURNS int(11) + NO SQL +BEGIN + DECLARE checker, ord1, ord2, mod1, mod2 INT; + + SELECT COUNT(submodules.ID) + INTO checker + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID + INNER JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = disciplines.ID AND disciplines_teachers.TeacherID = TeacherID + WHERE submodules.ID = SubmoduleID1 OR submodules.ID = SubmoduleID2; + IF checker != 2 THEN + RETURN -1; + END IF; + + + SELECT submodules.OrderNum, + submodules.ModuleID + INTO ord1, mod1 + FROM `submodules` + WHERE submodules.ID = SubmoduleID1 + LIMIT 1; + + SELECT submodules.OrderNum, + submodules.ModuleID + INTO ord2, mod2 + FROM `submodules` + WHERE submodules.ID = SubmoduleID2 + LIMIT 1; + + IF mod1 != mod2 THEN + RETURN -1; + END IF; + + UPDATE `submodules` + SET submodules.OrderNum = 13666 + WHERE submodules.ID = SubmoduleID1; + + UPDATE `submodules` + SET submodules.OrderNum = ord1 + WHERE submodules.ID = SubmoduleID2; + + UPDATE `submodules` + SET submodules.OrderNum = ord2 + WHERE submodules.ID = SubmoduleID1; + RETURN 0; +END$$ + +DELIMITER ; -- -------------------------------------------------------- @@ -38,7 +1603,15 @@ CREATE TABLE IF NOT EXISTS `accounts` ( PRIMARY KEY (`ID`), UNIQUE KEY `E-Mail` (`E-Mail`), UNIQUE KEY `Login` (`Login`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; + +-- +-- Дамп данных таблицы `accounts` +-- + +INSERT INTO `accounts` (`ID`, `Login`, `Password`, `E-Mail`, `Type`, `ActivationCode`, `isEnabled`, `UserAgent`) VALUES +(6, 'Abbadon', 'ff6cfea689c242780b084583790e39f5eb03bb91', 'solidovic@gmail.com', 'teacher', NULL, 1, NULL), +(7, NULL, NULL, NULL, 'student', 'code2', 1, NULL); -- -------------------------------------------------------- @@ -138,7 +1711,27 @@ CREATE TABLE IF NOT EXISTS `degrees` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(200) NOT NULL, PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; + +-- +-- Дамп данных таблицы `degrees` +-- + +INSERT INTO `degrees` (`ID`, `Name`) VALUES +(1, 'Аспирант'), +(2, 'Ассистент'), +(3, 'Ведущий научный сотрудник'), +(4, 'Главный научный сотрудник'), +(5, 'Докторант'), +(6, 'Доцент'), +(7, 'Младший научный сотрудник'), +(8, 'Научный сотрудник'), +(9, 'Преподаватель'), +(10, 'Профессор'), +(11, 'Старший преподаватель'), +(12, 'Стажер'), +(13, 'Старший научный сотрудник'), +(14, 'Доцент'); -- -------------------------------------------------------- @@ -152,7 +1745,15 @@ CREATE TABLE IF NOT EXISTS `departments` ( `FacultyID` int(11) NOT NULL, PRIMARY KEY (`ID`), KEY `FacultyID` (`FacultyID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- +-- Дамп данных таблицы `departments` +-- + +INSERT INTO `departments` (`ID`, `Name`, `FacultyID`) VALUES +(1, 'Кафедра математического анализа', 1), +(2, 'Кафедра магического анализа', 1); -- -------------------------------------------------------- @@ -203,7 +1804,15 @@ CREATE TABLE IF NOT EXISTS `faculties` ( `Name` varchar(100) NOT NULL, `Abbr` varchar(20) NOT NULL, PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- +-- Дамп данных таблицы `faculties` +-- + +INSERT INTO `faculties` (`ID`, `Name`, `Abbr`) VALUES +(1, 'Математика Механика Рё РљРќ', 'МехМат'), +(2, 'Юридический факультет', 'ЮрФак'); -- -------------------------------------------------------- @@ -216,7 +1825,14 @@ CREATE TABLE IF NOT EXISTS `general_settings` ( `Val` int(11) DEFAULT NULL, `ValS` varchar(300) DEFAULT NULL, PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- +-- Дамп данных таблицы `general_settings` +-- + +INSERT INTO `general_settings` (`ID`, `Val`, `ValS`) VALUES +(2, NULL, 'hfkshfkjdshkjfsdj'); -- -------------------------------------------------------- @@ -348,7 +1964,17 @@ CREATE TABLE IF NOT EXISTS `specializations` ( `Name` varchar(50) NOT NULL, `Abbr` varchar(20) NOT NULL, PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; + +-- +-- Дамп данных таблицы `specializations` +-- + +INSERT INTO `specializations` (`ID`, `Name`, `Abbr`) VALUES +(1, 'Прикладная математика Рё информатика', 'РџРњРёР'), +(2, 'Рнформационные технологии', 'РРў'), +(3, 'Математика', 'Матем'), +(4, 'Механика', 'Механика'); -- -------------------------------------------------------- @@ -366,7 +1992,14 @@ CREATE TABLE IF NOT EXISTS `students` ( PRIMARY KEY (`ID`), KEY `StudyGroupID` (`StudyGroupID`), KEY `AccountID` (`AccountID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Дамп данных таблицы `students` +-- + +INSERT INTO `students` (`ID`, `StudyGroupID`, `AccountID`, `LastName`, `FirstName`, `SecondName`) VALUES +(1, 1, 7, 'Рванов', 'Рван', 'Рванович'); -- -------------------------------------------------------- @@ -384,7 +2017,14 @@ CREATE TABLE IF NOT EXISTS `study_groups` ( PRIMARY KEY (`ID`), KEY `SpecializtionID` (`SpecializationID`), KEY `FacultyID` (`FacultyID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Дамп данных таблицы `study_groups` +-- + +INSERT INTO `study_groups` (`ID`, `Grade`, `GroupNum`, `SpecializationID`, `FacultyID`, `Name`) VALUES +(1, 1, 1, 1, 1, NULL); -- -------------------------------------------------------- @@ -397,7 +2037,17 @@ CREATE TABLE IF NOT EXISTS `subjects` ( `Name` varchar(50) NOT NULL, `Abbr` varchar(20) DEFAULT NULL, PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; + +-- +-- Дамп данных таблицы `subjects` +-- + +INSERT INTO `subjects` (`ID`, `Name`, `Abbr`) VALUES +(1, 'Математический анализ', 'Матан'), +(2, 'Конституционное право', 'РљРџ'), +(3, 'Операционные системы', 'РћРЎ'), +(4, 'Рстория', 'Рстория'); -- -------------------------------------------------------- @@ -435,7 +2085,14 @@ CREATE TABLE IF NOT EXISTS `teachers` ( PRIMARY KEY (`ID`), KEY `FacultyID` (`DepartmentID`), KEY `AccountID` (`AccountID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Дамп данных таблицы `teachers` +-- + +INSERT INTO `teachers` (`ID`, `LastName`, `FirstName`, `SecondName`, `DegreeID`, `DepartmentID`, `AccountID`) VALUES +(1, 'Колобок', 'Фазиль', 'Евреивич', 9, 1, 6); -- -- Ограничения внешнего ключа сохраненных таблиц