diff --git a/db/migrations/stored/R__procedures.sql b/db/migrations/stored/R__procedures.sql
index 2a2c54ce7930fc9b91a3d150c9c8b0e7f9087520..e1ff76f2b4899b683d2cec480d6420130a8fa024 100644
--- a/db/migrations/stored/R__procedures.sql
+++ b/db/migrations/stored/R__procedures.sql
@@ -1559,11 +1559,11 @@ NO SQL
   BEGIN
     SELECT teachers.ID AS 'ID'
     FROM teachers
-      INNER JOIN disciplines_teaches ON disciplines_teaches.TeacherID = teachers.ID
-      INNER JOIN disciplines ON disciplines.ID = disciplines_teaches.DisciplineID
+      INNER JOIN disciplines_teachers ON disciplines_teachers.TeacherID = teachers.ID
+      INNER JOIN disciplines ON disciplines.ID = disciplines_teachers.DisciplineID
       INNER JOIN disciplines_study_plans ON disciplines_study_plans.DisciplineID = disciplines.ID
     WHERE disciplines_study_plans.StudyPlanID = pStudyPlanID AND
-          teachers.SemesterID = COALESCE(pSemesterID, disciplines.SemesterID) AND
+          disciplines.SemesterID = COALESCE(pSemesterID, disciplines.SemesterID) AND
           (pLoadAll OR disciplines.Subtype IS NULL);
   END //
 
diff --git a/db/postgresql/functions.sql b/db/postgresql/functions.sql
new file mode 100644
index 0000000000000000000000000000000000000000..a46ac53985776a39f75b98669969386a94d19ab6
--- /dev/null
+++ b/db/postgresql/functions.sql
@@ -0,0 +1,4564 @@
+-- ВСПОМОГАТЕЛЬНЫЕ
+DROP FUNCTION IF EXISTS public.iif_sql(BOOLEAN, integer, integer);
+
+CREATE OR REPLACE FUNCTION iif_sql(BOOLEAN, integer, integer) 
+RETURNS integer AS
+$$ 
+SELECT CASE $1 WHEN TRUE THEN $2 ELSE $3 END 
+$$
+LANGUAGE SQL IMMUTABLE;
+
+
+
+-------------------------------------------------------------------------------------------
+
+
+--
+-- Name: getsemestersinfo(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getsemestersinfo(integer);
+
+CREATE OR REPLACE FUNCTION public.getsemestersinfo(psemesterid integer)
+ RETURNS  setof semesters
+AS $$
+-- select public.getsemestersinfo(:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4));
+SELECT  semesters.* -- ID, Year, Num
+    FROM semesters
+    WHERE  case when $1 <> 0 then semesters.ID = $1 else true end
+    ORDER BY semesters.ID DESC;
+$$ LANGUAGE sql;
+
+--
+-- Name: getdepartmentidbyname(character varying); Type: FUNCTION;
+--
+DROP FUNCTION IF EXISTS public.getdepartmentidbyname(character varying);
+
+CREATE OR REPLACE FUNCTION public.getdepartmentidbyname(pdepartmentname character varying)
+ RETURNS integer
+as $$
+-- select public.getdepartmentidbyname(	:pdepartmentname 	-- put the pdepartmentname parameter value instead of 'pdepartmentname' (varchar));
+-- видимо расчитано на уникальность имени кафедры, возможно не используется, или нужно добавить еще параметр - факультет
+    SELECT departments.ID as ID
+    FROM departments
+    WHERE departments.Name = pDepartmentName;
+$$ language sql;
+
+--
+-- Name: getbonusmodule(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getbonusmodule(integer);
+
+CREATE OR REPLACE FUNCTION public.getbonusmodule(pdisciplineid integer)
+ RETURNS integer
+AS $$
+-- select public.getbonusmodule(:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4));
+-- limit 1 оставлено, хотя ситуация с возникновением в одной дисциплине нескольких бонусных модулей сомнительная,
+-- может это нужно контролировать ограничением на таблицу
+    SELECT modules.ID FROM modules
+        WHERE modules.DisciplineID = pDisciplineID AND modules.Type = 'bonus'
+        LIMIT 1;
+$$ LANGUAGE sql;
+
+--
+-- Name: getauthtokens(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getauthtokens(integer);
+
+CREATE OR REPLACE FUNCTION public.getauthtokens(paccountid integer)
+ RETURNS TABLE(accountid integer, created timestamp without time zone, accessed timestamp without time zone, mask integer)
+AS $$
+-- select * from public.getauthtokens(:paccountid 	-- put the paccountid parameter value instead of 'paccountid' (int4));
+-- если вызывать select  public.getauthtokens(...); выдает таблицу с одним солбцом - все данные склены в список
+    SELECT accountID, Created, Accessed, Mask
+    FROM auth_tokens
+    INNER JOIN accounts ON accounts.ID = auth_tokens.AccountID
+    WHERE
+        auth_tokens.AccountID = pAccountID OR
+        pAccountID = 0
+    ORDER BY auth_tokens.Created DESC;
+$$ LANGUAGE sql;
+
+--
+-- Name: getcompounddisciplinesforgrade(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getcompounddisciplinesforgrade(integer);
+
+CREATE OR REPLACE FUNCTION public.getcompounddisciplinesforgrade(pgradeid integer)
+ RETURNS TABLE(id integer, name character varying)
+AS $$
+--select * from public.getcompounddisciplinesforgrade(	:pgradeid 	-- put the pgradeid parameter value instead of 'pgradeid' (int4));
+    SELECT  compound_disciplines.ID,
+            compound_disciplines.Name
+        FROM compound_disciplines
+        WHERE compound_disciplines.GradeID = pGradeID;
+$$ LANGUAGE sql;
+
+--
+-- Name: getdisciplines(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getdisciplines(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.getdisciplines(
+	pfacultyid integer,
+	psemesterid integer)
+RETURNS table(
+id integer
+,SubjectID  integer
+,SubjectName  character varying
+,Type exam_credit_grading_credit
+,isMapCreated boolean)
+AS $$
+--select * from public.getdisciplines(
+--	:pfacultyid,	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--	:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--);
+    SELECT  view_disciplines.DisciplineID AS ID,
+            view_disciplines.SubjectID,
+            view_disciplines.SubjectName,
+            view_disciplines.ExamType AS Type,
+            (view_disciplines.MaxRate = 100) AS isMapCreated
+        FROM view_disciplines
+        WHERE   view_disciplines.SemesterID = pSemesterID AND
+                view_disciplines.FacultyID = pFacultyID
+        ORDER BY view_disciplines.SubjectName ASC;
+$$ LANGUAGE sql;
+
+--
+-- Name: getdisciplinesforteacher(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getdisciplinesforteacher(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.getdisciplinesforteacher(
+	pteacherid integer,
+	psemesterid integer)
+RETURNS table(
+id integer
+,Type exam_credit_grading_credit
+,Subtype scientific_disciplinary_coursework
+,GradeID integer
+,GradeNum integer
+,Degree bachelor_master_specialist
+,GroupID integer
+,GroupNum integer
+,GroupName character varying
+,SubjectID integer
+,SubjectName character varying
+,AuthorID integer
+,IsLocked integer
+,IsMapCreated boolean)
+AS $$
+--select public.getdisciplinesforteacher(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--);
+    SELECT DISTINCT view_disciplines.DisciplineID AS ID,
+                view_disciplines.ExamType AS Type,
+                view_disciplines.Subtype,
+                view_disciplines.GradeID,
+                view_disciplines.GradeNum,
+                view_disciplines.Degree,
+                view_groups.GroupID,
+                view_groups.GroupNum,
+                view_groups.GroupName,
+                view_disciplines.SubjectID,
+                view_disciplines.SubjectName,
+                view_disciplines.AuthorID,
+                view_disciplines.IsLocked AS IsLocked, -- bodging, db schema remembered lowerCase
+                (view_disciplines.MaxRate = 100)    AS IsMapCreated
+    FROM disciplines_teachers
+    INNER JOIN view_disciplines ON disciplines_teachers.DisciplineID = view_disciplines.DisciplineID
+    INNER JOIN semesters ON semesters.ID = view_disciplines.SemesterID
+    LEFT JOIN disciplines_groups ON disciplines_groups.DisciplineID = disciplines_teachers.DisciplineID
+    LEFT JOIN view_groups ON view_groups.GroupID = disciplines_groups.GroupID AND view_groups.Year = semesters.Year
+    WHERE disciplines_teachers.TeacherID = pTeacherID AND view_disciplines.SemesterID = pSemesterID
+    ORDER BY    view_disciplines.GradeID ASC,
+                view_disciplines.SubjectName ASC,
+                view_disciplines.DisciplineID ASC,
+                view_groups.GroupNum ASC;
+$$ LANGUAGE sql;
+
+--
+-- Name: getfinalforminfo(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getfinalforminfo(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.getfinalforminfo(
+	pdisciplineid integer,
+	pgroupid integer)
+RETURNS table(
+GroupNum integer
+,GroupName character varying
+,GradeID integer
+,GradeNum integer
+,Degree bachelor_master_specialist
+,SpecID integer
+,SpecName character varying
+,SpecAbbr character varying
+,SpecCode character varying
+,FacultyID integer
+,FacultyName character varying
+,FacultyAbbr character varying
+,ExamType exam_credit_grading_credit
+,SubjectID integer
+,SubjectName character varying
+,SubjectAbbr character varying
+,AuthorID integer
+,LastName character varying
+,FirstName character varying
+,SecondName character varying
+,JobPosition character varying
+,DepID integer
+,DepName character varying
+,Year integer
+,SemesterNum integer)
+AS $$
+--select * from public.getfinalforminfo(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pgroupid 	-- put the pgroupid parameter value instead of 'pgroupid' (int4)
+--);
+    SELECT  study_groups.GroupNum AS GroupNum,
+            groups_years.Name AS GroupName,
+            grades.ID AS GradeID,
+            grades.Num AS GradeNum,
+            grades.Degree AS Degree,
+            specializations.ID AS SpecID,
+            specializations.Name AS SpecName,
+            specializations.Abbr AS SpecAbbr,
+            specializations.Code AS SpecCode,
+            faculties.ID AS FacultyID,
+            faculties.Name AS FacultyName,
+            faculties.Abbr AS FacultyAbbr,
+            disciplines.ExamType AS ExamType,
+            subjects.ID AS SubjectID,
+            subjects.Name AS SubjectName,
+            subjects.Abbr AS SubjectAbbr,
+            teachers.ID AS AuthorID,
+            accounts.LastName AS LastName,
+            accounts.FirstName AS FirstName,
+            accounts.SecondName AS SecondName,
+            job_positions.Name AS JobPosition,
+            departments.ID AS DepID,
+            departments.Name AS DepName,
+            semesters.Year AS Year,
+            semesters.Num AS SemesterNum
+        FROM study_groups
+        INNER JOIN grades ON study_groups.GradeID = grades.ID
+        INNER JOIN disciplines ON disciplines.ID = pDisciplineID
+        INNER JOIN subjects ON disciplines.SubjectID = subjects.ID
+        INNER JOIN teachers ON teachers.ID = disciplines.AuthorID
+        INNER JOIN accounts ON teachers.AccountID = accounts.ID
+        INNER JOIN departments ON departments.ID = teachers.DepartmentID
+        INNER JOIN job_positions ON job_positions.ID = teachers.JobPositionID
+        INNER JOIN semesters ON disciplines.SemesterID = semesters.ID
+        INNER JOIN groups_years ON groups_years.GroupID = study_groups.ID AND groups_years.Year = semesters.Year
+        INNER JOIN specializations ON groups_years.SpecializationID = specializations.ID
+        INNER JOIN faculties ON faculties.ID = specializations.FacultyID
+        WHERE study_groups.ID = pGroupID
+        LIMIT 1;
+$$ LANGUAGE sql;
+
+--
+-- Name: getgrades(); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getgrades();
+
+CREATE OR REPLACE FUNCTION public.getgrades(
+	)
+RETURNS setof grades
+AS $$
+--select public.getgrades();
+SELECT  grades.* -- ID, Num, Degree
+    FROM grades
+    ORDER BY grades.ID;   
+$$ LANGUAGE sql;
+
+--
+-- Name: getgroups(integer, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getgroups(integer, integer, integer);
+
+CREATE OR REPLACE FUNCTION public.getgroups(
+	pgradeid integer,
+	pfacultyid integer,
+	psemesterid integer)
+RETURNS table(
+id integer
+,GroupNum integer
+,SpecID integer
+,SpecName character varying
+,SpecAbbr character varying)  
+AS $$
+--select * from public.getgroups(
+--	:pgradeid,	-- put the pgradeid parameter value instead of 'pgradeid' (int4)
+--	:pfacultyid,	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--	:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--);
+    SELECT  view_groups.GroupID AS ID,
+            view_groups.GroupNum,
+            view_groups.SpecID,
+            view_groups.SpecName,
+            view_groups.SpecAbbr
+        FROM view_groups
+        INNER JOIN semesters ON semesters.ID = pSemesterID
+        WHERE   view_groups.GradeID = pGradeID AND
+                view_groups.FacultyID = pFacultyID AND
+                view_groups.Year = semesters.Year
+        ORDER BY view_groups.GroupNum ASC;
+$$ LANGUAGE sql;
+
+--
+-- Name: userecoverytoken(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.userecoverytoken(character varying);
+
+CREATE OR REPLACE FUNCTION public.userecoverytoken(ptoken character varying)
+ RETURNS integer
+ LANGUAGE plpgsql
+AS $$
+    DECLARE vChecker INT DEFAULT -1;
+BEGIN
+    -- set token used
+	-- select public.userecoverytoken(
+	-- :ptoken 	-- put the ptoken parameter value instead of 'ptoken' (varchar)
+    --);
+    UPDATE recovery_tokens
+        SET IsUsed = 1
+        WHERE Token = pToken;
+      -- LIMIT 1;  не нужен, т.к. token имеет unique key
+      GET diagnostics vChecker=ROW_COUNT; --другого способа не нашла
+   -- RETURN ROW_COUNT-1;
+   return vchecker-1;
+END;
+$$;
+
+--
+-- Name: updaterequest(integer, character varying, text); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.updaterequest(integer, character varying, text);
+
+CREATE OR REPLACE FUNCTION public.updaterequest(prequestid integer, ptitle character varying, pdescription text)
+ RETURNS integer
+ LANGUAGE plpgsql
+AS $$
+    DECLARE retValue INT DEFAULT -1;
+BEGIN
+    --DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1; непонятно зачем обрабочик,ошибки быть не может
+--  select public.UpdateRequest(
+--	:pRequestID,	-- put the pRequestID parameter value instead of 'pRequestID' (INT)
+--	:pTitle,	-- put the pTitle parameter value instead of 'pTitle' (VARCHAR(50))
+--	:pDescription 	-- put the pDescription parameter value instead of 'pDescription' (CHAR(1))
+--);
+    UPDATE requests
+        SET requests.Description = pDescription,
+            requests.Title = pTitle,
+            requests.Date = NOW()
+        WHERE   requests.ID = pRequestID AND
+                requests.Description IS NULL AND
+                requests.Title IS NULL;
+        --LIMIT 1; -- запрос через id не может вернуть больше 1 строки
+    --RETURN ROW_COUNT()-1;
+    GET diagnostics retValue=ROW_COUNT;
+   return retValue-1;
+END;
+$$;
+
+--
+-- Name: teacher_getidfromexternalid(varchar); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.teacher_getidfromexternalid(varchar); 
+
+CREATE OR REPLACE FUNCTION public.teacher_getidfromexternalid(pteacherexternalid character varying)
+ RETURNS integer
+ LANGUAGE plpgsql
+AS $$
+        DECLARE pID INT DEFAULT -1;
+begin
+--	select public.teacher_getidfromexternalid(
+--	:pteacherexternalid 	-- put the pteacherexternalid parameter value instead of 'pteacherexternalid' (varchar)
+--);
+        SELECT teachers.ID INTO pID
+        FROM teachers
+            INNER JOIN accounts ON teachers.AccountID = accounts.ID
+        WHERE accounts.ExternalID = pTeacherExternalID
+        LIMIT 1; -- скорее всего не требуется
+        RETURN pID;
+    END;
+$$;
+
+--
+-- Name: jobpositions_get(); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.jobpositions_get();
+
+CREATE OR REPLACE FUNCTION public.jobpositions_get()
+ RETURNS setof job_positions
+ LANGUAGE sql
+AS $$
+--select public.jobpositions_get();
+SELECT  job_positions.* -- ID, Name
+  FROM    job_positions
+  ORDER BY job_positions.Name;
+$$;
+
+--
+-- Name: getgroupsfordiscipline(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.etgroupsfordiscipline(integer);
+
+CREATE OR REPLACE FUNCTION public.getgroupsfordiscipline(
+	pdisciplineid integer)
+RETURNS table(
+ID integer
+,GroupNum integer
+,GradeID integer
+,GradeNum integer
+,Degree bachelor_master_specialist
+,SpecID integer
+,SpecName character varying
+,SpecAbbr character varying)
+AS $$
+--select * from public.getgroupsfordiscipline(
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+    SELECT  view_groups.GroupID AS ID,
+            view_groups.GroupNum,
+            view_groups.GradeID,
+            view_groups.GradeNum,
+            view_groups.Degree,
+            view_groups.SpecID,
+            view_groups.SpecName,
+            view_groups.SpecAbbr
+        FROM disciplines_groups
+        INNER JOIN disciplines ON disciplines_groups.DisciplineID = disciplines.ID
+        INNER JOIN semesters ON disciplines.SemesterID = semesters.ID
+        INNER JOIN view_groups ON disciplines_groups.GroupID = view_groups.GroupID
+        WHERE   disciplines_groups.DisciplineID = pDisciplineID
+                AND view_groups.Year = semesters.Year
+        ORDER BY view_groups.GradeID ASC, view_groups.GroupID ASC;
+
+$$ Language sql;
+
+--
+-- Name: getjobpositionidbyname(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getjobpositionidbyname(character varying);
+
+CREATE OR REPLACE FUNCTION public.getjobpositionidbyname(
+	pjobpositionname character varying)
+RETURNS integer
+AS $$
+--select public.getjobpositionidbyname(
+--	:pjobpositionname 	-- put the pjobpositionname parameter value instead of 'pjobpositionname' (varchar)
+--);
+
+    SELECT job_positions.ID as ID
+    FROM job_positions
+    WHERE job_positions.Name = pJobPositionName;
+$$ Language sql;
+
+--
+-- Name: getjobpositions(); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getjobpositions();
+
+CREATE OR REPLACE FUNCTION public.getjobpositions(
+	)
+RETURNS setof job_positions
+AS $$
+--select * from public.getjobpositions();
+SELECT  job_positions.* -- ID, Name
+    FROM    job_positions
+    ORDER BY job_positions.Name;
+$$ Language sql;
+
+--
+-- Name: getratesall(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getratesall(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.getratesall(
+	pstudentid integer,
+	pdisciplineid integer)
+RETURNS table(
+ModuleID integer
+,ModuleName character varying
+,SubmoduleID integer
+,SubmoduleName character varying
+,MaxRate integer
+,SubmoduleType current_landmark_control
+,SubmoduleOrderNum integer
+,Rate integer
+,Date date
+,ModuleType regular_exam_bonus_extra
+,ExamPeriodOption absence_pass)
+AS $$
+--select * from public.getratesall(
+--	:pstudentid,	-- put the pstudentid parameter value instead of 'pstudentid' (int4)
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+
+    SELECT  view_roadmap.ModuleID,
+            view_roadmap.ModuleName,
+            view_roadmap.SubmoduleID,
+            view_roadmap.SubmoduleName,
+            view_roadmap.SubmoduleRate AS MaxRate,
+            view_roadmap.SubmoduleType,
+            view_roadmap.SubmoduleOrderNum,
+            rating_table.Rate,
+            rating_table.Date,
+            view_roadmap.ModuleType,
+            exam_period_options.Type As ExamPeriodOption
+    FROM view_roadmap
+    LEFT JOIN rating_table    ON  rating_table.SubmoduleID = view_roadmap.SubmoduleID AND
+                                    rating_table.recordbookid = pStudentID
+    LEFT JOIN exam_period_options ON  exam_period_options.recordbookid = pStudentID AND
+                                        exam_period_options.SubmoduleID = view_roadmap.SubmoduleID
+    WHERE view_roadmap.DisciplineID = pDisciplineID
+    ORDER BY    view_roadmap.ModuleOrderNum ASC,
+                view_roadmap.SubmoduleOrderNum ASC;
+$$ Language sql;
+
+--
+-- Name: getratesexam(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getratesexam(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.getratesexam(
+	pstudentid integer,
+	pdisciplineid integer)
+RETURNS table(
+ModuleID integer
+,ModuleName character varying
+,SubmoduleID integer
+,SubmoduleName character varying
+,MaxRate integer
+,SubmoduleType current_landmark_control
+,Rate integer
+,Date date
+,ModuleType regular_exam_bonus_extra
+,ExamPeriodOption absence_pass)
+AS $$
+--select * from public.getratesexam(
+--	:pstudentid,	-- put the pstudentid parameter value instead of 'pstudentid' (int4)
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+    SELECT  view_roadmap.ModuleID,
+            view_roadmap.ModuleName,
+            view_roadmap.SubmoduleID,
+            view_roadmap.SubmoduleName,
+            view_roadmap.SubmoduleRate AS MaxRate,
+            view_roadmap.SubmoduleType,
+            rating_table.Rate,
+            rating_table.Date,
+            view_roadmap.ModuleType,
+            exam_period_options.Type As ExamPeriodOption
+    FROM view_roadmap
+    LEFT JOIN rating_table    ON  rating_table.SubmoduleID = view_roadmap.SubmoduleID AND
+                                    rating_table.recordbookid = pStudentID
+    LEFT JOIN exam_period_options ON  exam_period_options.recordbookid = pStudentID AND
+                                        exam_period_options.SubmoduleID = view_roadmap.SubmoduleID
+    WHERE view_roadmap.DisciplineID = pDisciplineID
+    ORDER BY    view_roadmap.ModuleOrderNum ASC,
+                view_roadmap.SubmoduleOrderNum ASC;
+$$ Language sql;
+
+--
+-- Name: getrecoveryinfobyemail(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getrecoveryinfobyemail(character varying);
+
+CREATE OR REPLACE FUNCTION public.getrecoveryinfobyemail(
+	pemail character varying)
+RETURNS table(
+ID integer
+,AccountID integer
+,Date timestamp
+,Token character varying
+,IsUsed smallint)
+AS $$
+--select * from public.getrecoveryinfobyemail(
+--	:pemail 	-- put the pemail parameter value instead of 'pemail' (varchar)
+--);
+
+    SELECT  recovery_tokens.ID,
+            recovery_tokens.AccountID,
+            recovery_tokens.Date,
+            recovery_tokens.Token,
+            recovery_tokens.IsUsed
+        FROM accounts
+        INNER JOIN recovery_tokens ON recovery_tokens.AccountID = accounts.ID
+        WHERE   accounts.EMail = pEMail AND
+                recovery_tokens.IsUsed = 0
+        LIMIT 1;
+$$ Language sql;
+
+--
+-- Name: getrecoveryinfobytoken(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getrecoveryinfobytoken(character varying);
+
+CREATE OR REPLACE FUNCTION public.getrecoveryinfobytoken(
+	ptoken character varying)
+RETURNS table(
+ID integer
+,AccountID integer
+,Date timestamp
+,Token character varying
+,IsUsed smallint)
+AS $$
+--select * from public.getrecoveryinfobytoken(
+--	:ptoken 	-- put the ptoken parameter value instead of 'ptoken' (varchar)
+--);
+
+    SELECT  recovery_tokens.ID,
+            recovery_tokens.AccountID,
+            recovery_tokens.Date,
+            recovery_tokens.Token,
+            recovery_tokens.IsUsed
+        FROM recovery_tokens
+        WHERE recovery_tokens.Token = pToken
+        LIMIT 1;
+$$ Language sql;
+
+--
+-- Name: internalismapcreated(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.internalismapcreated(integer);
+
+CREATE OR REPLACE FUNCTION public.internalismapcreated(pdisciplineid integer)
+ RETURNS boolean
+ AS $$
+--select public.internalismapcreated(
+--	:pdisciplineid-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+declare maxRate integer;
+BEGIN
+    maxRate=null;
+    SELECT disciplines.MaxRate FROM disciplines into maxRate
+    WHERE disciplines.ID = pDisciplineID ;
+    RETURN (maxrate is not null and maxrate=100);
+END
+$$ LANGUAGE plpgsql;
+
+--
+-- Name: internalismaplocked(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.internalismaplocked(integer);
+
+CREATE OR REPLACE FUNCTION public.internalismaplocked(pdisciplineid integer)
+ RETURNS boolean
+AS $$
+--select public.internalismaplocked(
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+declare isLocked integer;
+BEGIN
+	isLocked =null;
+	SELECT disciplines.IsLocked into isLocked
+  FROM disciplines
+  WHERE disciplines.ID = pDisciplineID;
+    return (isLocked is not null and isLocked =1);
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: internalisteacherauthor(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.internalisteacherauthor(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.internalisteacherauthor(pteacherid integer, pdisciplineid integer)
+ RETURNS boolean
+AS $$
+--select public.internalisteacherauthor(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+declare author integer;
+BEGIN
+    author = NULL; 
+    SELECT disciplines.AuthorID into author
+    FROM disciplines
+    WHERE disciplines.ID = pDisciplineID;
+    return (author is not null and author = pTeacherID);
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: internalisteacherbound(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.internalisteacherbound(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.internalisteacherbound(pteacherid integer, pdisciplineid integer)
+ RETURNS boolean
+AS $$
+--select public.internalisteacherbound(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--  :pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+BEGIN
+RETURN EXISTS (
+    SELECT * FROM disciplines_teachers
+    WHERE disciplines_teachers.TeacherID = pTeacherID AND disciplines_teachers.DisciplineID = pDisciplineID
+    );
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: internalordermoduletypesforsession(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.internalordermoduletypesforsession(integer);
+
+CREATE OR REPLACE FUNCTION public.internalordermoduletypesforsession(pmoduletype integer)
+ RETURNS integer
+AS $$
+--select public.internalordermoduletypesforsession(
+--	:pmoduletype 	-- put the pmoduletype parameter value instead of 'pmoduletype' (int4)
+--);
+BEGIN
+RETURN (CASE pModuleType
+    WHEN 4 THEN 1 -- extra
+    WHEN 2 THEN 2 -- exam
+    WHEN 3 THEN 3 -- bonus
+    ELSE 4
+END);
+end
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: addmodule(integer, integer, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.addmodule(integer, integer, character varying);
+
+CREATE OR REPLACE FUNCTION public.addmodule(pteacherid integer, pdisciplineid integer, pname character varying)
+ RETURNS integer
+AS $$
+
+    DECLARE vOrderNum INT DEFAULT 0;
+    DECLARE currID int DEFAULT 0;
+BEGIN
+--select public.addmodule(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pname 	-- put the pname parameter value instead of 'pname' (varchar)
+--);
+ 
+    if  (NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR InternalIsMapLocked(pDisciplineID) )THEN
+        RETURN -2;
+       end if;
+  -- get free orderNum for module with type 'regular'
+    SELECT coalesce(MAX(modules.OrderNum)+1,1) into  vOrderNum 
+    FROM modules
+       WHERE   modules.DisciplineID = pDisciplineID AND modules.Type = 'regular';
+
+    INSERT INTO modules (Name, OrderNum, DisciplineID ) VALUES (pName, vOrderNum, pDisciplineID) returning  id into currID;
+    RETURN currID;
+EXCEPTION
+   WHEN others  then return -1;
+end
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: addsubmoduleunsafe(integer, integer, character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.addsubmoduleunsafe(integer, integer, character varying, character varying, character varying);
+
+CREATE OR REPLACE FUNCTION public.addsubmoduleunsafe(pmoduleid integer, pmaxrate integer, pname character varying, pdescription character varying, pcontroltype character varying)
+ RETURNS integer
+
+AS $$
+--select public.addsubmoduleunsafe(
+--	:pmoduleid,	-- put the pmoduleid parameter value instead of 'pmoduleid' (int4)
+--	:pmaxrate,	-- put the pmaxrate parameter value instead of 'pmaxrate' (int4)
+--	:pname,	-- put the pname parameter value instead of 'pname' (varchar)
+--	:pdescription,	-- put the pdescription parameter value instead of 'pdescription' (varchar)
+--	:pcontroltype 	-- put the pcontroltype parameter value instead of 'pcontroltype' (varchar)
+--);
+    DECLARE vOrderNum INT DEFAULT -1; vIsLocked INT DEFAULT -1; vDescription VARCHAR(200); recId int ;
+BEGIN
+    -- check discipline lock
+    SELECT disciplines.IsLocked INTO vIsLocked
+        FROM modules
+        INNER JOIN disciplines ON disciplines.ID = modules.DisciplineID
+        WHERE modules.ID = pModuleID
+        LIMIT 1;
+    IF  vIsLocked != 0 THEN
+        RETURN -2;
+    END IF;
+
+    -- get free order
+        SELECT COALESCE(MAX(submodules.OrderNum),0)+1 FROM submodules
+        WHERE submodules.ModuleID = pModuleID LIMIT 1 into vOrderNum;
+
+         if (vDescription = '')   THEN   vDescription := NULL ;
+          ELSE  vDescription :=pDescription; 
+         end if ; -- очень странная проверка
+    INSERT INTO submodules (ModuleID, MaxRate, OrderNum, Name, Description, Type) VALUES
+        (pModuleID, pMaxRate, vOrderNum, pName, vDescription, pControlType) returning id into recID;
+    RETURN  recID;
+  exception 
+   when others then return -1;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: addsubmodule(integer, integer, integer, character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.addsubmodule(integer, integer, integer, character varying, character varying, character varying);
+
+CREATE OR REPLACE FUNCTION public.addsubmodule(pteacherid integer, pmoduleid integer, pmaxrate integer, pname character varying, pdescription character varying, pcontroltype character varying)
+ RETURNS integer
+
+AS $$
+
+    DECLARE vIsLocked BOOLEAN DEFAULT TRUE;
+   vID integer default null;
+begin
+--	select public.addsubmodule(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pmoduleid,	-- put the pmoduleid parameter value instead of 'pmoduleid' (int4)
+--	:pmaxrate,	-- put the pmaxrate parameter value instead of 'pmaxrate' (int4)
+--	:pname,	-- put the pname parameter value instead of 'pname' (varchar)
+--	:pdescription,	-- put the pdescription parameter value instead of 'pdescription' (varchar)
+--	:pcontroltype 	-- put the pcontroltype parameter value instead of 'pcontroltype' (varchar)
+--);
+
+    -- check author and discipline lock
+    SELECT disciplines.AuthorID into vID
+         FROM modules
+        INNER JOIN disciplines ON  disciplines.ID = modules.DisciplineID
+        WHERE modules.ID = pModuleID
+        LIMIT 1;
+       IF vID is null or vID !=pTeacherID  THEN
+        RETURN -2;
+    END IF;
+    
+ RETURN AddSubmoduleUnsafe(pModuleID, pMaxRate, pName, pDescription, pControlType);
+
+END;
+$$  LANGUAGE plpgsql;
+
+
+--
+-- Name: addmoduleextra(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.addmoduleextra(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.addmoduleextra(pteacherid integer, pdisciplineid integer)
+ RETURNS integer
+AS $$
+    DECLARE vChecker INT DEFAULT -1; vModule INT DEFAULT -1; vType INT DEFAULT -1; vGap INT DEFAULT -1;
+begin
+--	select public.AddModuleExtra(
+--	:pTeacherID,	-- put the pTeacherID parameter value instead of 'pTeacherID' (INT)
+--	:pDisciplineID 	-- put the pDisciplineID parameter value instead of 'pDisciplineID' (INT)
+--);
+
+    IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID)
+    THEN
+        RETURN -1;
+    END IF;
+    -- try to find existing extra module
+    SELECT modules.ID INTO vChecker
+        FROM modules
+        WHERE modules.DisciplineID = pDisciplineID AND modules.Type = 'extra'
+        LIMIT 1;
+    IF vChecker > 0 THEN
+        RETURN -2;
+    END IF;
+
+    -- add extra module
+    INSERT INTO modules
+        (Name, OrderNum, DisciplineID, Type)
+        VALUES ('Добор баллов' , 2900666 , pDisciplineID, 'extra');
+
+	-- get discipline exam type
+    SELECT  modules.ID, disciplines.ExamType INTO vModule, vType
+        FROM modules
+        INNER JOIN disciplines ON disciplines.ID = modules.DisciplineID
+        WHERE   modules.DisciplineID = pDisciplineID AND
+                modules.Type = 'extra'
+        LIMIT 1;
+    IF vModule <= 0 THEN
+        RETURN -1;
+    END IF;
+
+    -- 1 extra attempt for exam and 2 for credit
+    vGap := -1;
+    IF vType = 1 THEN -- exam
+        vGap := 7;
+    END IF;
+    IF vType = 2 OR vType = 3 THEN -- credit, grading_credit
+        vGap := 29;
+        vChecker := addsubmodule(pTeacherID, vModule, vGap, '', NULL, 'LandmarkControl');
+    END IF;
+
+    vChecker := AddSubmodule(pTeacherID, vModule, vGap, '', NULL, 'LandmarkControl');
+    RETURN vModule;
+   exception 
+   when others then return -1;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: addmoduleexamunsafe(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.addmoduleexamunsafe(integer);
+
+CREATE OR REPLACE FUNCTION public.addmoduleexamunsafe(pdisciplineid integer)
+ RETURNS integer
+AS $$
+    DECLARE vModule INT DEFAULT -1; vChecker INT DEFAULT -1;
+    vIsExamExists BOOLEAN; vTemp int;
+BEGIN
+--select public.AddModuleExamUnsafe(
+--	:pDisciplineID 	-- put the pDisciplineID parameter value instead of 'pDisciplineID' (INT)
+--);
+    IF InternalIsMapLocked(pDisciplineID) THEN
+        RETURN -1;
+    END IF;
+
+    vIsExamExists := EXISTS(
+        SELECT * FROM modules
+        WHERE modules.DisciplineID = pDisciplineID AND modules.Type = 'exam'
+        LIMIT 1
+    );
+    IF vIsExamExists THEN
+        RETURN -2;
+    END IF;
+
+    INSERT INTO modules (Name, OrderNum, DisciplineID, Type) VALUES  ('Экзамен' , 3141592 , pDisciplineID, 'exam') 
+   				returning  ID into vModule;
+    -- 3 attempt for pass exam -- разобраться почему так?
+    SELECT AddSubmoduleUnsafe(vModule, 40, '', NULL, 'LandmarkControl') INTO vTemp;
+    SELECT AddSubmoduleUnsafe(vModule, 40, '', NULL, 'LandmarkControl') INTO vTemp;
+    SELECT AddSubmoduleUnsafe(vModule, 40, '', NULL, 'LandmarkControl') INTO vTemp;
+    RETURN vModule;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: addmoduleexam(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.addmoduleexam(integer, integer);
+CREATE OR REPLACE FUNCTION public.addmoduleexam(pteacherid integer, pdisciplineid integer)
+ RETURNS integer
+AS $$
+    DECLARE vModule INT DEFAULT -1; vChecker INT DEFAULT -1;
+    vIsExamExists BOOLEAN;
+begin
+--	select public.addmoduleexam(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+    IF (NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
+        InternalIsMapLocked(pDisciplineID))
+    THEN
+        RETURN -1;
+    END IF;
+
+    RETURN AddModuleExamUnsafe(pDisciplineID);
+END 
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: addmodulebonus(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.addmodulebonus(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.addmodulebonus(pteacherid integer, pdisciplineid integer)
+ RETURNS integer
+AS $$
+    DECLARE vChecker INT DEFAULT -1; vModuleID INT DEFAULT -1;
+begin
+--	select public.addmodulebonus(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+    IF  (NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
+        InternalIsMapLocked(pDisciplineID))
+    THEN
+        RETURN -1;
+    END IF;
+    -- check existing of bonus module
+    SELECT modules.ID INTO vChecker
+        FROM modules
+        WHERE   modules.DisciplineID = pDisciplineID AND
+                modules.Type = 'bonus';
+    IF vChecker > 0 THEN
+        RETURN -2;
+    END IF;
+
+    INSERT INTO modules
+        (Name, OrderNum, DisciplineID, Type)
+        VALUES  ('Бонусные баллы' , 2141692 , pDisciplineID, 'bonus') RETURNING ID into  vModuleID;
+    vChecker := AddSubmodule(pTeacherID, vModuleID, 10, '', NULL, 'LandmarkControl');
+    RETURN 0; -- почему???
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: getdisciplinetypeexam(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getdisciplinetypeexam(integer);
+
+CREATE OR REPLACE FUNCTION public.getdisciplinetypeexam(pdisciplineid integer)
+ RETURNS exam_credit_grading_credit
+AS $$ 
+--select public.getdisciplinetypeexam(
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+       select examtype 
+          from disciplines 
+          where id=pdisciplineid;
+ $$  LANGUAGE sql;
+
+--
+-- Name: getdisciplineproperty(integer, grade_subject_author_semester_milestone_type_maxrate); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getdisciplineproperty(integer, grade_subject_author_semester_milestone_type_maxrate); 
+
+CREATE OR REPLACE FUNCTION public.getdisciplineproperty(pdisciplineid integer, ptype grade_subject_author_semester_milestone_type_maxrate)
+ RETURNS integer
+AS $$
+    DECLARE vRes INT DEFAULT -1;
+begin
+--	select public.getdisciplineproperty(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:ptype 	-- put the ptype parameter value instead of 'ptype' (grade_subject_author_semester_milestone_type_maxrate)
+--);
+    SELECT CASE pType
+            WHEN 'semester' THEN disciplines.SemesterID
+            WHEN 'author' THEN disciplines.AuthorID
+            WHEN 'grade' THEN disciplines.GradeID
+            WHEN 'subject' THEN disciplines.SubjectID
+            WHEN 'milestone' THEN disciplines.Milestone
+         --   WHEN 'type' THEN cast (disciplines.ExamType as integer) +0
+            WHEN 'maxrate' THEN disciplines.MaxRate
+            else -1
+        END INTO vRes
+        FROM disciplines
+        WHERE disciplines.ID = pDisciplineID
+        LIMIT 1;
+     RETURN vRes;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: calculatemaxrateforextra(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.calculatemaxrateforextra(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.calculatemaxrateforextra(pdisciplineid integer, pRecordBookID integer)
+ RETURNS integer
+AS $$
+    DECLARE vExamType exam_credit_grading_credit DEFAULT NULL;
+    vDiscID INT DEFAULT 0; vLim INT DEFAULT 0; vResult INT DEFAULT 0;
+BEGIN
+--select public.calculatemaxrateforextra(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pRecordBookID 	-- put the pRecordBookID parameter value instead of 'pRecordBookID' (int4)
+--);
+    -- get disc type
+    --vExamType := GetDisciplineProperty(pDisciplineID, 'type');
+    vExamType := GetDisciplineTypeExam(pDisciplineID);
+    -- submodule doesn't exists
+    IF vExamType IS NULL --OR vExamType <= 0 
+    THEN
+        RETURN -1;
+    END IF;
+    vLim := CASE WHEN vExamType = 'exam' THEN  38 ELSE  60 END;
+
+    SELECT SUM(CASE WHEN view_roadmap.ModuleType = 'regular' THEN  rating_table.Rate ELSE  0 END) INTO vResult
+        FROM view_roadmap
+        LEFT JOIN rating_table
+        --ON rating_table.StudentID = pStudentID AND
+        ON rating_table.recordbookid = pRecordBookID AND
+                                    rating_table.SubmoduleID = view_roadmap.SubmoduleID
+        WHERE view_roadmap.DisciplineID = pDisciplineID
+        LIMIT 1;
+    RETURN vLim - vResult;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: changemodulename(integer, integer, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.changemodulename(integer, integer, character varying);
+
+CREATE OR REPLACE FUNCTION public.changemodulename(pteacherid integer, pmoduleid integer, pname character varying)
+ RETURNS integer
+AS $$
+    DECLARE vDisciplineID INT DEFAULT -1;
+    vAlreadySameName BOOL DEFAULT FALSE;
+    rowUpd int;
+BEGIN
+--select public.changesubmoduledescription(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:psubmoduleid,	-- put the psubmoduleid parameter value instead of 'psubmoduleid' (int4)
+--	:pdescription 	-- put the pdescription parameter value instead of 'pdescription' (varchar)
+--);
+
+     SELECT DisciplineID FROM modules WHERE ID = pModuleID LIMIT 1 into vDisciplineID;
+    IF InternalIsMapLocked(vDisciplineID) THEN
+        RETURN -1;
+    END IF;
+
+    -- Bodging, strange row_count() behaviour in some cases.
+    -- i.e. update 1 module row. In case it's new and old names are same, row_count value may be 0.
+    vAlreadySameName := EXISTS(
+        SELECT * FROM modules
+        WHERE modules.ID = pModuleID AND modules.Type = 'regular' AND modules.Name = pName
+        LIMIT 1
+    );
+    IF vAlreadySameName THEN
+        return 0;
+    END IF;
+
+    UPDATE modules
+        SET modules.Name = pName
+        WHERE modules.ID = pModuleID AND modules.Type = 'regular';
+        --LIMIT 1;
+        get diagnostics rowUpd = ROW_COUNT;
+    RETURN rowUpd-1;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: changesubmoduledescription(integer, integer, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.changesubmoduledescription(integer, integer, character varying);
+
+CREATE OR REPLACE FUNCTION public.changesubmoduledescription(pteacherid integer, psubmoduleid integer, pdescription character varying)
+ RETURNS integer
+AS $$
+    DECLARE vIsLocked INT DEFAULT -1;
+	declare test int default 0;
+BEGIN
+--select public.changesubmoduledescription(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:psubmoduleid,	-- put the psubmoduleid parameter value instead of 'psubmoduleid' (int4)
+--	:pdescription 	-- put the pdescription parameter value instead of 'pdescription' (varchar)
+--);
+
+    SELECT disciplines.IsLocked INTO vIsLocked
+        FROM view_roadmap
+        INNER JOIN disciplines ON disciplines.ID = view_roadmap.DisciplineID
+        WHERE   view_roadmap.SubmoduleID = pSubmoduleID AND disciplines.AuthorID = pTeacherID
+        LIMIT 1;
+    IF  vIsLocked != 0 THEN
+        RETURN -1;
+    END IF;
+
+    UPDATE submodules
+        SET submodules.Description  = pDescription
+        WHERE submodules.ID = pSubmoduleID;	    
+        --LIMIT 1;
+    RETURN 0;
+END;
+
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: changesubmodulemaxandcontrol(integer, integer, integer, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.changesubmodulemaxandcontrol(integer, integer, integer, character varying);
+
+CREATE OR REPLACE FUNCTION public.changesubmodulemaxandcontrol(pteacherid integer, psubmoduleid integer, pmaxrate integer, pcontroltype character varying)
+ RETURNS integer
+AS $$
+    DECLARE vChecker INT DEFAULT -1; 
+   			vDisciplineID INT DEFAULT -1; 
+   			vIsLocked INT DEFAULT -1; 
+   			vNewDiscMaxRate INT DEFAULT -1; 
+   			vCurRate INT DEFAULT -1;
+   		    rowUpd INT;
+BEGIN
+--select public.changesubmodulemaxandcontrol(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:psubmoduleid,	-- put the psubmoduleid parameter value instead of 'psubmoduleid' (int4)
+--	:pmaxrate,	-- put the pmaxrate parameter value instead of 'pmaxrate' (int4)
+--	:pcontroltype 	-- put the pcontroltype parameter value instead of 'pcontroltype' (varchar)
+--);
+    -- check that discipline and submodule exists and doesn't locked
+    SELECT  disciplines.IsLocked,
+            disciplines.MaxRate - submodules.MaxRate + pMaxRate
+            INTO vIsLocked, vNewDiscMaxRate
+        FROM submodules
+        INNER JOIN modules        ON  submodules.ModuleID = modules.ID
+        INNER JOIN disciplines    ON  disciplines.ID = modules.DisciplineID
+        WHERE submodules.ID = pSubmoduleID AND
+              disciplines.AuthorID = pTeacherID
+        LIMIT 1;
+    IF  vIsLocked != 0 OR
+        vNewDiscMaxRate > 100
+    THEN
+        RETURN -1;
+    END IF;
+
+    UPDATE submodules
+        SET     submodules.MaxRate = pMaxRate,
+                submodules.Type = pControlType
+        WHERE submodules.ID = pSubmoduleID;
+        --LIMIT 1;
+    get diagnostics rowUpd = ROW_COUNT;
+    RETURN rowUpd-1;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: changesubmodulename(integer, integer, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.changesubmodulename(integer, integer, character varying);
+
+CREATE OR REPLACE FUNCTION public.changesubmodulename(pteacherid integer, psubmoduleid integer, pname character varying)
+ RETURNS integer
+AS $$
+
+    DECLARE vIsLocked INT DEFAULT -1;
+BEGIN
+--select public.changesubmodulename(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:psubmoduleid,	-- put the psubmoduleid parameter value instead of 'psubmoduleid' (int4)
+--	:pname 	-- put the pname parameter value instead of 'pname' (varchar)
+--);
+
+    SELECT disciplines.IsLocked INTO vIsLocked
+        FROM view_roadmap
+        INNER JOIN disciplines ON  disciplines.ID = view_roadmap.DisciplineID
+        WHERE  view_roadmap.SubmoduleID = pSubmoduleID AND disciplines.AuthorID = pTeacherID
+        LIMIT 1;
+    IF  vIsLocked != 0 THEN
+        RETURN -1;
+    END IF;
+
+    UPDATE submodules
+        SET submodules.Name = pName
+        WHERE submodules.ID = pSubmoduleID;
+        --LIMIT 1;
+    RETURN 0;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: createrequest(integer, character varying, text, boolean); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.createrequest(integer, character varying, text, boolean);
+
+CREATE OR REPLACE FUNCTION public.createrequest(paccountid integer, ptitle character varying, pdescription text, pimage boolean)
+ RETURNS integer
+AS $$
+declare ROWID integer; hi integer default 0;
+begin
+--	select public.createrequest(
+--	:paccountid,	-- put the paccountid parameter value instead of 'paccountid' (int4)
+--	:ptitle,	-- put the ptitle parameter value instead of 'ptitle' (varchar)
+--	:pdescription,	-- put the pdescription parameter value instead of 'pdescription' (text)
+--	:pimage 	-- put the pimage parameter value instead of 'pimage' (bool)
+--);
+
+    --DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+    
+    if pImage then hi=1; --несовпадение типов boolean и integer
+    end if;
+    
+    INSERT INTO requests (AccountID, Title, Description, Status, HasImage)
+         --  VALUES  (pAccountID, pTitle, pDescription, 'opened', pImage) 
+         VALUES  (pAccountID, pTitle, pDescription, 'opened', hi) 
+           returning id into rowid;
+    RETURN rowid;
+   exception
+   when others then return -1;
+   
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: deletemodule(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.deletemodule(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.deletemodule(pteacherid integer, pmoduleid integer)
+ RETURNS integer
+AS $$
+    DECLARE vDisciplineID INT DEFAULT -1;
+    curs cursor for select  id from modules   WHERE   modules.DisciplineID = vDisciplineID AND
+                modules.Type = 'regular'
+        ORDER BY modules.OrderNum ASC;
+       counter int;
+BEGIN
+--select public.deletemodule(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pmoduleid 	-- put the pmoduleid parameter value instead of 'pmoduleid' (int4)
+--);
+
+    -- get discipline ID
+        SELECT disciplines.ID FROM modules
+        INNER JOIN disciplines    ON  modules.DisciplineID = disciplines.ID AND disciplines.AuthorID = pTeacherID
+        WHERE modules.ID = pModuleID LIMIT 1
+into vDisciplineID;
+
+    -- check rights
+    if NOT InternalIsTeacherAuthor(pTeacherID, vDisciplineID) OR
+        InternalIsMapLocked(vDisciplineID)
+    THEN
+        RETURN -1;
+    END if;
+
+    DELETE FROM submodules
+        WHERE submodules.ModuleID = pModuleID;
+    DELETE FROM modules
+        WHERE modules.ID = pModuleID;
+
+    -- restore continuous ordering
+    --нужно сделать через курсор
+    set counter = 0;
+   for rec in curs loop
+     counter = counter + 1;
+     update modules set modules.OrderNum  = counter WHERE CURRENT of curs;
+   end loop;
+    /*update modules
+        SET modules.OrderNum = (counter = counter + 1)
+        WHERE   modules.DisciplineID = vDisciplineID AND
+                modules.Type = 'regular';
+    select modules
+        ORDER BY modules.OrderNum ASC;
+*/
+    RETURN 0;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: deletemodulebonus(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.deletemodulebonus(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.deletemodulebonus(pteacherid integer, pdisciplineid integer)
+ RETURNS integer
+AS $$
+    DECLARE vBonusModuleID INT DEFAULT -1;
+begin
+--	select public.deletemodulebonus(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+
+    CASE WHEN  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
+        InternalIsMapLocked(pDisciplineID)
+    THEN
+        RETURN -1;
+	else null;	
+    END CASE;
+
+    CASE WHEN GetBonusModule(pDisciplineID) <= 0 THEN
+        RETURN -1;
+	else null;	
+    END CASE;
+
+    DELETE FROM submodules
+        WHERE vBonusModuleID = submodules.ModuleID;
+
+    DELETE FROM modules
+        WHERE vBonusModuleID = modules.ID;
+        --LIMIT 1;
+
+    RETURN 0;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: deletesubmodule(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.deletesubmodule(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.deletesubmodule(pteacherid integer, psubmoduleid integer)
+ RETURNS integer
+AS $$
+
+    DECLARE vIsLocked INT DEFAULT -1; vModuleID INT DEFAULT -1;
+            counter INT;
+            curs cursor for 
+              select ID from submodules 
+                        where submodules.ModuleID = vModuleID
+             			ORDER BY submodules.OrderNum ASC;
+BEGIN
+--select public.deletesubmodule(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:psubmoduleid 	-- put the psubmoduleid parameter value instead of 'psubmoduleid' (int4)
+--);
+    SELECT modules.ID, disciplines.IsLocked
+        INTO vModuleID, vIsLocked
+        FROM submodules
+        INNER JOIN modules ON modules.ID = submodules.ModuleID
+        INNER JOIN disciplines ON modules.DisciplineID = disciplines.ID
+        WHERE   disciplines.AuthorID = pTeacherID AND
+                submodules.ID = pSubmoduleID
+        LIMIT 1;
+    IF  vIsLocked != 0 THEN
+        RETURN -1;
+    END IF;
+
+    -- handler will catch constraint violation
+    DELETE FROM submodules
+        WHERE submodules.ID = pSubmoduleID;
+        --LIMIT 1;
+
+    -- restore continuous ordering
+    counter = 0;
+     for rec in curs loop
+     counter = counter + 1;
+     update sumodules set submodules.OrderNum  = counter WHERE CURRENT of curs;
+   end loop;
+   /* UPDATE submodules
+        SET submodules.OrderNum = (counter = counter + 1)
+        WHERE   submodules.ModuleID = vModuleID;
+        
+    select submodules
+        ORDER BY submodules.OrderNum ASC;
+*/
+    RETURN 0;
+    exception 
+    when others then return -1;
+END
+$$ LANGUAGE plpgsql;
+
+--
+-- Name: department_getidbyexternalid(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.department_getidbyexternalid(character varying);
+
+CREATE OR REPLACE FUNCTION public.department_getidbyexternalid(pdepartmentexternalid character varying)
+ RETURNS integer
+AS $$
+--select public.department_getidbyexternalid(
+--	:pdepartmentexternalid 	-- put the pdepartmentexternalid parameter value instead of 'pdepartmentexternalid' (varchar)
+--);
+  SELECT departments.ID as ID
+  FROM departments
+  WHERE departments.ExternalID = pDepartmentExternalID; --поле unique
+$$  LANGUAGE sql;
+
+--
+-- Name: department_getidbyname(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.department_getidbyname(character varying);
+
+CREATE OR REPLACE FUNCTION public.department_getidbyname(pdepartmentname character varying)
+ RETURNS setof integer
+AS $$
+--	select public.department_getidbyname(
+--	:pdepartmentname 	-- put the pdepartmentname parameter value instead of 'pdepartmentname' (varchar)
+--);
+  SELECT departments.ID as ID
+  FROM departments
+  WHERE departments.Name = pDepartmentName;
+$$  LANGUAGE sql;
+
+--
+-- Name: department_search(character varying, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.department_search(character varying, integer);
+
+CREATE OR REPLACE FUNCTION public.department_search(pname character varying, pfacultyid integer)
+ RETURNS integer
+AS $$
+BEGIN
+--	select public.department_search(
+--	:pname,	-- put the pname parameter value instead of 'pname' (varchar)
+--	:pfacultyid 	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--);
+RETURN COALESCE((
+    SELECT departments.ID FROM departments
+    WHERE   departments.Name = pName AND departments.FacultyID = pFacultyID LIMIT 1
+), -1);
+END
+$$   LANGUAGE plpgsql;
+
+--
+-- Name: discipline_countratings(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_countratings(integer);
+
+CREATE OR REPLACE FUNCTION public.discipline_countratings(pdisciplineid integer)
+ RETURNS bigint
+AS $$
+--select public.discipline_countratings(
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+    SELECT COUNT(rating_table.recordbookid) FROM view_roadmap
+        LEFT JOIN rating_table ON rating_table.SubmoduleID = view_roadmap.SubmoduleID
+        WHERE view_roadmap.DisciplineID = pDisciplineID
+$$  language sql;
+
+--
+-- Name: getratesfordiscipline(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getratesfordiscipline(integer);
+
+CREATE OR REPLACE FUNCTION public.getratesfordiscipline(pdisciplineid integer)
+ RETURNS 
+ table (
+SubmoduleID integer
+,StudentID integer
+,Rate integer)
+AS $$
+    DECLARE vSemesterID INT DEFAULT -1;
+begin
+--	select * from  public.getratesfordiscipline(
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+    vSemesterID := GetDisciplineProperty(pDisciplineID, 'semester');
+
+     return QUERY SELECT  view_roadmap.SubmoduleID,
+            rating_table.recordbookid,
+            rating_table.Rate
+        FROM view_roadmap
+            LEFT JOIN rating_table ON rating_table.SubmoduleID = view_roadmap.SubmoduleID
+            INNER JOIN students_groups ON students_groups.SemesterID = vSemesterID AND
+                                            students_groups.recordbookid = rating_table.recordbookid
+            WHERE view_roadmap.DisciplineID = pDisciplineID;
+            --ORDER BY rating_table.recordbookid;
+     return;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: faculty_getidfromexternalid(varchar); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.faculty_getidfromexternalid(varchar); 
+
+CREATE OR REPLACE FUNCTION public.faculty_getidfromexternalid(pFacultyExternalID character varying)
+ RETURNS integer
+
+AS $$
+        DECLARE pID INT DEFAULT -1;
+begin
+--	select public.faculty_getidfromexternalid(
+--	:pFacultyExternalID	-- put the pFacultyExternalID parameter value instead of 'pFacultyExternalID' (varchar)
+--);
+        SELECT faculties.ID INTO pID
+        FROM faculties
+        WHERE faculties.ExternalID = pFacultyExternalID
+        LIMIT 1; -- скорее всего не требуется
+        RETURN pID;
+    END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: faculty_update(integer,  text, text,  text); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.faculty_update(integer,  text, text,  text);
+
+CREATE OR REPLACE FUNCTION public.faculty_update(pfacultyid integer, pfacultyexternalid text, pfacultyname text, pfacultyabbr text)
+ RETURNS integer
+AS $$ 
+begin
+--	select public.faculty_update(
+--	:pfacultyid,	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--	:pfacultyexternalid,	-- put the pfacultyexternalid parameter value instead of 'pfacultyexternalid' (text)
+--	:pfacultyname,	-- put the pfacultyname parameter value instead of 'pfacultyname' (text)
+--	:pfacultyabbr 	-- put the pfacultyabbr parameter value instead of 'pfacultyabbr' (text)
+--);
+  IF pFacultyExternalID IS NOT NULL THEN
+    UPDATE faculties SET ExternalID = pFacultyExternalID WHERE ID = pFacultyID;
+  END IF;
+
+  IF pFacultyName IS NOT NULL THEN
+    UPDATE faculties SET Name = pFacultyName WHERE ID = pFacultyID;
+  END IF;
+
+  IF pFacultyAbbr IS NOT NULL THEN
+    UPDATE faculties SET Abbr = pFacultyAbbr WHERE ID = pFacultyID;
+  END IF;
+
+  RETURN pFacultyID;
+  EXCEPTION 
+  when others then 
+    RETURN -1;
+END
+$$  LANGUAGE plpgsql;
+ 
+--
+-- Name: faculty_create(integer,  text, text,  text); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.faculty_create(  text, text,  text);
+
+ CREATE OR REPLACE FUNCTION public.faculty_create(
+  pFacultyExternalID TEXT,
+  pFacultyName TEXT,
+  pFacultyAbbr TEXT
+)
+RETURNS INT
+AS $$ 
+  DECLARE vInnerID integer DEFAULT -1;
+begin
+--	select public.faculty_create(
+--	:pfacultyexternalid,	-- put the pfacultyexternalid parameter value instead of 'pfacultyexternalid' (text)
+--	:pfacultyname,	-- put the pfacultyname parameter value instead of 'pfacultyname' (text)
+--	:pfacultyabbr 	-- put the pfacultyabbr parameter value instead of 'pfacultyabbr' (text)
+--);
+  SELECT faculties.id  into vInnerID
+            FROM faculties
+            WHERE faculties.externalid LIKE pFacultyExternalID OR faculties."name" LIKE pFacultyName
+            LIMIT 1  ;
+
+  IF vInnerID IS NULL THEN
+    INSERT INTO faculties (ExternalID, "name", Abbr) VALUES (pFacultyExternalID, pFacultyName, pFacultyAbbr) 
+       returning id into vInnerID;
+    RETURN vInnnerID;
+  ELSE
+    RETURN (SELECT Faculty_Update(vInnerID, pFacultyExternalID, pFacultyName, pFacultyAbbr));
+  END IF;
+ EXCEPTION 
+ when others then
+ RETURN -1;
+END
+$$ LANGUAGE plpgsql;
+
+--
+-- Name: creategroup(integer, integer, character varying, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.creategroup(integer, integer, character varying, integer, integer);
+
+CREATE OR REPLACE FUNCTION public.creategroup(
+   pgradeid integer, 
+   pgroupnum integer, 
+   pSpecName character varying, 
+   pFacultyID integer, 
+   pyear integer)
+ RETURNS integer
+AS $$
+ DECLARE vGroupID INT DEFAULT null; 
+         vSpecId INT DEFAULT null; 
+         vGroupYear INT DEFAULT null; 
+         vIsSpecMatch INT DEFAULT null;
+   
+BEGIN
+--select public.creategroup(
+--	:pgradeid,	-- put the pgradeid parameter value instead of 'pgradeid' (int4)
+--	:pgroupnum,	-- put the pgroupnum parameter value instead of 'pgroupnum' (int4)
+--	:pspecname,	-- put the pspecname parameter value instead of 'pspecname' (varchar)
+--	:pfacultyid,	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--	:pyear 	-- put the pyear parameter value instead of 'pyear' (int4)
+--);    
+-- create specialization vSpecId - UNIQUE (pSpecName,pFacultyID)
+    select specializations.id into vSpecId
+           from specializations
+           where specializations.facultyid=pFacultyID and specializations."name" like pSpecName;
+    if (vSpecId is null) then
+         INSERT INTO specializations (Name, Abbr, FacultyID) 
+         VALUES  (pSpecName, NULL, pFacultyID)
+         returning id into vSpecId;
+    end if;
+
+-- create group  vGroupID - UNIQUE (pGradeID, pGroupNum, pFacultyID)
+    select study_groups.id into vGroupID 
+           from study_groups
+           where study_groups.gradeid=pgradeID 
+           		 and study_groups.groupnum= pGroupNum
+           		 and study_groups.facultyid=pFacultyID;
+    if ( vGroupID  is null) then
+        INSERT INTO study_groups (GradeID, GroupNum, FacultyID) 
+               VALUES (pGradeID, pGroupNum, pFacultyID)
+               returning id into  vGroupID ;
+    end if;
+
+    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 is null) THEN
+        INSERT INTO groups_years (GroupID, Year, SpecializationID)
+        VALUES (vGroupID, pYear, vSpecId);
+    ELSEIF NOT vIsSpecMatch THEN
+        RETURN -1;
+    END IF;
+
+    RETURN vGroupID;
+   EXCEPTION 
+   		when others then 
+   			RETURN -1;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: department_create_with_externalid(character varying, text, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.department_create_with_externalid(character varying, text, character varying);
+
+CREATE OR REPLACE FUNCTION public.department_create_with_externalid(
+  pDepartmentExternalID VARCHAR,
+  pDepartmentName TEXT,
+  pFacultyExternalID VARCHAR 
+)
+RETURNS INT
+AS $$ 
+  DECLARE vInnerID INT default null; vFacultyInnerID INT DEFAULT null;
+begin
+--	select public.department_create_with_externalid(
+--	:pdepartmentexternalid,	-- put the pdepartmentexternalid parameter value instead of 'pdepartmentexternalid' (varchar)
+--	:pdepartmentname,	-- put the pdepartmentname parameter value instead of 'pdepartmentname' (text)
+--	:pfacultyexternalid 	-- put the pfacultyexternalid parameter value instead of 'pfacultyexternalid' (varchar)
+--);
+  vFacultyInnerID = Faculty_GetIdByExternalID(pFacultyExternalID);
+  IF vFacultyInnerID IS NULL THEN
+    RETURN -2;
+  END IF;
+
+ SELECT ID into  vInnerID
+           FROM departments
+           WHERE departments.ExternalID LIKE pDepartmentExternalID OR departments.Name LIKE pDepartmentName
+           LIMIT 1;
+
+  IF vInnerID IS NULL THEN
+    INSERT INTO departments (ExternalID, Name, FacultyID) 
+           VALUES (pDepartmentExternalID, pDepartmentName, vFacultyInnerID) returning id into vInnerID;
+    RETURN vInnerID;
+  else
+     SELECT Department_Update(vInnerID, pDepartmentExternalID, pDepartmentName, vFacultyInnerID) into vInnerID;
+    RETURN vInnerID;
+  END IF;
+ EXCEPTION 
+  when others then RETURN -1;
+END
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: jobposition_create(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.jobposition_create(character varying);
+
+ CREATE OR REPLACE FUNCTION public.jobposition_create(pjobpositionname character varying)
+ RETURNS integer
+AS $$
+declare vInsertID integer;
+begin
+--	select public.jobposition_create(
+--	:pjobpositionname 	-- put the pjobpositionname parameter value instead of 'pjobpositionname' (varchar)
+--);
+  INSERT INTO job_positions (Name) VALUES (pJobPositionName) returning id into vInsertID;
+  RETURN vInsertID;
+ exception
+  when others then RETURN -1;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: recordbook_getidfromexternalid(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.recordbook_getidfromexternalid(character varying);
+
+CREATE OR REPLACE FUNCTION public.recordbook_getidfromexternalid(
+   pRecordBookExternalID VARCHAR
+)
+RETURNS INT
+AS $$ 
+DECLARE pID INT DEFAULT null;
+begin
+--	select public.recordbook_getidfromexternalid(
+--	:precordbookexternalid 	-- put the precordbookexternalid parameter value instead of 'precordbookexternalid' (varchar)
+--);
+
+        SELECT record_books.ID INTO pID
+        FROM record_books
+        WHERE record_books.ExternalID = pRecordBookExternalID
+        LIMIT 1;
+		if pID is null then return -1;
+        else  RETURN pID;
+        end if; 
+    END
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: signinbytoken(character); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.signinbytoken(character);
+
+ CREATE OR REPLACE FUNCTION public.signinbytoken(ptoken character)
+ RETURNS integer
+
+AS $$
+
+    DECLARE vAccountID INT DEFAULT -1;
+BEGIN
+--select public.signinbytoken(
+--	:ptoken 	-- put the ptoken parameter value instead of 'ptoken' (bpchar)
+--);
+    SELECT auth_tokens.AccountID INTO vAccountID
+        FROM auth_tokens
+        WHERE auth_tokens.Token = pToken;
+        --LIMIT 1;
+
+    IF vAccountID is null THEN
+        RETURN -1; -- token not found
+    END IF;
+
+    UPDATE auth_tokens
+        SET Accessed = CURRENT_TIMESTAMP
+        WHERE auth_tokens.Token = pToken;
+        --LIMIT 1;
+
+    INSERT INTO logs_signin(AccountID) VALUES (vAccountID);
+    RETURN vAccountID;
+END;
+$$  LANGUAGE plpgsql;
+ 
+--
+-- Name: internalisstudentattached(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+
+DROP FUNCTION IF EXISTS public.internalisstudentattached(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.internalisstudentattached(pstudentid integer, pdisciplineid integer)
+ RETURNS boolean
+
+AS $$
+    DECLARE vAttachType attach_detach DEFAULT 'detach';
+BEGIN
+--select public.internalisstudentattached(
+--	:pstudentid,	-- put the pstudentid parameter value instead of 'pstudentid' (int4)
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+
+    SELECT view_disciplines_recordbooks.Type INTO vAttachType
+    FROM view_disciplines_recordbooks
+    WHERE view_disciplines_recordbooks.RecordBookID = pRecordBookID AND
+          view_disciplines_recordbooks.DisciplineID = pDisciplineID
+    LIMIT 1;
+	RETURN 'attach' = COALESCE(vAttachType, 'attach');
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: Discipline_SetExamPeriodOption(integer, integer, absence_pass); Type: FUNCTION; Schema: public; Owner: -
+--
+
+DROP FUNCTION IF EXISTS public.Discipline_SetExamPeriodOption(integer, integer, absence_pass);
+
+CREATE or REPLACE FUNCTION public.Discipline_SetExamPeriodOption(
+    pRecordBookID INT,
+    pSubmoduleID INT,
+    pType absence_pass default null
+) RETURNS int
+AS $$
+ DECLARE vType INT DEFAULT NULL;
+BEGIN
+--select public.discipline_setexamperiodoption(
+--	:precordbookid,	-- put the precordbookid parameter value instead of 'precordbookid' (int4)
+--	:psubmoduleid,	-- put the psubmoduleid parameter value instead of 'psubmoduleid' (int4)
+--	:ptype 	-- put the ptype parameter value instead of 'ptype' (absence_pass)
+--);
+    IF pType is not null THEN
+         vType = pType;
+    END IF;
+
+    INSERT INTO exam_period_options (RecordBookID, SubmoduleID, Type) VALUES(pRecordBookID, pSubmoduleID, vType)
+        ON  conflict ON CONSTRAINT  exam_period_options_recordbookid_submoduleid_key
+          do update set  exam_period_options.Type = vType;
+
+    RETURN 0;
+   EXCEPTION 
+  		 when others 
+  			  then RETURN -1;
+end
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: getstudentgroup(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getstudentgroup(integer, integer); 
+
+CREATE OR REPLACE FUNCTION public.getstudentgroup(precordbookID integer, psemesterid integer)
+ RETURNS integer
+AS $$
+begin
+--	select public.GetStudentGroup(
+--	:pRecordBookID,	-- put the pRecordBookID parameter value instead of 'pRecordBookID' (INT)
+--	:pSemesterID 	-- put the pSemesterID parameter value instead of 'pSemesterID' (INT)
+--);
+
+RETURN COALESCE((
+    SELECT students_groups.GroupID FROM students_groups
+        join record_books on record_books.id=students_groups.recordbookid
+        WHERE   record_books.id=precordbookID
+                AND students_groups.SemesterID = pSemesterID
+                AND students_groups.State != 'expulsion'
+        LIMIT 1
+), -1);
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: subject_create(integer, text, varchar, varchar); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.subject_create(integer, text, varchar, varchar);
+
+CREATE OR REPLACE FUNCTION public.subject_create(pfacultyid integer, psubjectname text, psubjectabbr character varying, pexternalid character varying)
+ RETURNS integer
+AS $$ 
+    DECLARE vSubjectID INT DEFAULT -1;
+begin
+--	select public.subject_create(
+--	:pfacultyid,	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--	:psubjectname,	-- put the psubjectname parameter value instead of 'psubjectname' (text)
+--	:psubjectabbr,	-- put the psubjectabbr parameter value instead of 'psubjectabbr' (varchar)
+--	:pexternalid 	-- put the pexternalid parameter value instead of 'pexternalid' (varchar)
+--);
+    IF pSubjectName = '' THEN RETURN -1; END IF;
+-- create/get subject (subject name is unique key)
+    INSERT INTO subjects (Name, Abbr, ExternalID) VALUES (pSubjectName, pSubjectAbbr, pExternalID)
+        ON conflict on constraint subjects_name_key
+        do update set
+          --  subjects.ID = LAST_INSERT_ID(subjects.ID),
+            subjects.Name = pSubjectName,
+            subjects.Abbr = COALESCE(pSubjectAbbr, subjects.Abbr),
+            subjects.ExternalID = COALESCE(pExternalID, subjects.ExternalID)
+           returning id into vSubjectID; -- должно вернуть или новый ID или ID измененной записи
+    BEGIN --handler block
+      
+        INSERT INTO subjects_faculties (SubjectID, FacultyID) VALUES (vSubjectID, pFacultyID)
+            on conflict on constraint subjects_faculties_subjectid_facultyid_key --just stub
+               do nothing; 
+       EXCEPTION 
+       when others then RETURN -1;        
+    END;
+    RETURN vSubjectID;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: sha1(varchar); Type: FUNCTION; Schema: public; Owner: -
+-- для шифровки пароля
+--
+DROP FUNCTION IF EXISTS public.sha1(varchar);
+
+CREATE OR REPLACE FUNCTION public.sha1(
+password varchar)
+RETURNS varchar
+AS $$ 
+ SELECT ENCODE(DIGEST(password,'sha1'),'hex');
+$$ LANGUAGE sql;
+
+--
+-- Name: signin(character varying, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.signin(character varying, character varying);
+
+CREATE OR REPLACE FUNCTION public.signin(ploginormail character varying, ppassword character varying)
+ RETURNS integer
+
+AS $$
+    DECLARE vAccountID INT DEFAULT -1;
+BEGIN
+--select public.signin(
+--	:ploginormail,	-- put the ploginormail parameter value instead of 'ploginormail' (varchar)
+--	:ppassword 	-- put the ppassword parameter value instead of 'ppassword' (varchar)
+--);
+    --check account existence
+    SELECT accounts.ID INTO vAccountID FROM accounts
+        WHERE   accounts.Password = SHA1(pPassword) AND
+                (accounts.Login = pLoginOrMail OR accounts.EMail = pLoginOrMail)
+        LIMIT 1;
+    IF vAccountID is null THEN
+        RETURN -1;
+    END IF;
+
+    INSERT INTO logs_signin (AccountID) VALUES (vAccountID);
+    RETURN vAccountID;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: subject_getbyexternalid(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.subject_getbyexternalid(character varying);
+
+CREATE OR REPLACE FUNCTION public.subject_getbyexternalid(psubjectexternalid character varying)
+ RETURNS integer
+
+AS $$
+    DECLARE vID INT DEFAULT -1;
+begin
+--	select public.subject_getbyexternalid(
+--	:psubjectexternalid 	-- put the psubjectexternalid parameter value instead of 'psubjectexternalid' (varchar)
+--);
+    SELECT subjects.ID INTO vID
+    FROM subjects
+    WHERE subjects.ExternalID = pSubjectExternalID
+    LIMIT 1;
+  if vID is null then return -1;
+    else  RETURN vID;
+   end if;
+END
+ $$  LANGUAGE plpgsql;
+ 
+ --
+-- Name: account_createactivated(character varying,character varying,character varying,character varying,character varying,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.account_createactivated(character varying,character varying,character varying,character varying,character varying,integer);
+ 
+ CREATE OR REPLACE FUNCTION public.account_createactivated(
+plastname character varying, 
+pfirstname character varying, 
+psecondname character varying, 
+pexternalid character varying,
+pINILA character varying,
+puserroleid integer)
+ RETURNS integer
+AS $$
+declare vID int;
+begin
+--	select public.account_createactivated(
+--	:plastname,	-- put the plastname parameter value instead of 'plastname' (varchar)
+--	:pfirstname,	-- put the pfirstname parameter value instead of 'pfirstname' (varchar)
+--	:psecondname,	-- put the psecondname parameter value instead of 'psecondname' (varchar)
+--	:pexternalid,	-- put the pexternalid parameter value instead of 'pexternalid' (varchar)
+--	:pinila,	-- put the pinila parameter value instead of 'pinila' (varchar)
+--	:puserroleid 	-- put the puserroleid parameter value instead of 'puserroleid' (int4)
+--);
+
+        INSERT INTO accounts (ExternalID, INILA, Login , Password , EMail, LastName, FirstName, SecondName, UserRoleID)
+        VALUES  ( pExternalID,pINILA,NULL, NULL, NULL, pLastName, pFirstName, pSecondName, pUserRoleID) returning id into vID;
+        RETURN vID;
+END;
+$$  LANGUAGE plpgsql;
+ 
+--
+-- Name: account_getidfrominila(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.account_getidfrominila(character varying);
+
+CREATE OR REPLACE FUNCTION public.account_getidfrominila(
+ pAccountINILA VARCHAR
+)
+RETURNS INT
+
+AS $$ 
+  DECLARE pID INT DEFAULT -1;
+begin
+--	select public.account_getidfrominila(
+--	:paccountinila 	-- put the paccountinila parameter value instead of 'paccountinila' (varchar)
+--);
+        SELECT accounts.ID INTO pID
+        FROM accounts
+        WHERE accounts.INILA = pAccountINILA
+        LIMIT 1;
+         if pID is null then return -1;
+          else RETURN pID;
+         end if;
+    END
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: account_getidfromexternalid(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.account_getidfromexternalid(character varying);
+ 
+ CREATE OR REPLACE FUNCTION public.account_getidfromexternalid(
+ pAccountExternalID VARCHAR
+)
+RETURNS INT
+AS $$
+        DECLARE pID INT DEFAULT null;
+begin
+--	select public.account_getidfromexternalid(
+--	:paccountexternalid 	-- put the paccountexternalid parameter value instead of 'paccountexternalid' (varchar)
+--);
+        SELECT accounts.ID INTO pID
+        FROM accounts
+        WHERE accounts.ExternalID = pAccountExternalID
+        LIMIT 1;
+        if pID isnull then return -1;
+          else  RETURN pID;
+         
+         end if;
+    END
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: logbind(integer,integer,integer,attach_detach, group_student); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.logbind(integer,integer,integer,attach_detach, group_student);
+ 
+ CREATE OR REPLACE FUNCTION public.logbind(pdisciplineid integer, pteacherid integer, entityid integer, pattach attach_detach, ptype group_student)
+ RETURNS integer
+AS $$
+ declare countR int default 0;
+BEGIN 
+--	select public.logbind(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:entityid,	-- put the entityid parameter value instead of 'entityid' (int4)
+--	:pattach,	-- put the pattach parameter value instead of 'pattach' (attach_detach)
+--	:ptype 	-- put the ptype parameter value instead of 'ptype' (group_student)
+--);
+
+    IF pType = 'group' THEN
+        INSERT INTO logs_binds_groups
+            (DisciplineID, TeacherID, GroupID, Type)
+            VALUES (pDisciplineID, pTeacherID, EntityID, pAttach);
+    ELSEIF pType = 'student' THEN
+        INSERT INTO logs_binds_students
+            (DisciplineID, TeacherID, StudentID, Type)
+            VALUES (pDisciplineID, pTeacherID, EntityID, pAttach);
+    END IF;
+    get diagnostics countR = ROW_COUNT;
+    RETURN countR-1;
+   EXCEPTION 
+    when others then RETURN -1;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: bindgroup(integer,integer,integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.bindgroup(integer,integer,integer);
+
+CREATE OR REPLACE FUNCTION public.bindgroup(pteacherid integer, pdisciplineid integer, pgroupid integer)
+ RETURNS integer
+
+AS $$
+declare vres int;
+begin
+--	select public.bindgroup(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pgroupid,	-- put the pgroupid parameter value instead of 'pgroupid' (int4)
+--	:vres 	-- put the vres parameter value instead of 'vres' (int4)
+--);
+
+    -- todo: move to php layer
+   IF (pTeacherID IS NOT NULL AND NOT InternalIsTeacherBound(pTeacherID, pDisciplineID))
+       OR InternalIsMapLocked(pDisciplineID) THEN
+        RETURN -1;
+    END IF;
+    -- already bound
+   IF EXISTS(
+        SELECT * FROM disciplines_groups
+        WHERE disciplines_groups.DisciplineID = pDisciplineID AND disciplines_groups.GroupID = pGroupID
+    ) THEN
+        RETURN 1;
+    END IF;
+
+    -- bind whole group
+    INSERT INTO disciplines_groups (DisciplineID, GroupID) SELECT ( pDisciplineID, pGroupID );
+    SELECT LogBind(pDisciplineID, pTeacherID, pGroupID, 'attach', 'group') INTO vRes;
+    RETURN RemoveStudentsAttach(pDisciplineID, pGroupID); -- delete students of this group which were bound to discipline before
+    exception
+    when others then RETURN -3;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: controlstudentgroup(integer,integer,common_outlet_expulsion_leave,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.controlstudentgroup(integer,integer,common_outlet_expulsion_leave,integer);
+
+CREATE OR REPLACE FUNCTION public.controlstudentgroup(precordbookid integer, pgroupid integer, pstate common_outlet_expulsion_leave, psemesterid integer)
+ RETURNS integer
+
+AS $$ 
+DECLARE vChecker INT DEFAULT 0;
+begin
+--	select public.controlstudentgroup(
+--	:precordbookid,	-- put the precordbookid parameter value instead of 'precordbookid' (int4)
+--	:pgroupid,	-- put the pgroupid parameter value instead of 'pgroupid' (int4)
+--	:pstate,	-- put the pstate parameter value instead of 'pstate' (common_outlet_expulsion_leave)
+--	:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--);
+    INSERT INTO students_groups (RecordBookID, GroupID, SemesterID, State)
+        VALUES (pRecordBookID, pGroupID, pSemesterID, pState)
+        ON conflict on CONSTRAINT students_groups_semesterid_recordbookid_key
+          do update set
+            students_groups.GroupID = pGroupID,
+            students_groups.State = pState,
+            students_groups.Date = current_date;
+    get diagnostics vChecker=ROW_COUNT;
+    RETURN vchecker-1;
+   EXCEPTION 
+    when others then RETURN -1;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: departments_get(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+ DROP FUNCTION IF EXISTS public.departments_get(integer);
+ 
+ CREATE OR REPLACE FUNCTION public.departments_get(pfacultyid integer)
+ RETURNS SETOF departments
+AS $$ 
+begin
+--	select public.departments_get(
+--	:pfacultyid 	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--);
+  if (pFacultyID is null) or (pFacultyID = 0) THEN
+    SELECT departments.* FROM departments
+    ORDER BY departments.Name ASC;
+  ELSE
+    SELECT  departments.* -- ID, Name, FacultyID
+    FROM departments
+    WHERE departments.FacultyID = pFacultyID
+    ORDER BY departments.Name ASC;
+  END if;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: discipline_bindteacher(integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_bindteacher(integer,integer);
+ 
+CREATE OR REPLACE FUNCTION public.discipline_bindteacher(pdisciplineid integer, pbindingteacherid integer)
+ RETURNS integer
+AS $$ 
+BEGIN
+--select public.discipline_bindteacher(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pbindingteacherid 	-- put the pbindingteacherid parameter value instead of 'pbindingteacherid' (int4)
+--);
+
+--try to insert BindingTeacher in access list
+    INSERT INTO disciplines_teachers (DisciplineID, TeacherID) VALUES (pDisciplineID, pBindingTeacherID)
+     on conflict on constraint disciplines_teachers_disciplineid_teacherid_key --just stub
+               do nothing; 
+    RETURN 0;
+   EXCEPTION 
+    when others then RETURN -1;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: discipline_create(integer, integer, integer, exam_credit_grading_credit, integer, integer, integer, integer, integer, scientific_disciplinary_coursework); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_create(integer, integer, integer, exam_credit_grading_credit, integer, integer, integer, integer, integer, scientific_disciplinary_coursework);
+
+CREATE OR REPLACE FUNCTION public.discipline_create(pteacherid integer, pgradeid integer, psubjectid integer, pexamtype exam_credit_grading_credit, plecturecount integer, ppracticecount integer, plabcount integer, pfacultyid integer, psemesterid integer, psubtype scientific_disciplinary_coursework)
+ RETURNS integer
+
+AS $$
+    DECLARE vDisciplineID INT DEFAULT -1;
+    		vTemp int;
+begin
+--	select public.Discipline_Create(
+--	:pTeacherID,	-- put the pTeacherID parameter value instead of 'pTeacherID' (INT)
+--	:pGradeID,	-- put the pGradeID parameter value instead of 'pGradeID' (INT)
+--	:pSubjectID,	-- put the pSubjectID parameter value instead of 'pSubjectID' (INT)
+--	:pExamType,	-- put the pExamType parameter value instead of 'pExamType' (ENUM(15))
+--	:pLectureCount,	-- put the pLectureCount parameter value instead of 'pLectureCount' (INT)
+--	:pPracticeCount,	-- put the pPracticeCount parameter value instead of 'pPracticeCount' (INT)
+--	:pLabCount,	-- put the pLabCount parameter value instead of 'pLabCount' (INT)
+--	:pFacultyID,	-- put the pFacultyID parameter value instead of 'pFacultyID' (INT)
+--	:pSemesterID,	-- put the pSemesterID parameter value instead of 'pSemesterID' (INT)
+--	:pSubtype 	-- put the pSubtype parameter value instead of 'pSubtype' (ENUM(24))
+--);
+
+-- todo: make more flexible creation of coursework
+-- I mean, while creating scientific coursework
+--    we don't have the SubjectID field, but we must.
+--    346 is used as a default id for scientific courseworks.
+--    This constant is duplicated in Model_Helper_CourseWorkBuilder
+
+    IF pSubtype IS NOT NULL THEN
+        pSubjectID := 346;
+    END IF;
+    -- create discipline
+    INSERT INTO disciplines
+        ( AuthorID, GradeID, SubjectID, ExamType, LectureCount, PracticeCount,
+          LabCount, SemesterID, FacultyID, Subtype) 
+          VALUES
+        (pTeacherID, pGradeID, pSubjectID, pExamType, pLectureCount, pPracticeCount,
+         pLabCount, pSemesterID, pFacultyID, pSubtype)
+        returning ID into  vDisciplineID;
+    
+    SELECT Discipline_BindTeacher(vDisciplineID, pTeacherID) INTO vTemp;
+    -- add exam and extra modules
+    IF pExamType = 'exam' THEN
+        SELECT AddModuleExamUnsafe(vDisciplineID) INTO vTemp;
+    END IF;
+    SELECT AddModuleExtra(pTeacherID, vDisciplineID) INTO vTemp;
+
+    RETURN vDisciplineID;
+   EXCEPTION 
+   when others then RETURN -1;
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: discipline_delegate(integer, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_delegate(integer, integer, integer);
+
+CREATE OR REPLACE FUNCTION public.discipline_delegate(pdisciplineid integer, pnewauthorid integer, vtemp integer)
+ RETURNS integer
+
+AS $$
+ declare vtemp int;
+BEGIN  
+--	select public.discipline_delegate(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pnewauthorid,	-- put the pnewauthorid parameter value instead of 'pnewauthorid' (int4)
+--	:vtemp 	-- put the vtemp parameter value instead of 'vtemp' (int4)
+--);
+
+    SELECT Discipline_BindTeacher(pDisciplineID, pNewAuthorID) INTO vTemp;
+    UPDATE disciplines
+        SET disciplines.AuthorID = pNewAuthorID
+        WHERE disciplines.ID = pDisciplineID;
+    get diagnostics vtemp = ROW_COUNT;
+    RETURN vtemp-1;
+   EXCEPTION 
+   when others then RETURN -1;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: createaccount(character varying, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.createaccount(character varying, integer);
+
+CREATE OR REPLACE FUNCTION public.createaccount(pcode character varying, puserroleid integer)
+ RETURNS integer
+
+AS $$
+declare insID int;
+begin
+--	select public.createaccount(
+--	:pcode,	-- put the pcode parameter value instead of 'pcode' (varchar)
+--	:puserroleid 	-- put the puserroleid parameter value instead of 'puserroleid' (int4)
+--);
+
+    INSERT INTO accounts (Login , Password , EMail, UserRoleID, ActivationCode)
+        VALUES  ( NULL, NULL, NULL, pUserRoleID, pCode) returning ID into insID;
+    RETURN insID;
+END;
+$$  LANGUAGE plpgsql;
+
+
+--
+-- Name: createoraddstudent(character varying,  character varying,  character varying,  character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.createoraddstudent(character varying,  character varying,  character varying,  character varying);
+
+CREATE OR REPLACE FUNCTION public.createoraddstudent(pexternalid character varying, plastname character varying, pfirstname character varying, psecondname character varying)
+ RETURNS integer
+AS $$ 
+        DECLARE vAccountID INT DEFAULT -1; 
+                vStudentID INT DEFAULT -1;
+begin
+--	select public.createoraddstudent(
+--	:pexternalid,	-- put the pexternalid parameter value instead of 'pexternalid' (varchar)
+--	:plastname,	-- put the plastname parameter value instead of 'plastname' (varchar)
+--	:pfirstname,	-- put the pfirstname parameter value instead of 'pfirstname' (varchar)
+--	:psecondname 	-- put the psecondname parameter value instead of 'psecondname' (varchar)
+--);
+        vAccountID = CreateAccount(pLastName, pFirstName, pSecondName, null, GetUserRole('student'));
+
+        IF pExternalID is not null THEN
+            UPDATE accounts
+                SET ExternalID = pExternalID
+                WHERE ID = vAccountID;
+        END IF;
+
+       --create student
+        INSERT INTO students (AccountID)
+        VALUES  (vAccountID) returning ID into vStudentID;
+        RETURN vStudentID;
+       EXCEPTION 
+        when others then RETURN -1;
+    END
+ $$  LANGUAGE plpgsql;
+
+--
+-- Name: teacher_createactivated(character varying, character varying, character varying, integer, integer, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.teacher_createactivated(character varying, character varying, character varying, integer, integer, character varying);
+
+ CREATE OR REPLACE FUNCTION public.teacher_createactivated(
+   plastname character varying,
+   pfirstname character varying, 
+   psecondname character varying, 
+   pjobpositionid integer, 
+   pFacultyID  integer,
+   pdepartmentid integer, 
+   pexternalid character varying,
+   pINILA  VARCHAR)
+ RETURNS integer
+
+AS $$
+        DECLARE vAccountID INT DEFAULT -1;
+       			insID int;
+BEGIN
+--select public.teacher_createactivated(
+--	:plastname,	-- put the plastname parameter value instead of 'plastname' (varchar)
+--	:pfirstname,	-- put the pfirstname parameter value instead of 'pfirstname' (varchar)
+--	:psecondname,	-- put the psecondname parameter value instead of 'psecondname' (varchar)
+--	:pjobpositionid,	-- put the pjobpositionid parameter value instead of 'pjobpositionid' (int4)
+--	:pdepartmentid,	-- put the pdepartmentid parameter value instead of 'pdepartmentid' (int4)
+--	:pexternalid 	-- put the pexternalid parameter value instead of 'pexternalid' (varchar)
+--);
+        vAccountID = Account_CreateActivated(pLastName, pFirstName, pSecondName, pExternalID, pINILA, GetUserRole('teacher'));
+
+        -- add new teacher
+               INSERT INTO teachers (AccountID, JobPositionID, DepartmentID, FacultyID) VALUES
+            (vAccountID, pJobPositionID, pDepartmentID, pFacultyID) returning ID into insID;
+        RETURN insID;
+       EXCEPTION 
+        when others then RETURN -1;
+    END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: teacher_getidfrominila(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.teacher_getidfrominila(character varying);
+
+CREATE OR REPLACE FUNCTION public.teacher_getidfrominila(
+pTeacherINILA VARCHAR
+)
+RETURNS INT
+
+AS $$ 
+        DECLARE pID INT DEFAULT null;
+begin
+--	select public.Teacher_GetIDFromINILA(
+--	:pTeacherINILA 	-- put the pTeacherINILA parameter value instead of 'pTeacherINILA' (VARCHAR(40))
+--);
+        SELECT teachers.ID INTO pID
+        FROM teachers
+            INNER JOIN accounts ON teachers.AccountID = accounts.ID
+        WHERE accounts.INILA = pTeacherINILA
+        LIMIT 1;
+        if pID is null then pID = -1;
+        end if;
+        RETURN pID;
+    END
+ $$ LANGUAGE plpgsql;
+
+--
+-- Name: student_changeinfo integer,character varying,character varying,character varying,character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.student_changeinfo (integer,character varying,character varying,character varying,character varying);
+ 
+ CREATE OR REPLACE FUNCTION public.student_changeinfo(pid integer, pexternalid character varying, plastname character varying, pfirstname character varying, psecondname character varying)
+ RETURNS integer
+
+AS $$ 
+DECLARE vAccountID INT DEFAULT -1;
+		vStudentID INT DEFAULT -1;
+begin
+--	select public.student_changeinfo(
+--	:pid,	-- put the pid parameter value instead of 'pid' (int4)
+--	:pexternalid,	-- put the pexternalid parameter value instead of 'pexternalid' (varchar)
+--	:plastname,	-- put the plastname parameter value instead of 'plastname' (varchar)
+--	:pfirstname,	-- put the pfirstname parameter value instead of 'pfirstname' (varchar)
+--	:psecondname 	-- put the psecondname parameter value instead of 'psecondname' (varchar)
+--);
+        SELECT students.AccountID INTO vAccountID
+            FROM students
+            WHERE students.ID = pID;
+
+        UPDATE accounts
+            SET accounts.ExternalID = COALESCE(pExternalID, accounts.ExternalID),
+                accounts.LastName = COALESCE(pLastName, accounts.LastName),
+                accounts.FirstName = COALESCE(pFirstName, accounts.FirstName),
+                accounts.SecondName = COALESCE(pSecondName, accounts.SecondName)
+            WHERE accounts.ID = vAccountID;
+
+        RETURN 0;
+      EXCEPTION 
+      when others then RETURN -1; 
+    END
+ $$  LANGUAGE plpgsql;
+ 
+ --
+-- Name: createstudentex(character varying,character varying,character varying,integer,integer, bachelor_master_specialist, character varying,integer, character varying,integer);Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.createstudentex(character varying,character varying,character varying,integer,integer, bachelor_master_specialist, character varying,integer, character varying,integer);
+
+ CREATE OR REPLACE FUNCTION public.createstudentex(
+  plastname character varying, 
+  pfirstname character varying, 
+  psecondname character varying, 
+  pgradenum integer, 
+  pgroupnum integer, 
+  pdegree bachelor_master_specialist, 
+  pspecname character varying, 
+  pfacultyid integer, 
+  pactivationcode character varying, 
+  psemesterid integer)
+ RETURNS integer
+
+AS $$
+
+DECLARE  vGradeID INT DEFAULT -1;  vGroupID INT DEFAULT -1; vYear INT DEFAULT -1;
+begin
+--	select public.createstudentex(
+--	:plastname,	-- put the plastname parameter value instead of 'plastname' (varchar)
+--	:pfirstname,	-- put the pfirstname parameter value instead of 'pfirstname' (varchar)
+--	:psecondname,	-- put the psecondname parameter value instead of 'psecondname' (varchar)
+--	:pgradenum,	-- put the pgradenum parameter value instead of 'pgradenum' (int4)
+--	:pgroupnum,	-- put the pgroupnum parameter value instead of 'pgroupnum' (int4)
+--	:pdegree,	-- put the pdegree parameter value instead of 'pdegree' (bachelor_master_specialist)
+--	:pspecname,	-- put the pspecname parameter value instead of 'pspecname' (varchar)
+--	:pfacultyid,	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--	:pactivationcode,	-- put the pactivationcode parameter value instead of 'pactivationcode' (varchar)
+--	:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--);
+    vYear := COALESCE((SELECT Year FROM semesters WHERE semesters.ID = pSemesterID LIMIT 1), -1);
+    vGradeID := CreateGrade(pGradeNum, pDegree);
+    vGroupID := CreateGroup(vGradeID, pGroupNum, pSpecName, pFacultyID, vYear);
+    RETURN CreateStudent(pLastName, pFirstName, pSecondName, vGroupID, pActivationCode, pSemesterID);
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: student_getidfromexternalid(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.student_getidfromexternalid(character varying); 
+
+CREATE OR REPLACE FUNCTION public.student_getidfromexternalid(paccountexternalid character varying)
+ RETURNS integer
+
+AS $$ 
+ DECLARE pID INT DEFAULT null;
+BEGIN   
+--	select public.student_getidfromexternalid(
+--	:paccountexternalid 	-- put the paccountexternalid parameter value instead of 'paccountexternalid' (varchar)
+--);
+        SELECT students.ID INTO pID
+        FROM accounts
+        JOIN students ON accounts.ID = students.AccountID
+        WHERE accounts.ExternalID = pAccountExternalID
+        LIMIT 1;
+        RETURN coalesce(pID, -1);
+    END
+ $$  LANGUAGE plpgsql;
+ 
+--
+-- Name: removefromgroupinsemester(integer, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.removefromgroupinsemester(integer, integer, integer); 
+
+ CREATE OR REPLACE FUNCTION public.removefromgroupinsemester(
+pRecordBook integer, 
+pgroupid integer, 
+psemesterid integer)
+ RETURNS integer
+
+AS $$
+declare vRowCount int;
+BEGIN
+-- select public.RemoveFromGroupInSemester(
+--	:pRecordBook,	-- put the pRecordBook parameter value instead of 'pRecordBook' (INT)
+--	:pGroupID,	-- put the pGroupID parameter value instead of 'pGroupID' (INT)
+--	:pSemesterID 	-- put the pSemesterID parameter value instead of 'pSemesterID' (INT)
+--);   
+    DELETE FROM students_groups
+        WHERE   students_groups.GroupID = pGroupID
+                and students_groups.pRecordBook = pRecordBook
+                and students_groups.SemesterID = pSemesterID
+                and students_groups.State = 'common';
+    get diagnostics vRowCount = ROW_COUNT;
+   RETURN vRowCount-1;
+   EXCEPTION 
+   when others then RETURN -1;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: plan_binddiscipline(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.plan_binddiscipline(integer, integer);
+
+CREATE OR REPLACE FUNCTION public.plan_binddiscipline(
+    pStudyPlanID INT,
+    pDisciplineID  INT
+)
+RETURNS INT
+AS $$ 
+BEGIN
+--    select public.Plan_BindDiscipline(
+--	:pStudyPlanID,	-- put the pStudyPlanID parameter value instead of 'pStudyPlanID' (INT)
+--	:pDisciplineID 	-- put the pDisciplineID parameter value instead of 'pDisciplineID' (INT)
+--);   
+        INSERT INTO disciplines_study_plans (StudyPlanID, DisciplineID) VALUES (pStudyPlanID, pDisciplineID)
+         on conflict on constraint disciplines_study_plans_studyplanid_disciplineid_key
+         do nothing;
+        RETURN 0;
+       EXCEPTION 
+       when others then RETURN -1;
+    END
+$$ LANGUAGE plpgsql;
+
+--
+-- Name: plan_changeinfo(integer, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.plan_changeinfo(integer, integer, integer);
+
+CREATE OR REPLACE FUNCTION public.plan_changeinfo(
+    pID INT,
+    pYear INT,
+    pFacultyID INT
+)
+RETURNS INT
+
+AS $$ 
+begin
+--	select public.Plan_ChangeInfo(
+--	:pID,	-- put the pID parameter value instead of 'pID' (INT)
+--	:pYear,	-- put the pYear parameter value instead of 'pYear' (INT)
+--	:pFacultyID 	-- put the pFacultyID parameter value instead of 'pFacultyID' (INT)
+--);
+    UPDATE study_plans
+        SET study_plans.Year = COALESCE(pYear, study_plans.Year),
+            study_plans.FacultyID = COALESCE(pFacultyID, study_plans.FacultyID)
+        WHERE study_plans.ID = pID;
+    RETURN 0;
+   EXCEPTION 
+    when others then RETURN -1;
+END
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: plan_create(VARCHAR, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.plan_create(VARCHAR, integer, integer);
+
+ CREATE OR REPLACE FUNCTION public.plan_create(
+    pPlanExternalID VARCHAR,
+    pYear INT,
+    pFacultyID INT
+)
+RETURNS INT
+
+AS $$ 
+        DECLARE vID INT DEFAULT -1;
+begin
+--	select public.Plan_Create(
+--	:pPlanExternalID,	-- put the pPlanExternalID parameter value instead of 'pPlanExternalID' (VARCHAR(9))
+--	:pYear,	-- put the pYear parameter value instead of 'pYear' (INT)
+--	:pFacultyID 	-- put the pFacultyID parameter value instead of 'pFacultyID' (INT)
+--);
+        INSERT INTO study_plans (ExternalID, Year, FacultyID) VALUES (pPlanExternalID, pYear, pFacultyID)
+         on conflict on constraint study_plans_externalid_key
+         do UPDATE set study_plans.Year = pYear, study_plans.FacultyID = pFacultyID
+            returning id into vID;
+        
+        RETURN vID;
+    END
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: plan_getdisciplines(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.plan_getdisciplines(integer, integer);
+
+ CREATE OR REPLACE FUNCTION public.plan_getdisciplines(pstudyplanid integer, psemesterid integer)
+ RETURNS SETOF integer
+
+AS $$ 
+--select public.plan_getdisciplines(
+--	:pstudyplanid,	-- put the pstudyplanid parameter value instead of 'pstudyplanid' (int4)
+--	:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--);
+
+SELECT disciplines.ID AS ID
+      FROM disciplines
+      INNER JOIN disciplines_study_plans ON disciplines_study_plans.DisciplineID = disciplines.ID
+    WHERE disciplines_study_plans.StudyPlanID = pStudyPlanID AND
+          disciplines.SemesterID = COALESCE(pSemesterID, disciplines.SemesterID); --???????
+ $$  LANGUAGE sql;
+
+--
+-- Name: plan_getidfromexternalid(VARCHAR); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.plan_getidfromexternalid(VARCHAR);
+
+ CREATE OR REPLACE FUNCTION public.plan_getidfromexternalid(pplanexternalid character varying)
+ RETURNS integer
+
+AS $$ 
+        DECLARE vID INT DEFAULT null;
+begin
+--	select public.plan_getidfromexternalid(
+--	:pplanexternalid 	-- put the pplanexternalid parameter value instead of 'pplanexternalid' (varchar)
+--);
+        SELECT study_plans.ID INTO vID
+        FROM study_plans
+        WHERE study_plans.ExternalID = pPlanExternalID
+        LIMIT 1;
+
+        RETURN coalesce(vID,-1);
+    END
+ $$  LANGUAGE plpgsql;
+ 
+--
+-- Name: plan_getinfo(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.plan_getinfo(integer);
+
+ CREATE OR REPLACE FUNCTION public.plan_getinfo(pid integer)
+ RETURNS SETOF study_plans
+
+AS $$ 
+--select public.plan_getinfo(
+--	:pid 	-- put the pid parameter value instead of 'pid' (int4)
+--);
+
+SELECT study_plans.*
+    FROM study_plans
+    WHERE study_plans.ID = pID
+    LIMIT 1;
+ $$  LANGUAGE sql;
+
+--
+-- Name:recordbook_bind(VARCHAR, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.recordbook_bind(VARCHAR, integer, integer);
+
+ CREATE OR REPLACE FUNCTION public.recordbook_bind(pexternalid character varying, pstudentid integer, pplanid integer)
+ RETURNS integer
+
+AS $$ 
+        DECLARE vRecordBookID INT DEFAULT -1;
+BEGIN
+--select public.recordbook_bind(
+--	:pexternalid,	-- put the pexternalid parameter value instead of 'pexternalid' (varchar)
+--	:pstudentid,	-- put the pstudentid parameter value instead of 'pstudentid' (int4)
+--	:pplanid 	-- put the pplanid parameter value instead of 'pplanid' (int4)
+--);
+        INSERT INTO record_books (StudentID, ExternalID)
+            VALUES  (pStudentID, pExternalID)
+           on conflict on constraint record_books_externalid_key do
+           update set StudentID = pStudentID,
+                      record_books.ID = LAST_INSERT_ID(record_books.ID)
+                     returning ID into vRecordBookID;
+                    
+        INSERT INTO record_books_plans (RecordBookID, StudyPlanID)
+            VALUES (vRecordBookID, pPlanID)
+            on conflict on constraint recordbookid_studyplanid_record_books_plans_key do
+            nothing;
+
+        RETURN vRecordBookID;
+       
+       EXCEPTION 
+       when others then RETURN -1;
+    END
+ $$  LANGUAGE plpgsql;
+
+ --
+-- Name:recordbook_changeinfo(integer, VARCHAR, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.recordbook_changeinfo(integer, VARCHAR, integer, integer);
+
+ CREATE OR REPLACE FUNCTION public.recordbook_changeinfo(
+    pID INT,
+    pExternalID VARCHAR,
+    pStudentID  int,
+    pPlanID     int
+)
+RETURNS INT
+
+AS $$ 
+ declare vRes int;
+begin
+--	select public.recordbook_changeinfo(
+--	:pid,	-- put the pid parameter value instead of 'pid' (int4)
+--	:pexternalid,	-- put the pexternalid parameter value instead of 'pexternalid' (varchar)
+--	:pstudentid,	-- put the pstudentid parameter value instead of 'pstudentid' (int4)
+--	:pplanid 	-- put the pplanid parameter value instead of 'pplanid' (int4)
+--);
+
+
+        UPDATE record_books
+            SET record_books.ExternalID = COALESCE(pExternalID, record_books.ExternalID)
+            WHERE record_books.ID = pID;
+        SELECT RecordBook_Bind(pExternalID, pStudentID, pPlanID) INTO vRes;
+        RETURN 0;
+       EXCEPTION 
+       when others then RETURN -1;
+    END
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: recordbook_getinfo(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.recordbook_getinfo(integer);
+
+ CREATE OR REPLACE FUNCTION public.recordbook_getinfo(precordbook integer)
+ RETURNS TABLE(id integer, externalid character varying, studentid integer)
+
+AS $$ 
+--select * from public.recordbook_getinfo(
+--	:precordbook 	-- put the precordbook parameter value instead of 'precordbook' (int4)
+--);
+
+SELECT
+      record_books.ID,
+      record_books.ExternalID,
+      record_books.StudentID
+    FROM record_books
+    WHERE record_books.ID = pRecordBook;
+ $$  LANGUAGE sql;
+
+--
+-- Name: gettextmark(character,character varying,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.gettextmark(character,character varying,integer);
+
+ CREATE OR REPLACE FUNCTION public.gettextmark(isafterexam character, examtype character varying, rate integer)
+ RETURNS character varying
+
+AS $$
+
+	declare markTextId int;
+    markText varchar(100);
+begin
+--	select public.gettextmark(
+--	:isafterexam,	-- put the isafterexam parameter value instead of 'isafterexam' (bpchar)
+--	:examtype,	-- put the examtype parameter value instead of 'examtype' (varchar)
+--	:rate 	-- put the rate parameter value instead of 'rate' (int4)
+--);
+    if examType = 'credit' then
+        if rate < 60 then
+			markTextId := 6;--незачет
+		else 
+			markTextId := 7;--зачет
+		end if;
+    elseif examType = 'gradingcredit' then
+		if rate >= 85 then 
+			markTextId := 5;--неуд.
+		elseif rate >= 70 then 
+			markTextId := 4;--хорошо
+		elseif rate >= 60 then
+			markTextId := 3;--СѓРґРѕРІР».
+		else
+			markTextId := 2;--неуд.
+		end if;
+    elseif isAfterExam = '0' then
+		if rate < 38 then
+			markTextId := 1;--недопуск
+		else
+			return ' ' ;
+		end if;
+	else
+		if rate >= 85 then 
+			markTextId := 5;--неуд.
+		elseif rate >= 70 then 
+			markTextId := 4;--хорошо
+		elseif rate >= 60 then
+			markTextId := 3;--СѓРґРѕРІР».
+		else
+			markTextId := 2;--неуд.
+		end if;
+	end if;
+    select name from text_mark where id = markTextId into markText;
+    return markText;
+END;
+$$  LANGUAGE plpgsql;
+
+
+--
+-- Name: checkaccountexistence(text, login_email_code); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.checkaccountexistence(text, login_email_code);
+
+CREATE OR REPLACE FUNCTION public.checkaccountexistence(pdata text, ptype login_email_code)
+ RETURNS boolean
+AS $$
+begin
+--	select public.checkaccountexistence(
+--	:pdata,	-- put the pdata parameter value instead of 'pdata' (text)
+--	:ptype 	-- put the ptype parameter value instead of 'ptype' (login_email_code)
+--);
+
+RETURN EXISTS(
+    SELECT * FROM accounts
+        WHERE CASE pType
+            WHEN 'login' THEN pData = accounts.Login
+            WHEN 'email' THEN pData = accounts.EMail
+            WHEN 'code' THEN pData = accounts.ActivationCode
+            ELSE FALSE
+        END
+    LIMIT 1
+);
+end
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: createauthtoken(integer, character varying, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.createauthtoken(integer, character varying, integer);
+
+CREATE OR REPLACE FUNCTION public.createauthtoken(paccountid integer, pdescription character varying, prightmask integer)
+ RETURNS character varying
+AS $$
+
+    DECLARE vTries int DEFAULT 13; -- number of tries to generate unique token
+    vCreated boolean DEFAULT FALSE;
+ --   vSeed int DEFAULT FLOOR(4294967296 * RAND(CURRENT_TIMESTAMP ^ LAST_INSERT_ID() ^ (pAccountID << 10)));
+    vToken char(40);
+BEGIN
+--select public.createauthtoken(
+--	:paccountid,	-- put the paccountid parameter value instead of 'paccountid' (int4)
+--	:pdescription,	-- put the pdescription parameter value instead of 'pdescription' (varchar)
+--	:prightmask 	-- put the prightmask parameter value instead of 'prightmask' (int4)
+--);
+    SELECT setseed(FLOOR(4294967296 * (CURRENT_TIMESTAMP # (pAccountID << 10)))); -- ???????
+    WHILE (NOT vCreated AND vTries > 0) loop
+    begin
+    
+        vToken := SHA1(RANDOM());
+        vTries := vTries - 1;
+        vCreated := TRUE;  
+        INSERT INTO auth_tokens(Token, AccountID, Description, Mask) VALUES (vToken, pAccountID, pDescription, pRightMask);
+   		EXCEPTION 
+   			when others 
+   			then  vCreated := FALSE; 
+   	end;
+   END loop; 
+
+    RETURN IF(vCreated, vToken, NULL);
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: getuserfullnamebyaccountid(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getuserfullnamebyaccountid(integer);
+
+CREATE OR REPLACE FUNCTION public.getuserfullnamebyaccountid(paccountid integer)
+ RETURNS character varying
+
+AS $$
+
+    DECLARE vUserFullName VARCHAR(255);
+    vChecker INT DEFAULT null;
+BEGIN
+--select public.getuserfullnamebyaccountid(
+--	:paccountid 	-- put the paccountid parameter value instead of 'paccountid' (int4)
+--);
+    -- try to find student with that account id
+    SELECT students.ID, CONCAT(students.LastName,' ',students.FirstName,' ',students.SecondName)
+        INTO vChecker, vUserFullName
+        FROM students
+        WHERE students.AccountID = pAccountID
+        LIMIT 1;
+
+    IF vChecker is null THEN -- try to find teacher with that account id
+        SELECT teachers.ID, CONCAT(teachers.LastName,' ',teachers.FirstName,' ',teachers.SecondName)
+            INTO vChecker, vUserFullName
+            FROM teachers
+            WHERE teachers.AccountID = pAccountID
+            LIMIT 1;
+
+        IF vChecker is null THEN
+            RETURN '';
+        END IF;
+    END IF;
+
+    RETURN vUserFullName;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: getuserrole(student_teacher_admin_dean); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getuserrole(student_teacher_admin_dean);
+
+CREATE OR REPLACE FUNCTION public.getuserrole(ptype student_teacher_admin_dean)
+ RETURNS integer
+AS $$
+
+BEGIN
+--select public.getuserrole(
+--	:ptype 	-- put the ptype parameter value instead of 'ptype' (student_teacher_admin_dean)
+--);
+RETURN (CASE pType
+    WHEN 'dean' THEN 4
+    WHEN 'teacher' THEN 2
+    WHEN 'admin' THEN 3
+    ELSE 1
+END);
+end
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: createrecoverytoken(character varying, character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.createrecoverytoken(character varying, character varying);
+
+CREATE OR REPLACE FUNCTION public.createrecoverytoken(paccountoremail character varying, ptoken character varying)
+ RETURNS character varying
+AS $$
+    DECLARE vAccountID INT DEFAULT null;
+    DECLARE vUserFullName TEXT; 
+BEGIN
+--select public.createrecoverytoken(
+--	:paccountoremail,	-- put the paccountoremail parameter value instead of 'paccountoremail' (varchar)
+--	:ptoken 	-- put the ptoken parameter value instead of 'ptoken' (varchar)
+--);
+	-- get account ID
+    SELECT accounts.ID INTO vAccountID
+        FROM accounts
+        WHERE accounts.EMail = pAccountOrEMail OR
+              accounts.Login = pAccountOrEMail
+        LIMIT 1;
+    IF vAccountID is null THEN
+        RETURN '';
+    END IF;
+
+    vUserFullName := GetUserFullNameByAccountID(vAccountID);
+    IF vUserFullName IS NULL OR vUserFullName = '' THEN
+        RETURN '';
+    END IF;
+
+    -- transform all unused recovery tokens into used
+    UPDATE recovery_tokens
+    SET recovery_tokens.isUsed = 1
+    WHERE   recovery_tokens.isUsed = 0 AND
+            recovery_tokens.AccountID = vAccountID;
+
+    -- handle catch constraints violations
+    INSERT INTO recovery_tokens
+        ( AccountID, Token )
+        VALUES  (vAccountID, pToken);
+    RETURN vUserFullName;
+   EXCEPTION 
+   when others then  RETURN -2; -- тип ???
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: findgroup(integer, integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.findgroup(integer, integer, integer);
+
+CREATE OR REPLACE FUNCTION public.findgroup(pgradeid integer, pgroupnum integer, pfacultyid integer)
+ RETURNS integer
+AS $$
+begin
+--	select public.findgroup(
+--	:pgradeid,	-- put the pgradeid parameter value instead of 'pgradeid' (int4)
+--	:pgroupnum,	-- put the pgroupnum parameter value instead of 'pgroupnum' (int4)
+--	:pfacultyid 	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--);
+
+RETURN COALESCE((
+    SELECT study_groups.ID FROM study_groups
+    WHERE   study_groups.GradeID = pGradeID
+            AND study_groups.GroupNum = pGroupNum
+            AND study_groups.FacultyID = pFacultyID
+    LIMIT 1
+), -1);
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: deleteauthtoken(character); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.deleteauthtoken(character); 
+
+CREATE OR REPLACE FUNCTION public.deleteauthtoken(ptoken character)
+ RETURNS integer
+
+AS $$
+declare vCount int;
+begin
+--	select public.deleteauthtoken(
+--	:ptoken 	-- put the ptoken parameter value instead of 'ptoken' (bpchar)
+--);
+
+    DELETE FROM auth_tokens
+        WHERE auth_tokens.Token = pToken;
+     get diagnostics vCount=ROW_COUNT;
+    RETURN vCount-1;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: department_create(character varying, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.department_create(character varying, integer);
+
+CREATE OR REPLACE FUNCTION public.department_create(pname character varying, pfacultyid integer)
+ RETURNS integer
+
+AS $$ 
+declare vID int;
+begin
+--	select public.department_create(
+--	:pname,	-- put the pname parameter value instead of 'pname' (varchar)
+--	:pfacultyid 	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--);
+
+	INSERT INTO departments (Name, FacultyID) VALUES (pName, pFacultyID)
+      ON conflict on constraint departments_name_facultyid_key do
+       update set departments.facultyid=pFacultyID returning id into vID;
+ 
+    RETURN vID; -- может достаточно return 0; ???
+	EXCEPTION 
+	when others then RETURN -1;
+end
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: department_update(integer, text, text, text); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.department_update(integer, text, text, text);
+
+CREATE OR REPLACE FUNCTION public.department_update(pdepartmentid integer, pdepartmentexternalid text, pdepartmentname text, pfacultyid text)
+ RETURNS integer
+
+AS $$ 
+begin
+--	select public.department_update(
+--	:pdepartmentid,	-- put the pdepartmentid parameter value instead of 'pdepartmentid' (int4)
+--	:pdepartmentexternalid,	-- put the pdepartmentexternalid parameter value instead of 'pdepartmentexternalid' (text)
+--	:pdepartmentname,	-- put the pdepartmentname parameter value instead of 'pdepartmentname' (text)
+--	:pfacultyid 	-- put the pfacultyid parameter value instead of 'pfacultyid' (text)
+--);
+	
+  IF pDepartmentExternalID IS NOT NULL THEN
+    UPDATE departments SET ExternalID = pDepartmentExternalID WHERE ID = pDepartmentID;
+  END IF;
+
+  IF pDepartmentName IS NOT NULL THEN
+    UPDATE departments SET Name = pDepartmentName WHERE ID = pDepartmentID;
+  END IF;
+
+  IF pFacultyID IS NOT NULL THEN
+    UPDATE departments SET FacultyID = pFacultyID WHERE ID = pDepartmentID;
+  END IF;
+
+  RETURN pDepartmentID;
+  EXCEPTION  when others then RETURN -1;
+end
+ $$  LANGUAGE plpgsql;
+
+--
+-- Name: detachallstudents(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.detachallstudents(integer);
+
+CREATE OR REPLACE FUNCTION public.detachallstudents(pdisciplineid integer)
+ RETURNS integer
+
+AS $$
+begin
+--	select public.detachallstudents(
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+
+    DELETE FROM disciplines_groups
+        WHERE disciplines_groups.DisciplineID = pDisciplineID;
+    DELETE FROM disciplines_students
+        WHERE disciplines_students.DisciplineID = pDisciplineID;
+    RETURN 0;
+END;
+$$  LANGUAGE plpgsql;
+
+-----------------------------------------------------------------------------------------------------------------------------------------
+
+--
+-- Name: discipline_find(integer, integer, integer, exam_credit_grading_credit); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_find(integer, integer, integer, exam_credit_grading_credit);
+
+CREATE OR REPLACE FUNCTION public.discipline_find(pstudyplanid integer, psemesterid integer, psubjectid integer, pexamtype exam_credit_grading_credit)
+ RETURNS SETOF integer
+
+AS $$
+--select public.discipline_find(
+--	:pstudyplanid,	-- put the pstudyplanid parameter value instead of 'pstudyplanid' (int4)
+--	:psemesterid,	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--	:psubjectid,	-- put the psubjectid parameter value instead of 'psubjectid' (int4)
+--	:pexamtype 	-- put the pexamtype parameter value instead of 'pexamtype' (exam_credit_grading_credit)
+--);
+	SELECT disciplines.ID
+    FROM disciplines
+      INNER JOIN disciplines_study_plans ON disciplines.ID = disciplines_study_plans.DisciplineID
+    WHERE disciplines_study_plans.StudyPlanID = pStudyPlanID AND
+          disciplines.SemesterID = pSemesterID AND
+          disciplines.SubjectID = pSubjectID AND
+          disciplines.ExamType = pExamType;
+ $$  LANGUAGE sql;
+ 
+ --
+-- Name: discipline_getidfromexternalid(character varying); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_getidfromexternalid(character varying);
+ 
+ CREATE OR REPLACE FUNCTION public.discipline_getidfromexternalid(pdisciplineexternalid character varying)
+ RETURNS integer
+
+AS $$ 
+begin
+--	select public.discipline_getidfromexternalid(
+--	:pdisciplineexternalid 	-- put the pdisciplineexternalid parameter value instead of 'pdisciplineexternalid' (varchar)
+--);
+	return 
+	coalesce(
+	  (SELECT disciplines.ID    FROM disciplines
+        WHERE disciplines.ExternalID = pDisciplineExternalID
+        LIMIT 1),
+	-1);
+	
+end
+ $$  LANGUAGE plpgsql;
+
+--
+-- Name: discipline_getinfo(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_getinfo(integer); 
+
+CREATE OR REPLACE FUNCTION public.discipline_getinfo(pdisciplineid integer)
+ RETURNS TABLE(id integer, authorid integer, gradeid integer, gradenum integer, degree bachelor_master_specialist, type exam_credit_grading_credit, lectures integer, practice integer, labs integer, semesterid integer, subjectid integer, subjectname character varying, subjectabbr character varying, facultyid integer, facultyname character varying, islocked integer, milestone integer, subtype scientific_disciplinary_coursework, compounddiscid integer, ismapcreated boolean, isbonus boolean, semesternum integer, semesteryear integer)
+
+AS $$
+
+    DECLARE vIsBonus BOOLEAN;
+begin
+--	select * from public.discipline_getinfo(
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+
+    vIsBonus := EXISTS(
+        SELECT * FROM modules
+            WHERE   modules.DisciplineID = pDisciplineID AND
+                    modules.Type = 'bonus'
+            LIMIT 1
+    );
+
+    SELECT
+        view_disciplines.DisciplineID AS ID,
+        view_disciplines.AuthorID,
+        view_disciplines.GradeID,
+        view_disciplines.GradeNum,
+        view_disciplines.Degree,
+        view_disciplines.ExamType       AS Type,
+        view_disciplines.LectureCount   AS Lectures,
+        view_disciplines.PracticeCount  AS Practice,
+        view_disciplines.LabCount       AS Labs,
+        view_disciplines.SemesterID,
+        view_disciplines.SubjectID,
+        view_disciplines.SubjectName,
+        view_disciplines.SubjectAbbr,
+        view_disciplines.FacultyID,
+        view_disciplines.FacultyName,
+        view_disciplines.IsLocked,
+        view_disciplines.Milestone,
+        view_disciplines.Subtype,
+        view_disciplines.CompoundDiscID,
+        (view_disciplines.MaxRate = 100) AS IsMapCreated,
+        vIsBonus AS IsBonus,
+        semesters.Num AS semesterNum, -- TODO: Camelize
+        semesters.Year AS semesterYear
+    FROM view_disciplines
+    INNER JOIN semesters ON semesters.ID = view_disciplines.SemesterID
+    WHERE view_disciplines.DisciplineID = pDisciplineID
+    LIMIT 1;
+END ;
+$$ LANGUAGE plpgsql;
+
+--
+-- Name: discipline_delete(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_delete(integer);
+
+CREATE OR REPLACE FUNCTION public.discipline_delete(pdisciplineid integer)
+ RETURNS integer
+ 
+AS $$
+begin
+--	select public.discipline_delete(
+--	:pdisciplineid 	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--);
+
+    -- delete roadmap
+    DELETE FROM submodules
+        WHERE submodules.moduleID in (
+            select modules.id FROM modules
+            WHERE modules.DisciplineID = pDisciplineID
+        );
+
+    DELETE FROM modules
+        WHERE modules.DisciplineID = pDisciplineID;
+
+    -- detach all entities from discipline
+    DELETE FROM disciplines_teachers
+        WHERE disciplines_teachers.DisciplineID = pDisciplineID;
+    DELETE FROM disciplines_students
+        WHERE disciplines_students.DisciplineID = pDisciplineID;
+    DELETE FROM disciplines_groups
+        WHERE disciplines_groups.DisciplineID = pDisciplineID;
+    DELETE FROM logs_binds_groups
+        WHERE logs_binds_groups.DisciplineID = pDisciplineID;
+    DELETE FROM logs_binds_students
+        WHERE logs_binds_students.DisciplineID = pDisciplineID;
+
+    -- delete discipline
+    DELETE FROM disciplines
+        WHERE disciplines.ID = pDisciplineID;
+        --LIMIT 1;
+
+    RETURN 0;
+END;
+$$ LANGUAGE plpgsql;
+
+--
+-- Name: discipline_getinfobysubmodule(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_getinfobysubmodule(integer);
+
+CREATE OR REPLACE FUNCTION public.discipline_getinfobysubmodule(psubmoduleid integer)
+
+ RETURNS TABLE(id integer, authorid integer, gradeid integer, gradenum integer, degree bachelor_master_specialist, type exam_credit_grading_credit, lectures integer, practice integer, labs integer, semesterid integer, subjectid integer, subjectname character varying, subjectabbr character varying, facultyid integer, facultyname character varying, islocked integer, milestone integer, subtype scientific_disciplinary_coursework, compounddiscid integer, ismapcreated boolean, isbonus boolean, semesternum integer, semesteryear integer)
+
+AS $$
+
+    DECLARE vDisciplineID INT DEFAULT -1;
+begin
+--	select * from public.discipline_getinfobysubmodule(
+--	:psubmoduleid 	-- put the psubmoduleid parameter value instead of 'psubmoduleid' (int4)
+--);
+    SELECT  modules.DisciplineID
+        INTO vDisciplineID
+        FROM submodules
+        INNER JOIN modules ON  submodules.ModuleID = modules.ID
+        WHERE submodules.ID = pSubmoduleID
+        LIMIT 1;
+
+   return query select * from Discipline_GetInfo(vDisciplineID);
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: discipline_getmodules(integer, exam_rate_all); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_getmodules(integer, exam_rate_all);
+
+CREATE OR REPLACE FUNCTION public.discipline_getmodules(pdisciplineid integer, ptype exam_rate_all)
+ RETURNS 
+  table ( 
+   ID integer,
+   Name varchar,
+   type regular_exam_bonus_extra
+  )
+
+AS $$
+begin
+--	select public.discipline_getmodules(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:ptype 	-- put the ptype parameter value instead of 'ptype' (exam_rate_all)
+--);
+    SELECT  modules.ID,
+            modules.Name,
+            modules.Type
+        FROM modules
+        WHERE   modules.DisciplineID = pDisciplineID AND
+            CASE pType
+                WHEN 'exam' THEN modules.Type = 'exam' OR modules.Type = 'extra'
+                WHEN 'rate' THEN modules.Type != 'exam'
+                ELSE TRUE
+            END
+        ORDER BY
+            CASE pType
+                WHEN 'exam' THEN InternalOrderModuleTypesForSession(modules.Type)
+                WHEN 'rate' THEN modules.Type # 1 -- XOR 1, 3, 2, 4 ASC
+                ELSE TRUE
+            END ASC,
+            modules.OrderNum ASC;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: discipline_getstudents(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_getstudents(integer);
+
+CREATE OR REPLACE FUNCTION public.discipline_getstudents(pdisciplineid integer)
+ RETURNS TABLE(id integer, recordbookid integer, lastname character varying, firstname character varying, secondname character varying, gradeid integer, gradenum integer, degree bachelor_master_specialist, groupid integer, groupnum integer, attachtype attach_detach)
+
+AS $$ 
+    DECLARE vSemesterID int DEFAULT -1;
+BEGIN
+ --select  * from public.Discipline_GetStudents(
+--	:pDisciplineID 	-- put the pDisciplineID parameter value instead of 'pDisciplineID' (INT)
+--);
+    vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+  return query
+    SELECT  view_students.StudentID AS ID,
+            view_students.RecordBookID,
+            view_students.LastName,
+            view_students.FirstName,
+            view_students.SecondName,
+            view_students.GradeID,
+            view_students.GradeNum,
+            view_students.Degree,
+            view_students.GroupID,
+            view_students.GroupNum,
+            view_disciplines_recordbooks.Type AS AttachType
+        FROM view_disciplines_recordbooks
+        INNER JOIN view_students ON  view_disciplines_recordbooks.RecordBookID = view_students.RecordBookID
+        WHERE view_students.SemesterID = vSemesterID AND view_disciplines_recordbooks.DisciplineID = pDisciplineID
+        ORDER BY    view_disciplines_recordbooks.Type = 'attach' ASC,
+                    view_students.GradeID ASC,
+                    view_students.GroupNum ASC,
+                    view_students.LastName ASC,
+                    view_students.FirstName ASC;
+END
+ $$  LANGUAGE plpgsql;
+ 
+--
+-- Name: discipline_getsubmodules(integer,exam_rate_all); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_getsubmodules(integer,exam_rate_all); 
+
+ CREATE OR REPLACE FUNCTION public.discipline_getsubmodules(pdisciplineid integer, ptype exam_rate_all)
+ RETURNS table(
+  ModuleID integer,
+  ID integer,
+  Name varchar,
+  Rate integer,
+  type current_landmark_control
+ )
+
+AS $$
+
+begin
+--	select * from public.discipline_getsubmodules(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:ptype 	-- put the ptype parameter value instead of 'ptype' (exam_rate_all)
+--);
+return query
+    SELECT  view_roadmap.ModuleID,
+            view_roadmap.SubmoduleID    AS ID,
+            view_roadmap.SubmoduleName  AS Name,
+            view_roadmap.SubmoduleRate  AS Rate,
+            view_roadmap.SubmoduleType  AS Type
+        FROM view_roadmap
+        WHERE   view_roadmap.DisciplineID = pDisciplineID AND
+            CASE pType
+                WHEN 'exam' THEN view_roadmap.ModuleType = 'exam' OR view_roadmap.ModuleType = 'extra'
+                WHEN 'rate' THEN view_roadmap.ModuleType != 'exam' OR view_roadmap.SubmoduleOrderNum = 1
+                ELSE TRUE
+            END
+        ORDER BY
+            view_roadmap.ModuleOrderNum ASC,
+            view_roadmap.SubmoduleOrderNum ASC;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: discipline_getwithfullness( noukd_norate_full, integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_getwithfullness( noukd_norate_full, integer,integer); 
+
+CREATE OR REPLACE FUNCTION public.discipline_getwithfullness(ptype noukd_norate_full, psemesterid integer, pfacultyid integer)
+ RETURNS SETOF integer
+
+AS $$ 
+--select public.discipline_getwithfullness(
+--	:ptype,	-- put the ptype parameter value instead of 'ptype' (noukd_norate_full)
+--	:psemesterid,	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--	:pfacultyid 	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--);
+
+SELECT view_disciplines.DisciplineID AS ID
+        FROM view_disciplines
+        WHERE view_disciplines.SemesterID = pSemesterID AND
+              view_disciplines.FacultyID = pFacultyID AND
+              CASE WHEN pType = 'noukd' 
+                   THEN (view_disciplines.MaxRate != 100 AND view_disciplines.IsLocked = 0) 
+                   ELSE true
+              END 
+              AND
+              CASE WHEN pType = 'norate' 
+              	THEN (view_disciplines.MaxRate = 100 AND view_disciplines.IsLocked = 0) 
+              	ELSE TRUE 
+              END 
+              AND
+              CASE WHEN pType = 'full' 
+             	   THEN (view_disciplines.MaxRate = 100 AND view_disciplines.IsLocked = 1) 
+                   ELSE TRUE 
+               END;
+ $$  LANGUAGE sql;
+
+--
+-- Name: discipline_setgradeunsafe(integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_setgradeunsafe(integer,integer);
+
+ CREATE OR REPLACE FUNCTION public.discipline_setgradeunsafe(
+    pDisciplineID INT,
+    pGradeID INT
+)
+RETURNS INT
+
+AS $$ 
+declare vRow int;
+begin
+--	select public.Discipline_SetGradeUnsafe(
+--	:pDisciplineID,	-- put the pDisciplineID parameter value instead of 'pDisciplineID' (INT)
+--	:pGradeID 	-- put the pGradeID parameter value instead of 'pGradeID' (INT)
+--);
+
+    -- set grade
+    UPDATE disciplines
+        SET disciplines.GradeID = pGradeID
+        WHERE disciplines.ID = pDisciplineID ;
+     get diagnostics vRow = ROW_COUNT;
+       RETURN vRow-1;
+   EXCEPTION 
+   when others then RETURN -1;
+END
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: discipline_setrate(integer,integer,integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_setrate(integer,integer,integer,integer);
+
+ CREATE OR REPLACE FUNCTION public.discipline_setrate(pteacherid integer, precordbookid integer, psubmoduleid integer, prate integer)
+ RETURNS integer
+
+AS $$ 
+    DECLARE vDisciplineID INT DEFAULT -1;
+   			vMaxRate INT DEFAULT -1;
+   			vModuleType INT DEFAULT -1;
+    DECLARE vIsOver BOOLEAN DEFAULT FALSE; 
+   			vIsLocked BOOLEAN DEFAULT FALSE; 
+   			vIsUsed BOOLEAN DEFAULT FALSE;
+   		    vIsUpdated boolean default false;
+begin
+--	select Discipline_SetRate(
+--	:pTeacherID,	-- put the pTeacherID parameter value instead of 'pTeacherID' (INT)
+--	:pRecordBookID,	-- put the pRecordBookID parameter value instead of 'pRecordBookID' (INT)
+--	:pSubmoduleID,	-- put the pSubmoduleID parameter value instead of 'pSubmoduleID' (INT)
+--	:pRate 	-- put the pRate parameter value instead of 'pRate' (INT)
+--);
+
+      -- 0) check rights ПОЧЕМУ ТАК ПОЗДНО ????
+      IF NOT InternalIsStudentAttached(pRecordBookID, vDisciplineID) OR
+       NOT InternalIsTeacherBound(pTeacherID, vDisciplineID) THEN
+        RETURN 1;
+      END IF;
+	
+	    IF pRate < 0 THEN
+        INSERT INTO logs_rating (RecordBookID, SubmoduleID, TeacherID, Rate, Action ) VALUES
+            (pRecordBookID, pSubmoduleID, pTeacherID, pRate, 'delete');
+
+        -- TODO: extract method log rate
+        DELETE FROM rating_table
+            WHERE   rating_table.RecordBookID = pRecordBookID AND
+                    rating_table.SubmoduleID = pSubmoduleID
+           ;
+        RETURN 0;
+    	END IF;
+    
+    vIsOver = TRUE;
+   SELECT  disciplines.ID,
+            disciplines.IsLocked,
+            disciplines.Milestone,
+            submodules.IsUsed,
+            submodules.maxRate,
+            modules.Type
+        INTO vDisciplineID, vIsLocked, vIsOver, vIsUsed, vMaxRate, vModuleType
+        FROM submodules
+        INNER JOIN modules                ON  submodules.ModuleID = modules.ID
+        INNER JOIN disciplines            ON  modules.DisciplineID = disciplines.ID
+        WHERE   submodules.ID = pSubmoduleID
+        LIMIT 1;
+    -- correct max rate for extra module
+    IF vModuleType = 4 THEN -- 4 - extra
+         vMaxRate = CalculateMaxRateForExtra(vDisciplineID, pRecordBookID);
+    END IF;
+      -- 1) check rights ПОЧЕМУ ТАК ПОЗДНО ????
+    IF NOT InternalIsStudentAttached(pRecordBookID, vDisciplineID) OR
+       NOT InternalIsTeacherBound(pTeacherID, vDisciplineID) THEN
+        RETURN 1;
+    END IF;
+    --2) check, you can't rate regular and bonus after milestone
+    IF (vIsOver AND (vModuleType = 1 OR vModuleType = 3)) THEN --1 - regular, 3 - bonus
+        RETURN 2;
+    END IF;
+    --3) check, max rate exceeding
+    IF  pRate > vMaxRate THEN
+        RETURN 3;
+    END IF;
+     -- add rate, or update old
+    visUpdated = FALSE;
+    INSERT INTO rating_table (RecordBookID, TeacherID, SubmoduleID, Rate, Date)
+        VALUES  (pRecordBookID, pTeacherID, pSubmoduleID, pRate, current_date )
+        on conflict on constraint rating_table_pkey do
+         update set
+            rating_table.TeacherID  = pTeacherID, --(@isUpdated := pTeacherID),
+            rating_table.Rate       = pRate,
+            rating_table.Date       = current_date
+         returning true into visUpdated ; ---??????? если не получится, разделить insert и update
+          --log rate
+    INSERT INTO logs_rating (RecordBookID, SubmoduleID, TeacherID, Rate, Action )
+        VALUES (pRecordBookID, pSubmoduleID, pTeacherID, pRate, IF(@isUpdated, 'change', 'add') );
+
+   -- lock discipline for structure editing
+    IF NOT vIsLocked THEN
+        UPDATE disciplines
+            SET disciplines.IsLocked = TRUE
+            WHERE disciplines.ID = vDisciplineID
+            ;
+    END IF;
+--add submodule to max rate counting (see triggers)
+    IF NOT vIsUsed THEN
+        UPDATE submodules
+            SET submodules.IsUsed = TRUE
+            WHERE submodules.ID = pSubmoduleID
+           ;
+    END IF;
+    RETURN 0;
+EXCEPTION 
+when others then RETURN -1;
+end
+ $$ LANGUAGE plpgsql;
+ 
+--
+-- Name: discipline_unbindteacher(integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.discipline_unbindteacher(integer,integer);
+
+ CREATE OR REPLACE FUNCTION public.discipline_unbindteacher(pdisciplineid integer, pbindingteacher integer)
+ RETURNS integer
+AS $$
+declare vRow int;
+begin
+--	select public.discipline_unbindteacher(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pbindingteacher 	-- put the pbindingteacher parameter value instead of 'pbindingteacher' (int4)
+--);
+
+    DELETE FROM disciplines_teachers
+        WHERE   disciplines_teachers.DisciplineID = pDisciplineID AND disciplines_teachers.TeacherID = pBindingTeacher;
+        --LIMIT 1;
+        get diagnostics vRow=ROW_COUNT;
+    RETURN vRow-1;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: student_getrecordbooks(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.student_getrecordbooks(integer);
+
+CREATE OR REPLACE FUNCTION public.student_getrecordbooks(pStudentID INT)
+RETURNS table (
+ID integer,
+ExternalID varchar,
+degree bachelor_master_specialist
+)
+
+AS $$ 
+--	select  * from Student_GetRecordBooks(
+--	:pStudentID 	-- put the pStudentID parameter value instead of 'pStudentID' (INT)
+--);
+
+    SELECT DISTINCT
+      view_students.RecordBookID       AS ID,
+      view_students.RecordBookNumber       AS ExternalID,
+      view_students.Degree
+    FROM view_students
+    WHERE view_students.StudentID = pStudentID;
+ $$ LANGUAGE sql;
+
+--
+-- Name: student_getrecordbookandgroup(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.student_getrecordbookandgroup(integer, integer);
+
+ CREATE OR REPLACE FUNCTION public.student_getrecordbookandgroup(
+  pStudentID INT, 
+  pSemesterID int)
+RETURNS table (
+RecordBookID integer,
+GroupID integer
+)
+
+AS $$ 
+-- select * from Student_GetRecordBookAndGroup(
+--	:pStudentID,	-- put the pStudentID parameter value instead of 'pStudentID' (INT)
+--	:pSemesterID 	-- put the pSemesterID parameter value instead of 'pSemesterID' (INT)
+--);
+    SELECT  record_books.ID AS RecordBookID,
+            students_groups.GroupID AS GroupID
+        FROM students_groups
+        JOIN record_books ON record_books.ID = students_groups.RecordBookID
+        WHERE record_books.StudentID = pStudentID AND
+          students_groups.SemesterID = pSemesterID AND
+          students_groups.State != 'expulsion';
+ $$ LANGUAGE sql;
+ 
+--
+-- Name: student_getdisciplinestemp(integer, integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.student_getdisciplinestemp(integer, integer);
+
+ CREATE OR REPLACE FUNCTION public.student_getdisciplinestemp(
+pRecordBookID INT, pSemesterID INT
+)
+RETURNS INT
+
+AS $$ 
+begin
+--вспомогательная 
+--создает временную таблицу для другой функции	
+-- изменила группировку !!!!!
+    CREATE TEMPORARY TABLE tStudentDisciplines AS (
+        SELECT disc_rb.DisciplineID
+        FROM (
+            SELECT  view_disciplines_recordbooks.DisciplineID,
+                    view_disciplines_recordbooks.RecordBookID,
+                    COALESCE(view_disciplines_recordbooks.Type) AS type
+                    FROM view_disciplines_recordbooks
+                WHERE view_disciplines_recordbooks.SemesterID = pSemesterID AND
+                      view_disciplines_recordbooks.RecordBookID = pRecordBookID
+                GROUP BY view_disciplines_recordbooks.DisciplineID, 
+                		view_disciplines_recordbooks.RecordBookID,
+                		view_disciplines_recordbooks.Type
+            ) AS disc_rb
+        where disc_rb.type is null or  disc_rb.Type != 'detach'
+    );
+    RETURN 0;
+END
+ $$ LANGUAGE plpgsql;
+
+--
+-- Name: student_getteacherslist(integer, integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.student_getteacherslist(integer, integer,integer);
+
+ CREATE OR REPLACE FUNCTION public.student_getteacherslist(
+pRecordBookID INT,
+pSemesterID INT,
+pLoadAll INT
+)
+RETURNS table (
+DisciplineID integer,
+TeacherID integer,
+LastName varchar,
+FirstName varchar,
+SecondName varchar
+)
+
+AS $$ 
+    DECLARE vRes integer; vStudentGroup INT DEFAULT -1;
+BEGIN
+--select * from public.Student_GetTeachersList(
+--	:pRecordBookID,	-- put the pRecordBookID parameter value instead of 'pRecordBookID' (INT)
+--	:pSemesterID,	-- put the pSemesterID parameter value instead of 'pSemesterID' (INT)
+--	:pLoadAll 	-- put the pLoadAll parameter value instead of 'pLoadAll' (INT)
+--);
+-- разобраться с параметром pLoadAll - поставила для него проверку ==1
+    DROP TABLE IF EXISTS tStudentDisciplines;
+     vRes = Student_GetDisciplinesTemp(pRecordBookID, pSemesterID);
+   return query
+    SELECT  tStudentDisciplines.DisciplineID,
+            teachers.ID AS TeacherID,
+            accounts.LastName,
+            accounts.FirstName,
+            accounts.SecondName
+        FROM tStudentDisciplines
+        INNER JOIN disciplines ON disciplines.ID = tStudentDisciplines.DisciplineID
+        LEFT JOIN disciplines_teachers ON disciplines_teachers.DisciplineID = tStudentDisciplines.DisciplineID
+        INNER JOIN teachers ON teachers.ID = disciplines_teachers.TeacherID
+        INNER JOIN accounts ON teachers.AccountID = accounts.ID
+        WHERE pLoadAll=1 OR disciplines.Subtype IS NULL
+        ORDER BY    tStudentDisciplines.DisciplineID ASC,
+                    accounts.LastName ASC,
+                    accounts.FirstName ASC;
+END
+ $$ LANGUAGE plpgsql;
+
+--
+-- Name: student_getinfo(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.student_getinfo(integer);
+
+ CREATE OR REPLACE FUNCTION public.student_getinfo(pid integer)
+ RETURNS TABLE(id integer, lastname character varying, firstname character varying, secondname character varying, accountid integer, semesterid integer, groupid integer, groupnum integer, groupname character varying, gradeid integer, gradenum integer, degree bachelor_master_specialist, specid integer, specname character varying, specabbr character varying, speccode character varying, facultyid integer, facultyname character varying, facultyabbr character varying)
+ 
+AS $$
+--select * from public.student_getinfo(
+--	:pid 	-- put the pid parameter value instead of 'pid' (int4)
+--);
+
+    SELECT
+        view_students.StudentID   AS ID,
+        view_students.LastName,
+        view_students.FirstName,
+        view_students.SecondName,
+        view_students.AccountID,
+        view_students.SemesterID,
+        view_students.GroupID,
+        view_students.GroupNum,
+        view_students.GroupName,
+        view_students.GradeID,
+        view_students.GradeNum,
+        view_students.Degree,
+        view_students.SpecID,
+        view_students.SpecName,
+        view_students.SpecAbbr,
+        view_students.SpecCode,
+        view_students.FacultyID,
+        view_students.FacultyName,
+        view_students.FacultyAbbr
+    FROM view_students WHERE pID = view_students.StudentID;
+    --LIMIT 1;
+
+$$ LANGUAGE sql;
+
+
+--
+-- Name: student_getdisciplines(integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.student_getdisciplines(integer,integer);
+
+CREATE OR REPLACE FUNCTION public.student_getdisciplines(precordbookid integer, psemesterid integer)
+ RETURNS TABLE(id integer, subjectid integer, subjectname character varying, type exam_credit_grading_credit, subtype scientific_disciplinary_coursework, lastname character varying, firstname character varying, secondname character varying, rate integer, maxcurrentrate integer)
+
+AS $$ 
+DECLARE vRes INT DEFAULT -1;
+begin
+--	select public.student_getdisciplines(
+--	:precordbookid,	-- put the precordbookid parameter value instead of 'precordbookid' (int4)
+--	:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--);
+
+	    DROP TABLE IF EXISTS tStudentDisciplines;
+   		vRes = Student_GetDisciplinesTemp(pRecordBookID, pSemesterID);
+   	return query
+   	SELECT  view_disciplines.DisciplineID AS ID,
+            view_disciplines.SubjectID,
+            view_disciplines.SubjectName,
+            view_disciplines.ExamType AS Type,
+            view_disciplines.Subtype,
+            accounts.LastName,
+            accounts.FirstName,
+            accounts.SecondName,
+            ( tDR.RateExam + tDR.RateMExam ) AS Rate,
+            ( tDR.MaxRegularRate + tDR.MaxExamRate ) AS MaxCurrentRate
+        FROM (
+            SELECT  tRating.DisciplineID,
+                    SUM(
+                        iif_sql( tRating.SubmoduleIsUsed AND 
+                            tRating.ModuleType  is not null and 
+                            tRating.ModuleType = 'regular',
+                            tRating.SubmoduleRate, 0)
+                    ) AS MaxRegularRate,
+                    MAX(
+                        iif_sql( tRating.SubmoduleIsUsed AND 
+                        tRating.ModuleType  is not null and 
+                        tRating.ModuleType = 'exam',
+                            tRating.SubmoduleRate, 0)
+                    ) AS MaxExamRate,
+                    SUM(
+                    	 iif_sql(tRating.ModuleType  is not null and 
+                         tRating.ModuleType != 'exam', tRating.Rate, 0)
+                         ) AS RateMExam,
+                    MAX(
+                    	iif_sql(tRating.ModuleType  is not null and 
+                    	       tRating.ModuleType = 'exam' AND 
+                    	       tRating.Rate IS NOT NULL, tRating.Rate, 0)
+                    	       ) AS RateExam
+                FROM (
+                    SELECT  tStudentDisciplines.DisciplineID,
+                            vr.SubmoduleRate,
+                            vr.ModuleType,
+                            rt.Rate,
+                            vr.SubmoduleIsUsed
+                        FROM tStudentDisciplines
+                        LEFT JOIN view_roadmap AS vr ON   vr.DisciplineID = tStudentDisciplines.DisciplineID
+                        LEFT JOIN rating_table AS rt  ON  rt.RecordBookID = pRecordBookID AND
+                                                            rt.SubmoduleID = vr.SubmoduleID
+                ) AS tRating
+                GROUP BY tRating.DisciplineID
+            ) AS tDR
+        INNER JOIN view_disciplines ON view_disciplines.DisciplineID = tDR.DisciplineID
+        INNER JOIN teachers ON teachers.ID = view_disciplines.AuthorID
+        INNER JOIN accounts ON teachers.AccountID = accounts.ID
+        ORDER BY view_disciplines.ExamType ASC, view_disciplines.SubjectName ASC;
+end
+ $$  LANGUAGE plpgsql;
+ 
+--
+-- Name: stats_getsupportrequestfrequency(date); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.stats_getsupportrequestfrequency(date); 
+
+ CREATE OR REPLACE FUNCTION public.stats_getsupportrequestfrequency(dlimit date)
+ RETURNS 
+ table (
+ counted_leads bigint,
+ count_date date
+ )
+
+AS $$
+
+--	select public.stats_getsupportrequestfrequency(
+--	:dlimit 	-- put the dlimit parameter value instead of 'dlimit' (date)
+--);
+SELECT
+  count(DATE(requests.Date)) as counted_leads, DATE(requests.Date) as count_date
+FROM requests WHERE requests.Date > dLimit
+GROUP BY DATE(requests.Date);
+ 
+$$  LANGUAGE sql;
+
+--
+-- Name: unbindstudent(integer,integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.unbindstudent(integer,integer,integer);
+
+CREATE OR REPLACE FUNCTION public.unbindstudent(pteacherid integer, pdisciplineid integer, precordbookid integer)
+ RETURNS integer
+
+AS $$ 
+   DECLARE vInGroup int DEFAULT -1;  
+  		   vStudentGroupID int DEFAULT -1; 
+  		   vSemesterID INT DEFAULT -1;
+BEGIN
+--select public.unbindstudent(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:precordbookid 	-- put the precordbookid parameter value instead of 'precordbookid' (int4)
+--);
+
+-- todo: move to php layer
+    IF pTeacherID IS NOT NULL AND NOT InternalIsTeacherBound(pTeacherID, pDisciplineID) THEN
+        RETURN -1;
+    END IF;
+
+    vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+    vStudentGroupID = GetStudentGroup(pRecordBookID, vSemesterID);
+
+    --2. check if student's group is bound yet
+     vInGroup = EXISTS(
+        SELECT * FROM disciplines_groups
+        WHERE disciplines_groups.DisciplineID = pDisciplineID AND
+              disciplines_groups.GroupID = vStudentGroupID
+        LIMIT 1
+    );
+
+    IF vInGroup > 0 THEN --student in general group
+        INSERT INTO disciplines_students (DisciplineID, RecordBookID, Type)
+            VALUES (pDisciplineID, pRecordBookID, 'detach')
+            ON conflict on constraint disciplines_students_recordbookid_disciplineid_key do 
+            UPDATE  set disciplines_students.Type = 'detach';
+    ELSE
+        DELETE FROM disciplines_students
+            WHERE   disciplines_students.DisciplineID = pDisciplineID AND
+                    disciplines_students.RecordBookID = pRecordBookID
+            ;
+    END IF;
+    RETURN LogBind(pDisciplineID, pTeacherID, pRecordBookID, 'detach', 'student');
+   EXCEPTION 
+   when others then RETURN -1;
+END
+ $$  LANGUAGE plpgsql;
+
+--
+-- Name: removestudentsattach(integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.removestudentsattach(integer,integer);
+
+ CREATE OR REPLACE FUNCTION public.removestudentsattach(pdisciplineid integer, pgroupid integer)
+ RETURNS integer
+
+AS $$
+
+    DECLARE vSemesterID INT; 
+begin
+--	select public.removestudentsattach(
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pgroupid 	-- put the pgroupid parameter value instead of 'pgroupid' (int4)
+--);
+
+    vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+    DELETE FROM disciplines_students
+        WHERE   disciplines_students.DisciplineID = pDisciplineID AND
+                disciplines_students.StudentID IN (
+                    SELECT students_groups.StudentID FROM students_groups
+                    WHERE   students_groups.GroupID = pGroupID AND students_groups.SemesterID = vSemesterID
+                );
+        RETURN 0;
+END;
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: unbindgroup(integer,integer,integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.unbindgroup(integer,integer,integer,integer);
+
+CREATE OR REPLACE FUNCTION public.unbindgroup(pteacherid integer, pdisciplineid integer, pgroupid integer, vres integer)
+ RETURNS integer
+
+AS $$
+declare vRes int;
+begin
+--	select public.unbindgroup(
+--	:pteacherid,	-- put the pteacherid parameter value instead of 'pteacherid' (int4)
+--	:pdisciplineid,	-- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
+--	:pgroupid,	-- put the pgroupid parameter value instead of 'pgroupid' (int4)
+--	:vres 	-- put the vres parameter value instead of 'vres' (int4)
+--);
+
+    -- todo: move to php layer
+    CASE WHEN NOT InternalIsTeacherBound(pTeacherID, pDisciplineID) OR InternalIsMapLocked(pDisciplineID) THEN
+        RETURN -1;
+		else null;
+    END CASE;
+    -- detach group from the discipline
+    DELETE FROM disciplines_groups
+        WHERE   disciplines_groups.DisciplineID = pDisciplineID AND disciplines_groups.GroupID = pGroupID;
+        --LIMIT 1;
+
+    SELECT LogBind(pDisciplineID, pTeacherID, pGroupID, 'detach', 'group') INTO vRes;
+    RETURN RemoveStudentsAttach(pDisciplineID, pGroupID);
+END
+$$  LANGUAGE plpgsql;
+
+--
+-- Name: getfullinfo(integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public.getfullinfo(integer,integer);
+
+CREATE OR REPLACE FUNCTION public.getfullinfo(puserid integer, psemesterid integer)
+ RETURNS table (
+ "StudentID"	integer,
+ "GroupID"		integer,
+ "GroupNum" 	integer,
+ "GroupName"	varchar,
+ "GradeID"		integer,
+ "GradeNum"		integer,
+ "Degree"		bachelor_master_specialist,
+ "SpecID"		integer,
+ "SpecName"		varchar,
+ "SpecAbbr"		varchar,
+ "SpecCode"		varchar,
+ "SemesterID"	integer,
+               	-- teacher info
+ "TeacherID"	integer,
+ "DepID"		integer,
+ "DepName"		varchar,
+ "JobPositionName"	varchar,
+                --faculty info
+ "FacultyID"	integer,
+ "FacultyName"	varchar,
+ "FacultyAbbr"	varchar,
+ 				-- account info
+ "ID"			integer,
+ "Login"		varchar,
+ "EMail"		varchar,
+ "LastName"		varchar,
+ "FirstName"	varchar,
+ "SecondName"	varchar,
+ "Type"			student_teacher,
+ "RoleID"		integer,
+ "Role"			varchar,
+ "RoleMark"		integer,
+ "IsEnabled"	int2,
+ "Code"			varchar
+ )
+AS $$
+DECLARE vAccountType student_teacher;
+begin
+
+    SELECT user_roles."type" INTO vAccountType
+        FROM accounts
+        INNER JOIN user_roles ON accounts.UserRoleID = user_roles.ID
+        WHERE accounts.ID = pUserID
+        LIMIT 1;
+
+-- type 1: student
+--      2: teacher
+    IF vAccountType = 'student' then
+     return query
+        SELECT
+                -- personal students info
+                students.ID 						as "StudentID",
+                               -- group info
+				view_groups_reduced.groupid			as "GroupID",
+				view_groups_reduced.groupnum		as "GroupNum",
+				view_groups_reduced.groupname		as "GroupName",
+				view_groups_reduced.gradeid			as "GradeID",
+				view_groups_reduced.gradenum		as "GradeNum",
+				view_groups_reduced."degree"		as "Degree",
+				view_groups_reduced.specid			as "SpecID",
+				view_groups_reduced.specname		as "SpecName",
+				view_groups_reduced.specabbr		as "SpecAbbr",
+				view_groups_reduced.speccode		as "SpecCode",
+ 				students_groups.SemesterID			as "SemesterID",
+               	-- teacher info
+                cast(null  as integer)				as "TeacherID",
+                cast(null  as integer)				as "DepID",
+                cast(null  as varchar)				as "DepName",
+                cast(null  as varchar)				as "JobPositionName",
+
+                --faculty info
+                view_groups_reduced.facultyid		as "FacultyID",
+                view_groups_reduced.facultyname		as "FacultyName",
+                view_groups_reduced.facultyabbr		as "FacultyAbbr",
+ 				-- account info
+                accounts.ID							as "ID",
+                accounts.Login						as "Login",
+                accounts.EMail						as "EMail",
+                accounts.LastName					as "LastName",
+                accounts.FirstName					as "FirstName",
+                accounts.SecondName					as "SecondName",
+                user_roles."type"					as "Type",
+                accounts.UserRoleID 				AS "RoleID",
+                user_roles.RoleName 				AS "Role",
+                user_roles.Mark     				AS "RoleMark",
+                accounts.IsEnabled					as "IsEnabled",
+                accounts.ActivationCode 			AS "Code"
+            FROM students
+            INNER JOIN accounts ON accounts.ID = students.AccountID
+            INNER JOIN user_roles ON user_roles.ID = accounts.UserRoleID
+            LEFT JOIN record_books ON record_books.StudentID = students.ID
+            LEFT JOIN students_groups ON  students_groups.RecordBookID = record_books.ID
+            LEFT JOIN view_groups_reduced ON view_groups_reduced.GroupID = students_groups.GroupID
+            WHERE   students.AccountID = pUserID and (pSemesterID is null or students_groups.SemesterID = pSemesterID )
+             ORDER BY students_groups.SemesterID  DESC
+            LIMIT 1;
+    ELSE
+        return query
+    		SELECT
+                        -- personal students info не олучается поставить null????
+                cast(null  as integer)			as "StudentID",
+                               -- group info
+				cast(null  as integer)			as "GroupID",
+				cast(null  as integer)			as "GroupNum",
+				cast(null  as varchar)			as "GroupName",
+				cast(null  as integer)			as "GradeID",
+				cast(null  as integer)			as "GradeNum",
+				cast(null as bachelor_master_specialist)								as "Degree",
+				cast(null  as integer)			as "SpecID",
+				cast(null as varchar)			as "SpecName",
+				cast(null as varchar)			as "SpecAbbr",
+				cast(null as varchar)			as "SpecCode",
+ 				cast(null  as integer)			as "SemesterID",
+ 				        -- teacher info
+                view_teachers.TeacherID				as "TeacherID",
+                view_teachers.DepID					as "DepID",
+                view_teachers.DepName				as "DepName",
+                view_teachers.JobPositionName		as "JobPositionName",
+ 				                --faculty info
+                view_teachers.FacultyID				as "FacultyID",
+                view_teachers.FacultyName			as "FacultyName",
+                view_teachers.FacultyAbbr			as "FacultyAbbr",
+
+                -- account info
+                accounts.ID							as "ID",
+                accounts.Login						as "Login",
+                accounts.EMail						as "EMail",
+                accounts.LastName					as "LastName",
+                accounts.FirstName					as "FirstName",
+                accounts.SecondName					as "SecondName",
+                user_roles."type"					as "Type",
+                accounts.UserRoleID 				AS "RoleID",
+                user_roles.RoleName 				AS "Role",
+                user_roles.Mark     				AS "RoleMark",
+                accounts.IsEnabled					as "IsEnabled",
+               accounts.ActivationCode 			AS "Code"
+            FROM view_teachers
+            INNER JOIN accounts ON accounts.ID = view_teachers.AccountID
+            INNER JOIN user_roles ON user_roles.ID = accounts.UserRoleID
+            WHERE view_teachers.AccountID = pUserID
+            LIMIT 1;
+    END IF;
+END
+$$ LANGUAGE plpgsql;
+
+--
+-- Name: Plan_GetTeachers(integer,integer,integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public."Plan_GetTeachers"(INTEGER, INTEGER, INTEGER);
+
+CREATE OR REPLACE FUNCTION public."Plan_GetTeachers"(pStudyPlanID INTEGER, pSemesterID  INTEGER,
+  pLoadAll     INTEGER) -- todo: replace bool
+  RETURNS TABLE(
+  "ID" integer
+  )
+AS $$
+--select * from public.getgroups(
+--	:pgradeid,	-- put the pgradeid parameter value instead of 'pgradeid' (int4)
+--	:pfacultyid,	-- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
+--	:psemesterid 	-- put the psemesterid parameter value instead of 'psemesterid' (int4)
+--);
+SELECT teachers.ID AS "ID"
+FROM teachers
+  INNER JOIN disciplines_teachers ON disciplines_teachers.TeacherID = teachers.ID
+  INNER JOIN disciplines ON disciplines.ID = disciplines_teachers.DisciplineID
+  INNER JOIN disciplines_study_plans ON disciplines_study_plans.DisciplineID = disciplines.ID
+WHERE disciplines_study_plans.StudyPlanID = pStudyPlanID AND
+      disciplines.SemesterID = COALESCE(pSemesterID, disciplines.SemesterID) AND
+      (pLoadAll =  1 OR disciplines.Subtype IS NULL);
+$$ LANGUAGE sql;
+
+--
+-- Name: GetRatesHistory(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public."GetRatesHistory"(INTEGER);
+
+CREATE OR REPLACE FUNCTION public."GetRatesHistory"(
+  pDisciplineID INTEGER)
+  RETURNS TABLE(
+    "ID" INTEGER,
+    "Date" DATE,
+    "Rate" INTEGER,
+    "StudentLast" VARCHAR,
+    "StudentFirst" VARCHAR,
+    "StudentSecond" VARCHAR,
+    "TeacherLast" VARCHAR,
+    "TeacherFirst" VARCHAR,
+    "TeacherSecond" VARCHAR,
+    "SubmoduleName" VARCHAR,
+    "ModuleName" VARCHAR
+  )
+AS $$
+SELECT  logs_rating.ID AS "ID",
+        DATE(logs_rating.Date) As "Date",
+        logs_rating.Rate AS "Rate",
+        studentAccount.LastName   AS "StudentLast",
+        studentAccount.FirstName  AS "StudentFirst",
+        studentAccount.SecondName AS "StudentSecond",
+        teacherAccount.LastName   AS "TeacherLast",
+        teacherAccount.FirstName  AS "TeacherFirst",
+        teacherAccount.SecondName AS "TeacherSecond",
+        submodules.Name     AS "SubmoduleName",
+        modules.Name        AS "ModuleName"
+FROM logs_rating
+  INNER JOIN record_books ON record_books.ID = logs_rating.RecordBookID
+  INNER JOIN students ON students.ID = record_books.StudentID
+  INNER JOIN accounts as studentAccount ON students.AccountID = studentAccount.ID
+  INNER JOIN teachers ON teachers.ID = logs_rating.TeacherID
+  INNER JOIN accounts as teacherAccount ON teachers.AccountID = teacherAccount.ID
+  INNER JOIN submodules ON submodules.ID = logs_rating.SubmoduleID
+  INNER JOIN modules ON modules.ID = submodules.ModuleID
+WHERE modules.DisciplineID = pDisciplineID
+ORDER BY logs_rating.Date DESC;
+$$ LANGUAGE sql;
+
+--
+-- Name: DeleteModuleExam(integer); Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public."DeleteModuleExam"(INTEGER, INTEGER);
+
+CREATE OR REPLACE FUNCTION public."DeleteModuleExam"(
+  pTeacherID INTEGER,
+  pDisciplineID INTEGER)
+  RETURNS INTEGER
+AS $$
+DECLARE vExamModuleID INTEGER DEFAULT -1;
+BEGIN
+  -- check teacher rights
+  IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
+      InternalIsMapLocked(pDisciplineID)
+  THEN
+    RETURN -1;
+  END IF;
+
+  -- get exam module ID
+  SELECT modules.ID INTO vExamModuleID
+  FROM modules
+  WHERE   modules.Type = 'exam' AND
+          modules.DisciplineID = pDisciplineID
+  LIMIT 1;
+
+  IF vExamModuleID <= 0 THEN
+    RETURN -1;
+  END IF;
+
+  -- everything is checked then delete
+  DELETE FROM submodules
+  WHERE vExamModuleID = submodules.ModuleID;
+
+  DELETE FROM modules
+  WHERE vExamModuleID = modules.ID;
+  RETURN 0;
+END
+$$ LANGUAGE plpgsql;
+
+
+--
+-- Name: GetStudents(INTEGER, INTEGER, INTEGER, INTEGER, VARCHAR(100), VARCHAR(100), VARCHAR(100));
+-- Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public."GetStudents"(INTEGER, INTEGER, INTEGER, INTEGER, VARCHAR(100), VARCHAR(100), VARCHAR(100));
+
+CREATE OR REPLACE FUNCTION public."GetStudents"(
+  pFacultyID INTEGER,
+  pGradeID INTEGER,
+  pGroupID INTEGER,
+  pSemesterID INTEGER,
+  pWord1 VARCHAR(100),
+  pWord2 VARCHAR(100),
+  pWord3 VARCHAR(100))
+  RETURNS TABLE(
+    "ID" INTEGER,
+    "LastName" VARCHAR,
+    "FirstName" VARCHAR,
+    "SecondName" VARCHAR,
+    "AccountID" INTEGER,
+    "GradeID" INTEGER,
+    "GradeNum" INTEGER,
+    "Degree" INTEGER,
+    "GroupID" INTEGER,
+    "GroupNum" INTEGER
+  )
+AS $$
+DECLARE FullName VARCHAR;
+BEGIN
+  SELECT  view_students.StudentID AS "ID",
+          view_students.LastName AS "LastName",
+          view_students.FirstName AS "FirstName",
+          view_students.SecondName AS "SecondName",
+          view_students.AccountID AS "AccountID",
+          view_students.GradeID AS "GradeID",
+          view_students.GradeNum AS "GradeNum",
+          view_students.Degree AS "Degree",
+          view_students.GroupID AS "GroupID",
+          view_students.GroupNum AS "GroupNum",
+          CONCAT(view_students.LastName, ' ', view_students.FirstName, ' ', view_students.SecondName) AS "FullName"
+  FROM view_students
+  WHERE
+    CASE WHEN pSemesterID != 0 THEN view_students.SemesterID = pSemesterID ELSE
+      TRUE
+    END AND
+    CASE WHEN pFacultyID != 0 THEN view_students.FacultyID = pFacultyID ELSE TRUE END AND
+    CASE WHEN pGradeID != 0 THEN view_students.GradeID = pGradeID ELSE TRUE END AND
+    CASE WHEN pGroupID != 0 THEN view_students.GroupID = pGroupID ELSE TRUE END AND
+    CASE WHEN pWord1 != '' AND FullName != '' THEN
+      FullName LIKE CONCAT('%', pWord1, '%') AND
+      FullName LIKE CONCAT('%', pWord2, '%') AND
+      FullName LIKE CONCAT('%', pWord3, '%')
+    ELSE TRUE END;
+END
+$$ LANGUAGE plpgsql;
+
+--
+-- Name: SearchStudents(INTEGER, INTEGER, INTEGER, VARCHAR(100), INTEGER);
+-- Type: FUNCTION; Schema: public; Owner: -
+--
+DROP FUNCTION IF EXISTS public."SearchStudents"(INTEGER, INTEGER, INTEGER, VARCHAR(100), INTEGER);
+
+CREATE OR REPLACE FUNCTION public."SearchStudents"(
+  pGradeID INTEGER,
+  pGroupID INTEGER,
+  pFacultyID INTEGER,
+  pFullName VARCHAR(100),
+  pDisciplineID INTEGER)
+  RETURNS TABLE(
+    "ID" INTEGER,
+    "LastName" VARCHAR,
+    "FirstName" VARCHAR,
+    "SecondName" VARCHAR,
+    "GradeID" INTEGER,
+    "GradeNum" INTEGER,
+    "Degree" INTEGER,
+    "GroupID" INTEGER,
+    "GroupNum" INTEGER
+  )
+AS $$
+DECLARE vSemesterID INTEGER DEFAULT -1;
+  DECLARE vRes INTEGER DEFAULT -1;
+BEGIN
+
+  DROP TABLE IF EXISTS tDisciplineStudents;
+  SELECT Discipline_GetStudentsTemp(pDisciplineID) INTO vRes;
+
+  SELECT  view_students.StudentID AS "ID",
+          view_students.LastName AS "LastName",
+          view_students.FirstName AS "FirstName",
+          view_students.SecondName AS "SecondName",
+          view_students.GradeID AS "GradeID",
+          view_students.GradeNum AS "GradeNum",
+          view_students.Degree AS "Degree",
+          view_students.GroupID AS "GroupID",
+          view_students.GroupNum AS "GroupNum",
+          CONCAT(view_students.LastName, ' ', view_students.FirstName, ' ', view_students.SecondName) AS "FullName"
+  FROM view_students
+    LEFT JOIN tDisciplineStudents ON tDisciplineStudents.StudentID = view_students.StudentID
+  WHERE   view_students.SemesterID = vSemesterID AND
+          view_students.FacultyID = pFacultyID AND
+          view_students.GradeID = pGradeID AND
+          (pGroupID = 0 OR view_students.GroupID = pGroupID) AND
+          tDisciplineStudents.StudentID IS NULL AND
+          CASE WHEN pFullName != '' THEN
+            FullName LIKE CONCAT('%', pFullName, '%')
+          ELSE TRUE END
+  ORDER BY    view_students.GradeID ASC,
+    view_students.GroupID ASC,
+    view_students.LastName ASC,
+    view_students.FirstName ASC;
+END
+$$ LANGUAGE plpgsql;
+
+--- Триггеры ----------------------------------------------------------------------------------------------------------------------------
+
+--
+-- Name: submodule_i(); Type: TRIGGER FUNCTION; Schema: public; Owner: -
+--
+DROP TRIGGER IF EXISTS  tr_i_submodule ON submodules; 
+DROP FUNCTION IF EXISTS public.submodule_i();
+
+CREATE OR REPLACE FUNCTION public.submodule_i()
+ RETURNS trigger
+ AS $$ 
+    declare vDisciplineID int default 0; addmax int default 0; addcur int default 0;
+    declare vAccumType boolean default false; vChangeMax boolean default false;
+    declare vModuleType regular_exam_bonus_extra default 'extra';
+begin
+	 -- todo: check repeated bonus
+	    select modules.Type into vModuleType
+        from modules
+        where modules.ID = new.ModuleID
+        limit 1;
+ 
+    if (vModuleType is not null and(vModuleType = 'regular' or vModuleType = 'exam') )then 
+    
+	    vAccumType = (vModuleType != 'exam');
+       
+       select disciplines.ID into vDisciplineID
+            from modules
+                inner join disciplines on disciplines.ID = modules.DisciplineID
+            where modules.ID = new.ModuleID
+            limit 1;
+           
+         if (new.OrderNum is null)  then
+         		vChangeMax = vAccumType;
+        		else  vChangeMax = vAccumType or  new.OrderNum = 1;
+        end if;	
+       
+        if (new.isused) then addcur=new.MaxRate; end if;
+        if (vChangeMax) then addmax = new.maxrate; end if;
+       
+        update disciplines
+        set     disciplines.CurRate = disciplines.CurRate + addcur,
+                disciplines.MaxRate = disciplines.MaxRate + addmax
+        where disciplines.ID = vDisciplineID;	    
+    end if;
+end
+ $$ LANGUAGE plpgsql;
+ 
+ CREATE TRIGGER tr_i_submodule BEFORE INSERT on submodules for each row
+    EXECUTE PROCEDURE submodule_i();
+
+--
+-- Name: submodule_u(); Type: TRIGGER FUNCTION; Schema: public; Owner: -
+--
+DROP TRIGGER IF EXISTS  tr_u_submodule ON submodules; 
+DROP FUNCTION IF EXISTS public.submodule_u();
+
+CREATE OR REPLACE FUNCTION public.submodule_u()
+RETURNS trigger
+
+AS $$ 
+    declare vDisciplineID int default 0;
+    declare vAccumType    boolean default false; 
+            vChangeMaxOld boolean default false;
+            vChangeMaxNew boolean default false;
+    declare vModuleType regular_exam_bonus_extra default 'extra';
+begin
+/*    -- странная ситуация
+ * if old.ModuleID != new.ModuleID then
+        signal sqlstate '45000';
+    end if;*/
+
+    -- todo: check repeated bonus
+    select modules.Type into vModuleType
+        from modules
+        where modules.ID = new.ModuleID
+        limit 1;
+
+
+    if (vModuleType is not null and (vModuleType = 'regular' or vModuleType = 'exam') )then 
+        vAccumType = (vModuleType != 'exam');
+       
+        -- todo: extract foo
+       select disciplines.ID into vDisciplineID
+            from modules
+                inner join disciplines on disciplines.ID = modules.DisciplineID
+            where modules.ID = old.ModuleID
+            limit 1;
+     if (new.OrderNum is null)  then
+			vChangeMaxOld = vAccumType;
+			vChangeMaxNew = vAccumType;
+     else
+     	 vChangeMaxOld = vAccumType or old.OrderNum = 1;
+         vChangeMaxNew = vAccumType or new.OrderNum = 1;
+     end if;
+      
+        update disciplines
+        set     disciplines.CurRate = disciplines.CurRate
+                    - iif_sql(old.isUsed, old.MaxRate, 0)
+                    + iif_sql(new.isUsed, new.MaxRate, 0),
+                disciplines.MaxRate = disciplines.MaxRate
+                    - iif_sql(vChangeMaxOld, old.MaxRate, 0)
+                    + iif_sql(vChangeMaxNew, new.MaxRate, 0)
+        where disciplines.ID = vDisciplineID;
+    
+   end if;
+end
+ $$ LANGUAGE plpgsql;
+
+CREATE trigger tr_u_submodule  before update on submodules for each row
+    execute procedure submodule_u();
+
+--
+-- Name: submodule_d(); Type: TRIGGER FUNCTION; Schema: public; Owner: -
+--
+DROP TRIGGER IF EXISTS  tr_d_submodule ON submodules; 
+DROP FUNCTION IF EXISTS public.submodule_d();
+
+CREATE OR REPLACE FUNCTION public.submodule_d()
+ RETURNS trigger
+AS $$ 
+    declare vDisciplineID int default 0;
+    declare vAccumType boolean default false; 
+   			vChangeMax boolean default false;
+    declare vModuleType regular_exam_bonus_extra default 'extra';
+begin
+    -- todo: check repeated bonus
+    select modules.Type into vModuleType
+        from modules
+        where modules.ID = old.ModuleID
+        limit 1;
+
+    if (vModuleType is not null)and (vModuleType = 'regular' or vModuleType = 'exam') then 
+        vAccumType = ( vModuleType != 'exam');
+
+        -- todo: extract foo
+        select disciplines.ID into vDisciplineID
+            from modules
+                inner join disciplines on disciplines.ID = modules.DisciplineID
+            where modules.ID = old.ModuleID
+            limit 1;
+       if old.OrderNum is null then
+       	   vChangeMax = vAccumType;	
+       else
+           vChangeMax = vAccumType or old.OrderNum = 1;
+       end if;
+
+        update disciplines
+        set     disciplines.CurRate = disciplines.CurRate - iif_sql(old.isUsed, old.MaxRate, 0),
+                disciplines.MaxRate = disciplines.MaxRate - iif_sql(vChangeMax, old.MaxRate, 0)
+        where disciplines.ID = vDisciplineID;
+    end if;
+
+end
+ $$  LANGUAGE plpgsql;
+
+CREATE trigger tr_d_submodule  before delete on submodules for each row
+    execute procedure submodule_d();
+
diff --git a/db/postgresql/keys_and_index.sql b/db/postgresql/keys_and_index.sql
new file mode 100644
index 0000000000000000000000000000000000000000..1bcb258ec3db45e9d4e9f272b66b24987c2f8eb1
--- /dev/null
+++ b/db/postgresql/keys_and_index.sql
@@ -0,0 +1,1608 @@
+ALTER TABLE ONLY accounts
+    ADD CONSTRAINT accounts_email_key UNIQUE (email);
+
+
+--
+-- TOC entry 2422 (class 2606 OID 45947)
+-- Name: accounts accounts_lactivationcode_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY accounts
+    ADD CONSTRAINT accounts_lactivationcode_key UNIQUE (activationcode);
+
+
+--
+-- TOC entry 2424 (class 2606 OID 45949)
+-- Name: accounts accounts_login_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY accounts
+    ADD CONSTRAINT accounts_login_key UNIQUE (login);
+
+
+--
+-- TOC entry 2426 (class 2606 OID 45943)
+-- Name: accounts accounts_pk; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY accounts
+    ADD CONSTRAINT accounts_pk PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2430 (class 2606 OID 45964)
+-- Name: auth_tokens auth_tokens_token_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY auth_tokens
+    ADD CONSTRAINT auth_tokens_token_key UNIQUE (token);
+
+
+--
+-- TOC entry 2451 (class 2606 OID 46040)
+-- Name: compound_disciplines compound_disciplines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY compound_disciplines
+    ADD CONSTRAINT compound_disciplines_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2453 (class 2606 OID 46061)
+-- Name: departments departments_name_facultyid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY departments
+    ADD CONSTRAINT departments_name_facultyid_key UNIQUE (name, facultyid);
+
+
+--
+-- TOC entry 2455 (class 2606 OID 46059)
+-- Name: departments departments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY departments
+    ADD CONSTRAINT departments_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2457 (class 2606 OID 46063)
+-- Name: departments departments_uk_1; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY departments
+    ADD CONSTRAINT departments_uk_1 UNIQUE (externalid);
+
+
+--
+-- TOC entry 2489 (class 2606 OID 46284)
+-- Name: disciplines_exam_type disciplines_exam_examtypename_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_exam_type
+    ADD CONSTRAINT disciplines_exam_examtypename_key UNIQUE (examtypename);
+
+
+--
+-- TOC entry 2491 (class 2606 OID 46282)
+-- Name: disciplines_exam_type disciplines_exam_type_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_exam_type
+    ADD CONSTRAINT disciplines_exam_type_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2500 (class 2606 OID 46325)
+-- Name: disciplines_groups disciplines_groups_disciplineid_groupid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_groups
+    ADD CONSTRAINT disciplines_groups_disciplineid_groupid_key UNIQUE (disciplineid, groupid);
+
+
+--
+-- TOC entry 2502 (class 2606 OID 46323)
+-- Name: disciplines_groups disciplines_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_groups
+    ADD CONSTRAINT disciplines_groups_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2482 (class 2606 OID 46234)
+-- Name: disciplines disciplines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines
+    ADD CONSTRAINT disciplines_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2511 (class 2606 OID 46371)
+-- Name: disciplines_students disciplines_students_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_students
+    ADD CONSTRAINT disciplines_students_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2513 (class 2606 OID 46373)
+-- Name: disciplines_students disciplines_students_recordbookid_disciplineid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_students
+    ADD CONSTRAINT disciplines_students_recordbookid_disciplineid_key UNIQUE (recordbookid, disciplineid);
+
+
+--
+-- TOC entry 2522 (class 2606 OID 46436)
+-- Name: disciplines_study_plans disciplines_study_plans_pk; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_study_plans
+    ADD CONSTRAINT disciplines_study_plans_pk PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2524 (class 2606 OID 46438)
+-- Name: disciplines_study_plans disciplines_study_plans_studyplanid_disciplineid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_study_plans
+    ADD CONSTRAINT disciplines_study_plans_studyplanid_disciplineid_key UNIQUE (studyplanid, disciplineid);
+
+
+--
+-- TOC entry 2528 (class 2606 OID 46457)
+-- Name: disciplines_teachers disciplines_teachers_disciplineid_teacherid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_teachers
+    ADD CONSTRAINT disciplines_teachers_disciplineid_teacherid_key UNIQUE (disciplineid, teacherid);
+
+
+--
+-- TOC entry 2530 (class 2606 OID 46455)
+-- Name: disciplines_teachers disciplines_teachers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_teachers
+    ADD CONSTRAINT disciplines_teachers_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2543 (class 2606 OID 46525)
+-- Name: exam_period_options exam_period_options_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY exam_period_options
+    ADD CONSTRAINT exam_period_options_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2545 (class 2606 OID 46527)
+-- Name: exam_period_options exam_period_options_recordbookid_submoduleid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY exam_period_options
+    ADD CONSTRAINT exam_period_options_recordbookid_submoduleid_key UNIQUE (recordbookid, submoduleid);
+
+
+--
+-- TOC entry 2432 (class 2606 OID 45992)
+-- Name: faculties faculties_name_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY faculties
+    ADD CONSTRAINT faculties_name_key UNIQUE (name);
+
+
+--
+-- TOC entry 2434 (class 2606 OID 45990)
+-- Name: faculties faculties_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY faculties
+    ADD CONSTRAINT faculties_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2436 (class 2606 OID 45994)
+-- Name: faculties faculties_uk_1; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY faculties
+    ADD CONSTRAINT faculties_uk_1 UNIQUE (externalid);
+
+
+--
+-- TOC entry 2438 (class 2606 OID 45996)
+-- Name: faculties faculties_uk_3; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY faculties
+    ADD CONSTRAINT faculties_uk_3 UNIQUE (abbr);
+
+
+--
+-- TOC entry 2445 (class 2606 OID 46033)
+-- Name: grades grade_2; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY grades
+    ADD CONSTRAINT grade_2 UNIQUE (num, degree);
+
+
+--
+-- TOC entry 2447 (class 2606 OID 46031)
+-- Name: grades grades_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY grades
+    ADD CONSTRAINT grades_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2550 (class 2606 OID 46545)
+-- Name: groups_years groups_years_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY groups_years
+    ADD CONSTRAINT groups_years_pkey PRIMARY KEY (year, groupid);
+
+
+--
+-- TOC entry 2471 (class 2606 OID 46189)
+-- Name: job_positions job_positions_name_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY job_positions
+    ADD CONSTRAINT job_positions_name_key UNIQUE (name);
+
+
+--
+-- TOC entry 2473 (class 2606 OID 46187)
+-- Name: job_positions job_positions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY job_positions
+    ADD CONSTRAINT job_positions_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2556 (class 2606 OID 46570)
+-- Name: logs_binds_groups logs_binds_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_binds_groups
+    ADD CONSTRAINT logs_binds_groups_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2560 (class 2606 OID 46595)
+-- Name: logs_binds_students logs_binds_students_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_binds_students
+    ADD CONSTRAINT logs_binds_students_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2564 (class 2606 OID 46620)
+-- Name: logs_rating logs_rating_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_rating
+    ADD CONSTRAINT logs_rating_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2570 (class 2606 OID 46645)
+-- Name: logs_signin logs_signin_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_signin
+    ADD CONSTRAINT logs_signin_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2534 (class 2606 OID 46496)
+-- Name: modules modules_ordernum_disciplineid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY modules
+    ADD CONSTRAINT modules_ordernum_disciplineid_key UNIQUE (ordernum, disciplineid);
+
+
+--
+-- TOC entry 2536 (class 2606 OID 46494)
+-- Name: modules modules_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY modules
+    ADD CONSTRAINT modules_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2572 (class 2606 OID 46658)
+-- Name: rating_table rating_table_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY rating_table
+    ADD CONSTRAINT rating_table_pkey PRIMARY KEY (recordbookid, submoduleid);
+
+
+--
+-- TOC entry 2505 (class 2606 OID 46364)
+-- Name: record_books record_books_externalid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY record_books
+    ADD CONSTRAINT record_books_externalid_key UNIQUE (externalid);
+
+
+--
+-- TOC entry 2507 (class 2606 OID 46362)
+-- Name: record_books record_books_pk; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY record_books
+    ADD CONSTRAINT record_books_pk PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2577 (class 2606 OID 46688)
+-- Name: record_books_plans record_books_plans_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY record_books_plans
+    ADD CONSTRAINT record_books_plans_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2579 (class 2606 OID 46690)
+-- Name: record_books_plans recordbookid_studyplanid_record_books_plans_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY record_books_plans
+    ADD CONSTRAINT recordbookid_studyplanid_record_books_plans_key UNIQUE (recordbookid, studyplanid);
+
+
+--
+-- TOC entry 2583 (class 2606 OID 46709)
+-- Name: recovery_tokens recovery_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recovery_tokens
+    ADD CONSTRAINT recovery_tokens_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2585 (class 2606 OID 46711)
+-- Name: recovery_tokens recovery_tokens_token_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recovery_tokens
+    ADD CONSTRAINT recovery_tokens_token_key UNIQUE (token);
+
+
+--
+-- TOC entry 2588 (class 2606 OID 46730)
+-- Name: requests requests_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY requests
+    ADD CONSTRAINT requests_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2590 (class 2606 OID 46746)
+-- Name: schema_version schema_version_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY schema_version
+    ADD CONSTRAINT schema_version_pkey PRIMARY KEY (installed_rank);
+
+
+--
+-- TOC entry 2466 (class 2606 OID 46132)
+-- Name: semesters semesters_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY semesters
+    ADD CONSTRAINT semesters_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2468 (class 2606 OID 46134)
+-- Name: semesters semesters_year_num_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY semesters
+    ADD CONSTRAINT semesters_year_num_key UNIQUE (year, num);
+
+
+--
+-- TOC entry 2441 (class 2606 OID 46007)
+-- Name: specializations specializations_name_facultyid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY specializations
+    ADD CONSTRAINT specializations_name_facultyid_key UNIQUE (name, facultyid);
+
+
+--
+-- TOC entry 2443 (class 2606 OID 46005)
+-- Name: specializations specializations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY specializations
+    ADD CONSTRAINT specializations_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2599 (class 2606 OID 46766)
+-- Name: students_groups students_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY students_groups
+    ADD CONSTRAINT students_groups_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2601 (class 2606 OID 46768)
+-- Name: students_groups students_groups_semesterid_recordbookid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY students_groups
+    ADD CONSTRAINT students_groups_semesterid_recordbookid_key UNIQUE (semesterid, recordbookid);
+
+
+--
+-- TOC entry 2594 (class 2606 OID 46753)
+-- Name: students students_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY students
+    ADD CONSTRAINT students_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2603 (class 2606 OID 46799)
+-- Name: study_form study_form_formname_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_form
+    ADD CONSTRAINT study_form_formname_key UNIQUE (formname);
+
+
+--
+-- TOC entry 2605 (class 2606 OID 46797)
+-- Name: study_form study_form_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_form
+    ADD CONSTRAINT study_form_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2495 (class 2606 OID 46305)
+-- Name: study_groups study_groups_facultyid_gradeid_groupnum_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_groups
+    ADD CONSTRAINT study_groups_facultyid_gradeid_groupnum_key UNIQUE (facultyid, gradeid, groupnum);
+
+
+--
+-- TOC entry 2497 (class 2606 OID 46303)
+-- Name: study_groups study_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_groups
+    ADD CONSTRAINT study_groups_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2517 (class 2606 OID 46416)
+-- Name: study_plans study_plans_externalid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_plans
+    ADD CONSTRAINT study_plans_externalid_key UNIQUE (externalid);
+
+
+--
+-- TOC entry 2519 (class 2606 OID 46414)
+-- Name: study_plans study_plans_pk; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_plans
+    ADD CONSTRAINT study_plans_pk PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2609 (class 2606 OID 46805)
+-- Name: subjects_faculties subjects_faculties_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY subjects_faculties
+    ADD CONSTRAINT subjects_faculties_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2611 (class 2606 OID 46807)
+-- Name: subjects_faculties subjects_faculties_subjectid_facultyid_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY subjects_faculties
+    ADD CONSTRAINT subjects_faculties_subjectid_facultyid_key UNIQUE (subjectid, facultyid);
+
+
+--
+-- TOC entry 2460 (class 2606 OID 46094)
+-- Name: subjects subjects_name_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY subjects
+    ADD CONSTRAINT subjects_name_key UNIQUE (name);
+
+
+--
+-- TOC entry 2462 (class 2606 OID 46092)
+-- Name: subjects subjects_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY subjects
+    ADD CONSTRAINT subjects_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2539 (class 2606 OID 46513)
+-- Name: submodules submodules_moduleid_ordernum_key; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY submodules
+    ADD CONSTRAINT submodules_moduleid_ordernum_key UNIQUE (moduleid, ordernum);
+
+
+--
+-- TOC entry 2541 (class 2606 OID 46511)
+-- Name: submodules submodules_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY submodules
+    ADD CONSTRAINT submodules_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2479 (class 2606 OID 46196)
+-- Name: teachers teachers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY teachers
+    ADD CONSTRAINT teachers_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2613 (class 2606 OID 46825)
+-- Name: text_mark text_mark_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY text_mark
+    ADD CONSTRAINT text_mark_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2418 (class 2606 OID 45927)
+-- Name: user_roles user_roles_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY user_roles
+    ADD CONSTRAINT user_roles_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 2464 (class 2606 OID 46126)
+-- Name: years years_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY years
+    ADD CONSTRAINT years_pkey PRIMARY KEY (num);
+
+
+--
+-- TOC entry 2428 (class 1259 OID 45965)
+-- Name: accountid_auth_tokens; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX accountid_auth_tokens ON auth_tokens USING btree (accountid);
+
+
+--
+-- TOC entry 2568 (class 1259 OID 46651)
+-- Name: accountid_logs_signin; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX accountid_logs_signin ON logs_signin USING btree (accountid);
+
+
+--
+-- TOC entry 2581 (class 1259 OID 46717)
+-- Name: accountid_recovery_tokens; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX accountid_recovery_tokens ON recovery_tokens USING btree (accountid);
+
+
+--
+-- TOC entry 2586 (class 1259 OID 46736)
+-- Name: accountid_requests; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX accountid_requests ON requests USING btree (accountid);
+
+
+--
+-- TOC entry 2592 (class 1259 OID 46759)
+-- Name: accountid_students; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX accountid_students ON students USING btree (accountid);
+
+
+--
+-- TOC entry 2474 (class 1259 OID 46217)
+-- Name: accountid_teachers; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX accountid_teachers ON teachers USING btree (accountid);
+
+
+--
+-- TOC entry 2448 (class 1259 OID 46051)
+-- Name: compound_disciplines_ibfk_1; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX compound_disciplines_ibfk_1 ON compound_disciplines USING btree (specializationid);
+
+
+--
+-- TOC entry 2449 (class 1259 OID 46052)
+-- Name: compound_disciplines_ibfk_2; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX compound_disciplines_ibfk_2 ON compound_disciplines USING btree (gradeid);
+
+
+--
+-- TOC entry 2480 (class 1259 OID 46265)
+-- Name: compounddiscid_disciplines; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX compounddiscid_disciplines ON disciplines USING btree (compounddiscid);
+
+
+--
+-- TOC entry 2498 (class 1259 OID 46336)
+-- Name: disciplineid_disciplines_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX disciplineid_disciplines_groups ON disciplines_groups USING btree (disciplineid);
+
+
+--
+-- TOC entry 2509 (class 1259 OID 46384)
+-- Name: disciplineid_disciplines_students; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX disciplineid_disciplines_students ON disciplines_students USING btree (disciplineid);
+
+
+--
+-- TOC entry 2526 (class 1259 OID 46468)
+-- Name: disciplineid_disciplines_teachers; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX disciplineid_disciplines_teachers ON disciplines_teachers USING btree (disciplineid);
+
+
+--
+-- TOC entry 2553 (class 1259 OID 46586)
+-- Name: disciplineid_logs_binds_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX disciplineid_logs_binds_groups ON logs_binds_groups USING btree (disciplineid);
+
+
+--
+-- TOC entry 2558 (class 1259 OID 46611)
+-- Name: disciplineid_logs_binds_students; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX disciplineid_logs_binds_students ON logs_binds_students USING btree (disciplineid);
+
+
+--
+-- TOC entry 2532 (class 1259 OID 46502)
+-- Name: disciplineid_modules; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX disciplineid_modules ON modules USING btree (disciplineid);
+
+
+--
+-- TOC entry 2458 (class 1259 OID 46069)
+-- Name: facultyid_departments; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX facultyid_departments ON departments USING btree (facultyid);
+
+
+--
+-- TOC entry 2483 (class 1259 OID 46266)
+-- Name: facultyid_disciplines; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX facultyid_disciplines ON disciplines USING btree (facultyid);
+
+
+--
+-- TOC entry 2439 (class 1259 OID 46013)
+-- Name: facultyid_specializations; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX facultyid_specializations ON specializations USING btree (facultyid);
+
+
+--
+-- TOC entry 2492 (class 1259 OID 46316)
+-- Name: facultyid_study_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX facultyid_study_groups ON study_groups USING btree (facultyid);
+
+
+--
+-- TOC entry 2515 (class 1259 OID 46427)
+-- Name: facultyid_study_plans; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX facultyid_study_plans ON study_plans USING btree (facultyid);
+
+
+--
+-- TOC entry 2606 (class 1259 OID 46818)
+-- Name: facultyid_subjects_faculties; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX facultyid_subjects_faculties ON subjects_faculties USING btree (facultyid);
+
+
+--
+-- TOC entry 2475 (class 1259 OID 46218)
+-- Name: facultyid_teachers; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX facultyid_teachers ON teachers USING btree (departmentid);
+
+
+--
+-- TOC entry 2484 (class 1259 OID 46267)
+-- Name: gradeid_disciplines; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX gradeid_disciplines ON disciplines USING btree (gradeid);
+
+
+--
+-- TOC entry 2493 (class 1259 OID 46317)
+-- Name: gradeid_study_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX gradeid_study_groups ON study_groups USING btree (gradeid);
+
+
+--
+-- TOC entry 2503 (class 1259 OID 46337)
+-- Name: groupid_disciplines_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX groupid_disciplines_groups ON disciplines_groups USING btree (groupid);
+
+
+--
+-- TOC entry 2548 (class 1259 OID 46561)
+-- Name: groupid_groups_years; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX groupid_groups_years ON groups_years USING btree (groupid);
+
+
+--
+-- TOC entry 2554 (class 1259 OID 46587)
+-- Name: groupid_logs_binds_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX groupid_logs_binds_groups ON logs_binds_groups USING btree (groupid);
+
+
+--
+-- TOC entry 2595 (class 1259 OID 46784)
+-- Name: groupid_students_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX groupid_students_groups ON students_groups USING btree (groupid);
+
+
+--
+-- TOC entry 2476 (class 1259 OID 46219)
+-- Name: jobpositionid_teachers; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX jobpositionid_teachers ON teachers USING btree (jobpositionid);
+
+
+--
+-- TOC entry 2537 (class 1259 OID 46519)
+-- Name: moduleid_submodules; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX moduleid_submodules ON submodules USING btree (moduleid);
+
+
+--
+-- TOC entry 2514 (class 1259 OID 46385)
+-- Name: recordbookid_disciplines_students; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX recordbookid_disciplines_students ON disciplines_students USING btree (recordbookid);
+
+
+--
+-- TOC entry 2546 (class 1259 OID 46538)
+-- Name: recordbookid_exam_period_options; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX recordbookid_exam_period_options ON exam_period_options USING btree (recordbookid);
+
+
+--
+-- TOC entry 2561 (class 1259 OID 46612)
+-- Name: recordbookid_logs_binds_students; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX recordbookid_logs_binds_students ON logs_binds_students USING btree (recordbookid);
+
+
+--
+-- TOC entry 2565 (class 1259 OID 46636)
+-- Name: recordbookid_logs_rating; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX recordbookid_logs_rating ON logs_rating USING btree (recordbookid);
+
+
+--
+-- TOC entry 2573 (class 1259 OID 46674)
+-- Name: recordbookid_rating_table; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX recordbookid_rating_table ON rating_table USING btree (recordbookid);
+
+
+--
+-- TOC entry 2596 (class 1259 OID 46785)
+-- Name: recordbookid_students_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX recordbookid_students_groups ON students_groups USING btree (recordbookid);
+
+
+--
+-- TOC entry 2591 (class 1259 OID 46747)
+-- Name: schema_version_s_idx; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX schema_version_s_idx ON schema_version USING btree (success);
+
+
+--
+-- TOC entry 2485 (class 1259 OID 46268)
+-- Name: semesterid_disciplines; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX semesterid_disciplines ON disciplines USING btree (semesterid);
+
+
+--
+-- TOC entry 2597 (class 1259 OID 46786)
+-- Name: semesterid_students_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX semesterid_students_groups ON students_groups USING btree (semesterid);
+
+
+--
+-- TOC entry 2551 (class 1259 OID 46562)
+-- Name: specializationid_groups_years; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX specializationid_groups_years ON groups_years USING btree (specializationid);
+
+
+--
+-- TOC entry 2508 (class 1259 OID 46365)
+-- Name: studentid_record_books; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX studentid_record_books ON record_books USING btree (studentid);
+
+
+--
+-- TOC entry 2525 (class 1259 OID 46449)
+-- Name: studyplanid_disciplines_study_plans; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX studyplanid_disciplines_study_plans ON disciplines_study_plans USING btree (studyplanid);
+
+
+--
+-- TOC entry 2580 (class 1259 OID 46701)
+-- Name: studyplanid_record_books_plans; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX studyplanid_record_books_plans ON record_books_plans USING btree (studyplanid);
+
+
+--
+-- TOC entry 2486 (class 1259 OID 46269)
+-- Name: subjectid_disciplines; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX subjectid_disciplines ON disciplines USING btree (subjectid);
+
+
+--
+-- TOC entry 2607 (class 1259 OID 46819)
+-- Name: subjectid_subjects_faculties; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX subjectid_subjects_faculties ON subjects_faculties USING btree (subjectid);
+
+
+--
+-- TOC entry 2547 (class 1259 OID 46539)
+-- Name: submoduleid_exam_period_options; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX submoduleid_exam_period_options ON exam_period_options USING btree (submoduleid);
+
+
+--
+-- TOC entry 2566 (class 1259 OID 46637)
+-- Name: submoduleid_logs_rating; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX submoduleid_logs_rating ON logs_rating USING btree (submoduleid);
+
+
+--
+-- TOC entry 2574 (class 1259 OID 46675)
+-- Name: submoduleid_rating_table; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX submoduleid_rating_table ON rating_table USING btree (submoduleid);
+
+
+--
+-- TOC entry 2487 (class 1259 OID 46270)
+-- Name: teacherid_disciplines; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX teacherid_disciplines ON disciplines USING btree (authorid);
+
+
+--
+-- TOC entry 2531 (class 1259 OID 46469)
+-- Name: teacherid_disciplines_teachers; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX teacherid_disciplines_teachers ON disciplines_teachers USING btree (teacherid);
+
+
+--
+-- TOC entry 2557 (class 1259 OID 46588)
+-- Name: teacherid_logs_binds_groups; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX teacherid_logs_binds_groups ON logs_binds_groups USING btree (teacherid);
+
+
+--
+-- TOC entry 2562 (class 1259 OID 46613)
+-- Name: teacherid_logs_binds_students; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX teacherid_logs_binds_students ON logs_binds_students USING btree (teacherid);
+
+
+--
+-- TOC entry 2567 (class 1259 OID 46638)
+-- Name: teacherid_logs_rating; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX teacherid_logs_rating ON logs_rating USING btree (teacherid);
+
+
+--
+-- TOC entry 2575 (class 1259 OID 46676)
+-- Name: teacherid_rating_table; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX teacherid_rating_table ON rating_table USING btree (teacherid);
+
+
+--
+-- TOC entry 2477 (class 1259 OID 46220)
+-- Name: teachers_ibfk_4; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX teachers_ibfk_4 ON teachers USING btree (facultyid);
+
+
+--
+-- TOC entry 2427 (class 1259 OID 45955)
+-- Name: userroleid; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX userroleid ON accounts USING btree (userroleid);
+
+
+--
+-- TOC entry 2469 (class 1259 OID 46140)
+-- Name: year_2; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX year_2 ON semesters USING btree (year);
+
+
+--
+-- TOC entry 2552 (class 1259 OID 46563)
+-- Name: year_groups_years; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX year_groups_years ON groups_years USING btree (year);
+
+
+--
+-- TOC entry 2520 (class 1259 OID 46428)
+-- Name: year_study_plans; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX year_study_plans ON study_plans USING btree (year);
+
+
+--
+-- TOC entry 2614 (class 2606 OID 45950)
+-- Name: accounts accounts_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY accounts
+    ADD CONSTRAINT accounts_ibfk_1 FOREIGN KEY (userroleid) REFERENCES user_roles(id);
+
+
+--
+-- TOC entry 2616 (class 2606 OID 46041)
+-- Name: compound_disciplines compound_disciplines_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY compound_disciplines
+    ADD CONSTRAINT compound_disciplines_ibfk_1 FOREIGN KEY (specializationid) REFERENCES specializations(id);
+
+
+--
+-- TOC entry 2617 (class 2606 OID 46046)
+-- Name: compound_disciplines compound_disciplines_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY compound_disciplines
+    ADD CONSTRAINT compound_disciplines_ibfk_2 FOREIGN KEY (gradeid) REFERENCES grades(id);
+
+
+--
+-- TOC entry 2618 (class 2606 OID 46064)
+-- Name: departments departments_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY departments
+    ADD CONSTRAINT departments_ibfk_1 FOREIGN KEY (facultyid) REFERENCES faculties(id);
+
+
+--
+-- TOC entry 2632 (class 2606 OID 46326)
+-- Name: disciplines_groups disciplines_groups_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_groups
+    ADD CONSTRAINT disciplines_groups_ibfk_1 FOREIGN KEY (disciplineid) REFERENCES disciplines(id);
+
+
+--
+-- TOC entry 2633 (class 2606 OID 46331)
+-- Name: disciplines_groups disciplines_groups_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_groups
+    ADD CONSTRAINT disciplines_groups_ibfk_2 FOREIGN KEY (groupid) REFERENCES study_groups(id);
+
+
+--
+-- TOC entry 2624 (class 2606 OID 46235)
+-- Name: disciplines disciplines_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines
+    ADD CONSTRAINT disciplines_ibfk_1 FOREIGN KEY (subjectid) REFERENCES subjects(id);
+
+
+--
+-- TOC entry 2625 (class 2606 OID 46240)
+-- Name: disciplines disciplines_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines
+    ADD CONSTRAINT disciplines_ibfk_2 FOREIGN KEY (semesterid) REFERENCES semesters(id);
+
+
+--
+-- TOC entry 2626 (class 2606 OID 46245)
+-- Name: disciplines disciplines_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines
+    ADD CONSTRAINT disciplines_ibfk_3 FOREIGN KEY (authorid) REFERENCES teachers(id);
+
+
+--
+-- TOC entry 2627 (class 2606 OID 46250)
+-- Name: disciplines disciplines_ibfk_4; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines
+    ADD CONSTRAINT disciplines_ibfk_4 FOREIGN KEY (facultyid) REFERENCES faculties(id);
+
+
+--
+-- TOC entry 2628 (class 2606 OID 46255)
+-- Name: disciplines disciplines_ibfk_5; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines
+    ADD CONSTRAINT disciplines_ibfk_5 FOREIGN KEY (gradeid) REFERENCES grades(id);
+
+
+--
+-- TOC entry 2629 (class 2606 OID 46260)
+-- Name: disciplines disciplines_ibfk_6; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines
+    ADD CONSTRAINT disciplines_ibfk_6 FOREIGN KEY (compounddiscid) REFERENCES compound_disciplines(id);
+
+
+--
+-- TOC entry 2634 (class 2606 OID 46374)
+-- Name: disciplines_students disciplines_students_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_students
+    ADD CONSTRAINT disciplines_students_ibfk_1 FOREIGN KEY (disciplineid) REFERENCES disciplines(id);
+
+
+--
+-- TOC entry 2635 (class 2606 OID 46379)
+-- Name: disciplines_students disciplines_students_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_students
+    ADD CONSTRAINT disciplines_students_ibfk_2 FOREIGN KEY (recordbookid) REFERENCES record_books(id);
+
+
+--
+-- TOC entry 2638 (class 2606 OID 46439)
+-- Name: disciplines_study_plans disciplines_study_plans_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_study_plans
+    ADD CONSTRAINT disciplines_study_plans_ibfk_1 FOREIGN KEY (disciplineid) REFERENCES disciplines(id);
+
+
+--
+-- TOC entry 2639 (class 2606 OID 46444)
+-- Name: disciplines_study_plans disciplines_study_plans_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_study_plans
+    ADD CONSTRAINT disciplines_study_plans_ibfk_2 FOREIGN KEY (studyplanid) REFERENCES study_plans(id);
+
+
+--
+-- TOC entry 2640 (class 2606 OID 46458)
+-- Name: disciplines_teachers disciplines_teachers_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_teachers
+    ADD CONSTRAINT disciplines_teachers_ibfk_1 FOREIGN KEY (disciplineid) REFERENCES disciplines(id);
+
+
+--
+-- TOC entry 2641 (class 2606 OID 46463)
+-- Name: disciplines_teachers disciplines_teachers_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY disciplines_teachers
+    ADD CONSTRAINT disciplines_teachers_ibfk_2 FOREIGN KEY (teacherid) REFERENCES teachers(id);
+
+
+--
+-- TOC entry 2644 (class 2606 OID 46528)
+-- Name: exam_period_options exam_period_options_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY exam_period_options
+    ADD CONSTRAINT exam_period_options_ibfk_1 FOREIGN KEY (submoduleid) REFERENCES submodules(id);
+
+
+--
+-- TOC entry 2645 (class 2606 OID 46533)
+-- Name: exam_period_options exam_period_options_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY exam_period_options
+    ADD CONSTRAINT exam_period_options_ibfk_2 FOREIGN KEY (recordbookid) REFERENCES record_books(id);
+
+
+--
+-- TOC entry 2646 (class 2606 OID 46546)
+-- Name: groups_years groups_years_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY groups_years
+    ADD CONSTRAINT groups_years_ibfk_1 FOREIGN KEY (groupid) REFERENCES study_groups(id);
+
+
+--
+-- TOC entry 2647 (class 2606 OID 46551)
+-- Name: groups_years groups_years_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY groups_years
+    ADD CONSTRAINT groups_years_ibfk_2 FOREIGN KEY (year) REFERENCES years(num);
+
+
+--
+-- TOC entry 2648 (class 2606 OID 46556)
+-- Name: groups_years groups_years_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY groups_years
+    ADD CONSTRAINT groups_years_ibfk_3 FOREIGN KEY (specializationid) REFERENCES specializations(id);
+
+
+--
+-- TOC entry 2649 (class 2606 OID 46571)
+-- Name: logs_binds_groups logs_binds_groups_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_binds_groups
+    ADD CONSTRAINT logs_binds_groups_ibfk_1 FOREIGN KEY (disciplineid) REFERENCES disciplines(id);
+
+
+--
+-- TOC entry 2650 (class 2606 OID 46576)
+-- Name: logs_binds_groups logs_binds_groups_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_binds_groups
+    ADD CONSTRAINT logs_binds_groups_ibfk_2 FOREIGN KEY (teacherid) REFERENCES teachers(id);
+
+
+--
+-- TOC entry 2651 (class 2606 OID 46581)
+-- Name: logs_binds_groups logs_binds_groups_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_binds_groups
+    ADD CONSTRAINT logs_binds_groups_ibfk_3 FOREIGN KEY (groupid) REFERENCES study_groups(id);
+
+
+--
+-- TOC entry 2652 (class 2606 OID 46596)
+-- Name: logs_binds_students logs_binds_students_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_binds_students
+    ADD CONSTRAINT logs_binds_students_ibfk_1 FOREIGN KEY (disciplineid) REFERENCES disciplines(id);
+
+
+--
+-- TOC entry 2653 (class 2606 OID 46601)
+-- Name: logs_binds_students logs_binds_students_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_binds_students
+    ADD CONSTRAINT logs_binds_students_ibfk_2 FOREIGN KEY (teacherid) REFERENCES teachers(id);
+
+
+--
+-- TOC entry 2654 (class 2606 OID 46606)
+-- Name: logs_binds_students logs_binds_students_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_binds_students
+    ADD CONSTRAINT logs_binds_students_ibfk_3 FOREIGN KEY (recordbookid) REFERENCES record_books(id);
+
+
+--
+-- TOC entry 2655 (class 2606 OID 46621)
+-- Name: logs_rating logs_rating_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_rating
+    ADD CONSTRAINT logs_rating_ibfk_1 FOREIGN KEY (recordbookid) REFERENCES record_books(id);
+
+
+--
+-- TOC entry 2656 (class 2606 OID 46626)
+-- Name: logs_rating logs_rating_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_rating
+    ADD CONSTRAINT logs_rating_ibfk_2 FOREIGN KEY (submoduleid) REFERENCES submodules(id);
+
+
+--
+-- TOC entry 2657 (class 2606 OID 46631)
+-- Name: logs_rating logs_rating_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_rating
+    ADD CONSTRAINT logs_rating_ibfk_3 FOREIGN KEY (teacherid) REFERENCES teachers(id);
+
+
+--
+-- TOC entry 2658 (class 2606 OID 46646)
+-- Name: logs_signin logs_signin_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY logs_signin
+    ADD CONSTRAINT logs_signin_ibfk_1 FOREIGN KEY (accountid) REFERENCES accounts(id);
+
+
+--
+-- TOC entry 2642 (class 2606 OID 46497)
+-- Name: modules modules_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY modules
+    ADD CONSTRAINT modules_ibfk_1 FOREIGN KEY (disciplineid) REFERENCES disciplines(id);
+
+
+--
+-- TOC entry 2659 (class 2606 OID 46659)
+-- Name: rating_table rating_table_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY rating_table
+    ADD CONSTRAINT rating_table_ibfk_1 FOREIGN KEY (recordbookid) REFERENCES record_books(id);
+
+
+--
+-- TOC entry 2660 (class 2606 OID 46664)
+-- Name: rating_table rating_table_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY rating_table
+    ADD CONSTRAINT rating_table_ibfk_2 FOREIGN KEY (submoduleid) REFERENCES submodules(id);
+
+
+--
+-- TOC entry 2661 (class 2606 OID 46669)
+-- Name: rating_table rating_table_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY rating_table
+    ADD CONSTRAINT rating_table_ibfk_3 FOREIGN KEY (teacherid) REFERENCES teachers(id);
+
+
+--
+-- TOC entry 2662 (class 2606 OID 46691)
+-- Name: record_books_plans record_books_plans_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY record_books_plans
+    ADD CONSTRAINT record_books_plans_ibfk_1 FOREIGN KEY (recordbookid) REFERENCES record_books(id);
+
+
+--
+-- TOC entry 2663 (class 2606 OID 46696)
+-- Name: record_books_plans record_books_plans_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY record_books_plans
+    ADD CONSTRAINT record_books_plans_ibfk_2 FOREIGN KEY (studyplanid) REFERENCES study_plans(id);
+
+
+--
+-- TOC entry 2664 (class 2606 OID 46712)
+-- Name: recovery_tokens recovery_tokens_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recovery_tokens
+    ADD CONSTRAINT recovery_tokens_ibfk_1 FOREIGN KEY (accountid) REFERENCES accounts(id);
+
+
+--
+-- TOC entry 2665 (class 2606 OID 46731)
+-- Name: requests requests_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY requests
+    ADD CONSTRAINT requests_ibfk_1 FOREIGN KEY (accountid) REFERENCES accounts(id) ON UPDATE SET NULL ON DELETE SET NULL;
+
+
+--
+-- TOC entry 2619 (class 2606 OID 46135)
+-- Name: semesters semesters_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY semesters
+    ADD CONSTRAINT semesters_ibfk_1 FOREIGN KEY (year) REFERENCES years(num);
+
+
+--
+-- TOC entry 2615 (class 2606 OID 46008)
+-- Name: specializations specializations_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY specializations
+    ADD CONSTRAINT specializations_ibfk_1 FOREIGN KEY (facultyid) REFERENCES faculties(id);
+
+
+--
+-- TOC entry 2667 (class 2606 OID 46769)
+-- Name: students_groups students_groups_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY students_groups
+    ADD CONSTRAINT students_groups_ibfk_1 FOREIGN KEY (recordbookid) REFERENCES record_books(id);
+
+
+--
+-- TOC entry 2668 (class 2606 OID 46774)
+-- Name: students_groups students_groups_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY students_groups
+    ADD CONSTRAINT students_groups_ibfk_2 FOREIGN KEY (groupid) REFERENCES study_groups(id);
+
+
+--
+-- TOC entry 2669 (class 2606 OID 46779)
+-- Name: students_groups students_groups_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY students_groups
+    ADD CONSTRAINT students_groups_ibfk_3 FOREIGN KEY (semesterid) REFERENCES semesters(id);
+
+
+--
+-- TOC entry 2666 (class 2606 OID 46754)
+-- Name: students students_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY students
+    ADD CONSTRAINT students_ibfk_2 FOREIGN KEY (accountid) REFERENCES accounts(id);
+
+
+--
+-- TOC entry 2630 (class 2606 OID 46306)
+-- Name: study_groups study_groups_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_groups
+    ADD CONSTRAINT study_groups_ibfk_2 FOREIGN KEY (gradeid) REFERENCES grades(id);
+
+
+--
+-- TOC entry 2631 (class 2606 OID 46311)
+-- Name: study_groups study_groups_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_groups
+    ADD CONSTRAINT study_groups_ibfk_3 FOREIGN KEY (facultyid) REFERENCES faculties(id);
+
+
+--
+-- TOC entry 2636 (class 2606 OID 46417)
+-- Name: study_plans study_plans_fk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_plans
+    ADD CONSTRAINT study_plans_fk_1 FOREIGN KEY (year) REFERENCES years(num);
+
+
+--
+-- TOC entry 2637 (class 2606 OID 46422)
+-- Name: study_plans study_plans_fk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY study_plans
+    ADD CONSTRAINT study_plans_fk_2 FOREIGN KEY (facultyid) REFERENCES faculties(id);
+
+
+--
+-- TOC entry 2670 (class 2606 OID 46808)
+-- Name: subjects_faculties subjects_faculties_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY subjects_faculties
+    ADD CONSTRAINT subjects_faculties_ibfk_1 FOREIGN KEY (facultyid) REFERENCES faculties(id);
+
+
+--
+-- TOC entry 2671 (class 2606 OID 46813)
+-- Name: subjects_faculties subjects_faculties_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY subjects_faculties
+    ADD CONSTRAINT subjects_faculties_ibfk_2 FOREIGN KEY (subjectid) REFERENCES subjects(id);
+
+
+--
+-- TOC entry 2643 (class 2606 OID 46514)
+-- Name: submodules submodules_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY submodules
+    ADD CONSTRAINT submodules_ibfk_1 FOREIGN KEY (moduleid) REFERENCES modules(id);
+
+
+--
+-- TOC entry 2620 (class 2606 OID 46197)
+-- Name: teachers teachers_ibfk_1; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY teachers
+    ADD CONSTRAINT teachers_ibfk_1 FOREIGN KEY (accountid) REFERENCES accounts(id);
+
+
+--
+-- TOC entry 2621 (class 2606 OID 46202)
+-- Name: teachers teachers_ibfk_2; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY teachers
+    ADD CONSTRAINT teachers_ibfk_2 FOREIGN KEY (departmentid) REFERENCES departments(id);
+
+
+--
+-- TOC entry 2622 (class 2606 OID 46207)
+-- Name: teachers teachers_ibfk_3; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY teachers
+    ADD CONSTRAINT teachers_ibfk_3 FOREIGN KEY (jobpositionid) REFERENCES job_positions(id);
+
+
+--
+-- TOC entry 2623 (class 2606 OID 46212)
+-- Name: teachers teachers_ibfk_4; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY teachers
+    ADD CONSTRAINT teachers_ibfk_4 FOREIGN KEY (facultyid) REFERENCES faculties(id);
diff --git a/db/postgresql/tables_and_views.sql b/db/postgresql/tables_and_views.sql
new file mode 100644
index 0000000000000000000000000000000000000000..4cf5f205c1f7ccbd665033333e47a36011f0d368
--- /dev/null
+++ b/db/postgresql/tables_and_views.sql
@@ -0,0 +1,1232 @@
+CREATE SEQUENCE seq_accounts
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+SET default_with_oids = false;
+
+--
+-- TOC entry 202 (class 1259 OID 45928)
+-- Name: accounts; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE accounts (
+    id integer DEFAULT nextval('seq_accounts'::regclass) NOT NULL,
+    inila character varying(40) DEFAULT NULL::character varying,
+    externalid character varying(9) DEFAULT NULL::character varying,
+    login character varying(50) DEFAULT NULL::character varying,
+    password character varying(64) DEFAULT NULL::character varying,
+    email character varying(255) DEFAULT NULL::character varying,
+    lastname character varying(30) NOT NULL,
+    firstname character varying(30) NOT NULL,
+    secondname character varying(30) NOT NULL,
+    userroleid integer NOT NULL,
+    activationcode character varying(40) DEFAULT NULL::character varying,
+    isenabled smallint DEFAULT (1)::smallint NOT NULL
+);
+
+
+--
+-- TOC entry 203 (class 1259 OID 45956)
+-- Name: auth_tokens; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE auth_tokens (
+    token character(40) NOT NULL,
+    accountid integer NOT NULL,
+    description character varying(60) DEFAULT ''::character varying NOT NULL,
+    created timestamp(0) without time zone DEFAULT now() NOT NULL,
+    accessed timestamp(0) without time zone DEFAULT '2000-01-01 00:00:00'::timestamp without time zone NOT NULL,
+    mask integer DEFAULT 0 NOT NULL
+);
+
+
+--
+-- TOC entry 171 (class 1259 OID 35310)
+-- Name: seq_compound_discip; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_compound_discip
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 207 (class 1259 OID 46034)
+-- Name: compound_disciplines; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE compound_disciplines (
+    id integer DEFAULT nextval('seq_compound_discip'::regclass) NOT NULL,
+    name character varying(200) DEFAULT 'Курс по выбору'::character varying,
+    gradeid integer NOT NULL,
+    specializationid integer NOT NULL
+);
+
+
+--
+-- TOC entry 172 (class 1259 OID 35313)
+-- Name: seq_departments; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_departments
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 208 (class 1259 OID 46053)
+-- Name: departments; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE departments (
+    id integer DEFAULT nextval('seq_departments'::regclass) NOT NULL,
+    name character varying(200) DEFAULT NULL::character varying,
+    facultyid integer NOT NULL,
+    externalid character varying(9)
+);
+
+
+--
+-- TOC entry 173 (class 1259 OID 35316)
+-- Name: seq_disciplines; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_disciplines
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 214 (class 1259 OID 46221)
+-- Name: disciplines; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE disciplines (
+    id integer DEFAULT nextval('seq_disciplines'::regclass) NOT NULL,
+    externalid character varying(9) DEFAULT NULL::character varying,
+    gradeid integer,
+    subjectid integer NOT NULL,
+    authorid integer NOT NULL,
+    examtype exam_credit_grading_credit NOT NULL,
+    semesterid integer NOT NULL,
+    practicecount integer DEFAULT 0 NOT NULL,
+    lecturecount integer DEFAULT 0 NOT NULL,
+    labcount integer DEFAULT 0 NOT NULL,
+    facultyid integer NOT NULL,
+    milestone integer DEFAULT 0 NOT NULL,
+    milestonedate date,
+    subtype scientific_disciplinary_coursework,
+    compounddiscid integer,
+    maxrate integer DEFAULT 0 NOT NULL,
+    currate integer DEFAULT 0 NOT NULL,
+    islocked integer DEFAULT 0 NOT NULL
+);
+
+
+--
+-- TOC entry 215 (class 1259 OID 46275)
+-- Name: seq_disciplines_exam_type; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_disciplines_exam_type
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 216 (class 1259 OID 46277)
+-- Name: disciplines_exam_type; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE disciplines_exam_type (
+    id integer DEFAULT nextval('seq_disciplines_exam_type'::regclass) NOT NULL,
+    examtypename character varying(40) NOT NULL
+);
+
+
+--
+-- TOC entry 174 (class 1259 OID 35319)
+-- Name: seq_disciplines_groups; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_disciplines_groups
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 218 (class 1259 OID 46318)
+-- Name: disciplines_groups; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE disciplines_groups (
+    id integer DEFAULT nextval('seq_disciplines_groups'::regclass) NOT NULL,
+    disciplineid integer NOT NULL,
+    groupid integer NOT NULL
+);
+
+
+--
+-- TOC entry 175 (class 1259 OID 35322)
+-- Name: seq_disciplines_students; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_disciplines_students
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 221 (class 1259 OID 46366)
+-- Name: disciplines_students; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE disciplines_students (
+    id integer DEFAULT nextval('seq_disciplines_students'::regclass) NOT NULL,
+    disciplineid integer NOT NULL,
+    type attach_detach NOT NULL,
+    recordbookid integer
+);
+
+
+--
+-- TOC entry 224 (class 1259 OID 46429)
+-- Name: seq_disciplines_study_plans; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_disciplines_study_plans
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 225 (class 1259 OID 46431)
+-- Name: disciplines_study_plans; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE disciplines_study_plans (
+    id integer DEFAULT nextval('seq_disciplines_study_plans'::regclass) NOT NULL,
+    disciplineid integer NOT NULL,
+    studyplanid integer NOT NULL
+);
+
+
+--
+-- TOC entry 176 (class 1259 OID 35325)
+-- Name: seq_disciplines_teachers; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_disciplines_teachers
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 226 (class 1259 OID 46450)
+-- Name: disciplines_teachers; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE disciplines_teachers (
+    id integer DEFAULT nextval('seq_disciplines_teachers'::regclass) NOT NULL,
+    disciplineid integer NOT NULL,
+    teacherid integer NOT NULL
+);
+
+
+--
+-- TOC entry 177 (class 1259 OID 35328)
+-- Name: seq_exam_period_options; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_exam_period_options
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 229 (class 1259 OID 46520)
+-- Name: exam_period_options; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE exam_period_options (
+    id integer DEFAULT nextval('seq_exam_period_options'::regclass) NOT NULL,
+    submoduleid integer NOT NULL,
+    recordbookid integer,
+    type absence_pass
+);
+
+
+--
+-- TOC entry 178 (class 1259 OID 35331)
+-- Name: seq_faculties; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_faculties
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 204 (class 1259 OID 45984)
+-- Name: faculties; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE faculties (
+    id integer DEFAULT nextval('seq_faculties'::regclass) NOT NULL,
+    name character varying(100) NOT NULL,
+    abbr character varying(20) NOT NULL,
+    externalid character varying(9) DEFAULT NULL::character varying
+);
+
+
+--
+-- TOC entry 179 (class 1259 OID 35334)
+-- Name: seq_grades; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_grades
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 206 (class 1259 OID 46026)
+-- Name: grades; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE grades (
+    id integer DEFAULT nextval('seq_grades'::regclass) NOT NULL,
+    num integer NOT NULL,
+    degree bachelor_master_specialist NOT NULL
+);
+
+
+--
+-- TOC entry 230 (class 1259 OID 46540)
+-- Name: groups_years; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE groups_years (
+    groupid integer NOT NULL,
+    year integer NOT NULL,
+    specializationid integer NOT NULL,
+    name character varying(50) DEFAULT NULL::character varying
+);
+
+
+--
+-- TOC entry 180 (class 1259 OID 35337)
+-- Name: seq_job_positions; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_job_positions
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 212 (class 1259 OID 46182)
+-- Name: job_positions; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE job_positions (
+    id integer DEFAULT nextval('seq_job_positions'::regclass) NOT NULL,
+    name character varying(200) NOT NULL
+);
+
+
+--
+-- TOC entry 181 (class 1259 OID 35340)
+-- Name: seq_logs_binds_groups; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_logs_binds_groups
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 231 (class 1259 OID 46564)
+-- Name: logs_binds_groups; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE logs_binds_groups (
+    id integer DEFAULT nextval('seq_logs_binds_groups'::regclass) NOT NULL,
+    disciplineid integer NOT NULL,
+    teacherid integer NOT NULL,
+    groupid integer NOT NULL,
+    date timestamp(0) without time zone DEFAULT now() NOT NULL,
+    type attach_detach NOT NULL
+);
+
+
+--
+-- TOC entry 182 (class 1259 OID 35343)
+-- Name: seq_logs_binds_students; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_logs_binds_students
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 232 (class 1259 OID 46589)
+-- Name: logs_binds_students; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE logs_binds_students (
+    id integer DEFAULT nextval('seq_logs_binds_students'::regclass) NOT NULL,
+    disciplineid integer NOT NULL,
+    teacherid integer,
+    date timestamp(0) without time zone DEFAULT now() NOT NULL,
+    type attach_detach NOT NULL,
+    recordbookid integer
+);
+
+
+--
+-- TOC entry 183 (class 1259 OID 35346)
+-- Name: seq_logs_rating; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_logs_rating
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 233 (class 1259 OID 46614)
+-- Name: logs_rating; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE logs_rating (
+    id integer DEFAULT nextval('seq_logs_rating'::regclass) NOT NULL,
+    submoduleid integer NOT NULL,
+    teacherid integer NOT NULL,
+    rate integer NOT NULL,
+    date timestamp(0) without time zone DEFAULT now() NOT NULL,
+    action add_change_delete NOT NULL,
+    recordbookid integer
+);
+
+
+--
+-- TOC entry 184 (class 1259 OID 35349)
+-- Name: seq_logs_signin; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_logs_signin
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 234 (class 1259 OID 46639)
+-- Name: logs_signin; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE logs_signin (
+    id integer DEFAULT nextval('seq_logs_signin'::regclass) NOT NULL,
+    accountid integer NOT NULL,
+    date timestamp(0) without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- TOC entry 200 (class 1259 OID 35604)
+-- Name: seq_modules; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_modules
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 227 (class 1259 OID 46489)
+-- Name: modules; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE modules (
+    id integer DEFAULT nextval('seq_modules'::regclass) NOT NULL,
+    name character varying(200) NOT NULL,
+    ordernum integer NOT NULL,
+    disciplineid integer NOT NULL,
+    type regular_exam_bonus_extra
+);
+
+
+--
+-- TOC entry 236 (class 1259 OID 46680)
+-- Name: seq_record_books_plans; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_record_books_plans
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 237 (class 1259 OID 46682)
+-- Name: record_books_plans; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE record_books_plans (
+    id integer DEFAULT nextval('seq_record_books_plans'::regclass) NOT NULL,
+    recordbookid integer NOT NULL,
+    studyplanid integer NOT NULL,
+    bindingtime timestamp(0) without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- TOC entry 191 (class 1259 OID 35371)
+-- Name: seq_students_groups; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_students_groups
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 242 (class 1259 OID 46760)
+-- Name: students_groups; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE students_groups (
+    id integer DEFAULT nextval('seq_students_groups'::regclass) NOT NULL,
+    groupid integer NOT NULL,
+    semesterid integer NOT NULL,
+    date date,
+    state common_outlet_expulsion_leave DEFAULT 'common'::common_outlet_expulsion_leave NOT NULL,
+    recordbookid integer
+);
+
+
+--
+-- TOC entry 252 (class 1259 OID 46937)
+-- Name: private_view_disciplines_recordbooks_without_type; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW private_view_disciplines_recordbooks_without_type AS
+ SELECT DISTINCT disciplines_students.recordbookid,
+    disciplines_students.disciplineid,
+    disciplines.semesterid
+   FROM (disciplines_students
+     JOIN disciplines ON ((disciplines_students.disciplineid = disciplines.id)))
+UNION
+ SELECT DISTINCT students_groups.recordbookid,
+    disciplines_groups.disciplineid,
+    disciplines.semesterid
+   FROM ((disciplines_groups
+     JOIN disciplines ON ((disciplines_groups.disciplineid = disciplines.id)))
+     LEFT JOIN students_groups ON ((((students_groups.groupid = disciplines_groups.groupid) AND (students_groups.semesterid = disciplines.semesterid)) AND (students_groups.state <= 'outlet'::common_outlet_expulsion_leave))))
+  GROUP BY students_groups.recordbookid, disciplines_groups.disciplineid, disciplines.semesterid
+UNION
+ SELECT DISTINCT record_books_plans.recordbookid,
+    disciplines_study_plans.disciplineid,
+    disciplines.semesterid
+   FROM ((disciplines_study_plans
+     LEFT JOIN record_books_plans ON ((disciplines_study_plans.studyplanid = record_books_plans.studyplanid)))
+     JOIN disciplines ON ((disciplines_study_plans.disciplineid = disciplines.id)))
+  GROUP BY record_books_plans.recordbookid, disciplines_study_plans.disciplineid, disciplines.semesterid;
+
+
+--
+-- TOC entry 235 (class 1259 OID 46653)
+-- Name: rating_table; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE rating_table (
+    teacherid integer NOT NULL,
+    submoduleid integer NOT NULL,
+    rate integer NOT NULL,
+    date date NOT NULL,
+    recordbookid integer DEFAULT 0 NOT NULL
+);
+
+
+--
+-- TOC entry 219 (class 1259 OID 46354)
+-- Name: seq_record_books; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_record_books
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 220 (class 1259 OID 46356)
+-- Name: record_books; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE record_books (
+    id integer DEFAULT nextval('seq_record_books'::regclass) NOT NULL,
+    studentid integer NOT NULL,
+    externalid character varying(50) DEFAULT NULL::character varying
+);
+
+
+--
+-- TOC entry 185 (class 1259 OID 35352)
+-- Name: seq_recovery_tokens; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_recovery_tokens
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 238 (class 1259 OID 46702)
+-- Name: recovery_tokens; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE recovery_tokens (
+    id integer DEFAULT nextval('seq_recovery_tokens'::regclass) NOT NULL,
+    accountid integer NOT NULL,
+    date timestamp(0) without time zone DEFAULT now() NOT NULL,
+    token character varying(100) NOT NULL,
+    isused smallint DEFAULT (0)::smallint NOT NULL
+);
+
+
+--
+-- TOC entry 187 (class 1259 OID 35359)
+-- Name: seq_requests; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_requests
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 239 (class 1259 OID 46718)
+-- Name: requests; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE requests (
+    id integer DEFAULT nextval('seq_requests'::regclass) NOT NULL,
+    accountid integer,
+    title character varying(50) DEFAULT NULL::character varying,
+    description text,
+    date timestamp(0) without time zone DEFAULT now() NOT NULL,
+    status opened_processed_closed DEFAULT 'opened'::opened_processed_closed,
+    hasimage integer DEFAULT 0 NOT NULL
+);
+
+
+--
+-- TOC entry 240 (class 1259 OID 46737)
+-- Name: schema_version; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE schema_version (
+    installed_rank integer NOT NULL,
+    version character varying(50) DEFAULT NULL::character varying,
+    description character varying(200) NOT NULL,
+    type character varying(20) NOT NULL,
+    script character varying(1000) NOT NULL,
+    checksum integer,
+    installed_by character varying(100) NOT NULL,
+    installed_on timestamp(0) without time zone DEFAULT now() NOT NULL,
+    execution_time integer NOT NULL,
+    success smallint NOT NULL
+);
+
+
+--
+-- TOC entry 188 (class 1259 OID 35362)
+-- Name: seq_semesters; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_semesters
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 211 (class 1259 OID 46127)
+-- Name: semesters; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE semesters (
+    id integer DEFAULT nextval('seq_semesters'::regclass) NOT NULL,
+    year integer NOT NULL,
+    num integer NOT NULL
+);
+
+
+--
+-- TOC entry 186 (class 1259 OID 35357)
+-- Name: seq_report_params; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_report_params
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 189 (class 1259 OID 35365)
+-- Name: seq_specializations; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_specializations
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 190 (class 1259 OID 35368)
+-- Name: seq_students; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_students
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 243 (class 1259 OID 46790)
+-- Name: seq_study_form; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_study_form
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 192 (class 1259 OID 35374)
+-- Name: seq_study_groups; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_study_groups
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 222 (class 1259 OID 46407)
+-- Name: seq_study_plans; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_study_plans
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 193 (class 1259 OID 35377)
+-- Name: seq_subjects; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_subjects
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 194 (class 1259 OID 35380)
+-- Name: seq_subjects_faculties; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_subjects_faculties
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 195 (class 1259 OID 35384)
+-- Name: seq_submodules; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_submodules
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 196 (class 1259 OID 35387)
+-- Name: seq_teachers; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_teachers
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 197 (class 1259 OID 35390)
+-- Name: seq_text_mark; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_text_mark
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 198 (class 1259 OID 35393)
+-- Name: seq_user_roles; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE seq_user_roles
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- TOC entry 205 (class 1259 OID 45997)
+-- Name: specializations; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE specializations (
+    id integer DEFAULT nextval('seq_specializations'::regclass) NOT NULL,
+    name character varying(200) DEFAULT NULL::character varying,
+    abbr character varying(20) DEFAULT NULL::character varying,
+    code character varying(12) DEFAULT NULL::character varying,
+    facultyid integer NOT NULL
+);
+
+
+--
+-- TOC entry 241 (class 1259 OID 46748)
+-- Name: students; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE students (
+    id integer DEFAULT nextval('seq_students'::regclass) NOT NULL,
+    accountid integer NOT NULL
+);
+
+
+--
+-- TOC entry 244 (class 1259 OID 46792)
+-- Name: study_form; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE study_form (
+    id integer DEFAULT nextval('seq_study_form'::regclass) NOT NULL,
+    formname character varying(40) NOT NULL
+);
+
+
+--
+-- TOC entry 217 (class 1259 OID 46298)
+-- Name: study_groups; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE study_groups (
+    id integer DEFAULT nextval('seq_study_groups'::regclass) NOT NULL,
+    gradeid integer NOT NULL,
+    groupnum integer NOT NULL,
+    facultyid integer NOT NULL,
+    formid integer
+);
+
+
+--
+-- TOC entry 223 (class 1259 OID 46409)
+-- Name: study_plans; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE study_plans (
+    id integer DEFAULT nextval('seq_study_plans'::regclass) NOT NULL,
+    externalid integer NOT NULL,
+    year integer,
+    facultyid integer
+);
+
+
+--
+-- TOC entry 209 (class 1259 OID 46084)
+-- Name: subjects; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE subjects (
+    id integer DEFAULT nextval('seq_subjects'::regclass) NOT NULL,
+    externalid character varying(9) DEFAULT NULL::character varying,
+    typeid integer DEFAULT (-1),
+    name character varying(200) NOT NULL,
+    abbr character varying(20) DEFAULT NULL::character varying
+);
+
+
+--
+-- TOC entry 245 (class 1259 OID 46800)
+-- Name: subjects_faculties; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE subjects_faculties (
+    id integer DEFAULT nextval('seq_subjects_faculties'::regclass) NOT NULL,
+    subjectid integer NOT NULL,
+    facultyid integer NOT NULL
+);
+
+
+--
+-- TOC entry 228 (class 1259 OID 46503)
+-- Name: submodules; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE submodules (
+    id integer DEFAULT nextval('seq_submodules'::regclass) NOT NULL,
+    moduleid integer NOT NULL,
+    maxrate integer NOT NULL,
+    ordernum integer NOT NULL,
+    name character varying(200) NOT NULL,
+    description character varying(200) DEFAULT NULL::character varying,
+    isused smallint DEFAULT (0)::smallint NOT NULL,
+    type current_landmark_control DEFAULT 'CurrentControl'::current_landmark_control NOT NULL
+);
+
+
+--
+-- TOC entry 213 (class 1259 OID 46190)
+-- Name: teachers; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE teachers (
+    id integer DEFAULT nextval('seq_teachers'::regclass) NOT NULL,
+    jobpositionid integer NOT NULL,
+    departmentid integer,
+    accountid integer NOT NULL,
+    status integer DEFAULT 1,
+    facultyid integer NOT NULL
+);
+
+
+--
+-- TOC entry 246 (class 1259 OID 46820)
+-- Name: text_mark; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE text_mark (
+    id integer DEFAULT nextval('seq_text_mark'::regclass) NOT NULL,
+    name character varying(100) NOT NULL
+);
+
+
+--
+-- TOC entry 201 (class 1259 OID 45922)
+-- Name: user_roles; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE user_roles (
+    id integer DEFAULT nextval('seq_user_roles'::regclass) NOT NULL,
+    type student_teacher NOT NULL,
+    rolename character varying(30) NOT NULL,
+    mark integer NOT NULL
+);
+
+
+--
+-- TOC entry 247 (class 1259 OID 46889)
+-- Name: view_disciplines; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW view_disciplines AS
+ SELECT disciplines.id AS disciplineid,
+    disciplines.authorid,
+    disciplines.examtype,
+    disciplines.lecturecount,
+    disciplines.practicecount,
+    disciplines.labcount,
+    disciplines.semesterid,
+    disciplines.islocked,
+    disciplines.milestone,
+    disciplines.subtype,
+    disciplines.compounddiscid,
+    disciplines.maxrate,
+    disciplines.currate,
+    grades.id AS gradeid,
+    grades.num AS gradenum,
+    grades.degree,
+    subjects.id AS subjectid,
+    subjects.name AS subjectname,
+    subjects.abbr AS subjectabbr,
+    faculties.id AS facultyid,
+    faculties.name AS facultyname,
+    faculties.abbr AS facultyabbr,
+    compound_disciplines.name AS compounddiscname
+   FROM ((((disciplines
+     JOIN subjects ON ((subjects.id = disciplines.subjectid)))
+     JOIN faculties ON ((faculties.id = disciplines.facultyid)))
+     LEFT JOIN grades ON ((grades.id = disciplines.gradeid)))
+     LEFT JOIN compound_disciplines ON ((compound_disciplines.id = disciplines.compounddiscid)));
+
+
+--
+-- TOC entry 253 (class 1259 OID 46947)
+-- Name: view_disciplines_recordbooks; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW view_disciplines_recordbooks AS
+ SELECT private_view_disciplines_recordbooks_without_type.recordbookid,
+    private_view_disciplines_recordbooks_without_type.disciplineid,
+    private_view_disciplines_recordbooks_without_type.semesterid,
+    disciplines_students.type
+   FROM ((private_view_disciplines_recordbooks_without_type
+     JOIN record_books ON ((private_view_disciplines_recordbooks_without_type.recordbookid = record_books.id)))
+     LEFT JOIN disciplines_students ON (((private_view_disciplines_recordbooks_without_type.recordbookid = disciplines_students.recordbookid) AND (private_view_disciplines_recordbooks_without_type.disciplineid = disciplines_students.disciplineid))));
+
+
+--
+-- TOC entry 249 (class 1259 OID 46899)
+-- Name: view_groups; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW view_groups AS
+ SELECT study_groups.id AS groupid,
+    study_groups.groupnum,
+    groups_years.name AS groupname,
+    grades.id AS gradeid,
+    grades.num AS gradenum,
+    grades.degree,
+    specializations.id AS specid,
+    specializations.name AS specname,
+    specializations.abbr AS specabbr,
+    specializations.code AS speccode,
+    faculties.id AS facultyid,
+    faculties.name AS facultyname,
+    faculties.abbr AS facultyabbr,
+    groups_years.year
+   FROM ((((groups_years
+     JOIN study_groups ON ((groups_years.groupid = study_groups.id)))
+     JOIN specializations ON ((groups_years.specializationid = specializations.id)))
+     JOIN grades ON ((study_groups.gradeid = grades.id)))
+     JOIN faculties ON ((faculties.id = specializations.facultyid)));
+
+
+--
+-- TOC entry 248 (class 1259 OID 46894)
+-- Name: view_groups_reduced; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW view_groups_reduced AS
+ SELECT study_groups.id AS groupid,
+    study_groups.groupnum,
+    groups_years.name AS groupname,
+    grades.id AS gradeid,
+    grades.num AS gradenum,
+    grades.degree,
+    specializations.id AS specid,
+    specializations.name AS specname,
+    specializations.abbr AS specabbr,
+    specializations.code AS speccode,
+    faculties.id AS facultyid,
+    faculties.name AS facultyname,
+    faculties.abbr AS facultyabbr
+   FROM (((((groups_years
+     LEFT JOIN groups_years t ON (((groups_years.groupid = t.groupid) AND (groups_years.year < t.year))))
+     JOIN study_groups ON ((groups_years.groupid = study_groups.id)))
+     JOIN specializations ON ((groups_years.specializationid = specializations.id)))
+     JOIN grades ON ((study_groups.gradeid = grades.id)))
+     JOIN faculties ON ((faculties.id = specializations.facultyid)))
+  WHERE (t.groupid IS NULL);
+
+
+--
+-- TOC entry 254 (class 1259 OID 46958)
+-- Name: view_roadmap; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW view_roadmap AS
+ SELECT modules.disciplineid,
+    modules.id AS moduleid,
+    modules.name AS modulename,
+    modules.ordernum AS moduleordernum,
+    modules.type AS moduletype,
+    submodules.id AS submoduleid,
+    submodules.name AS submodulename,
+    submodules.ordernum AS submoduleordernum,
+    submodules.maxrate AS submodulerate,
+    submodules.type AS submoduletype,
+    submodules.isused AS submoduleisused
+   FROM (modules
+     LEFT JOIN submodules ON ((submodules.moduleid = modules.id)));
+
+
+--
+-- TOC entry 251 (class 1259 OID 46909)
+-- Name: view_students; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW view_students AS
+ SELECT students.id AS studentid,
+    accounts.externalid,
+    accounts.lastname,
+    accounts.firstname,
+    accounts.secondname,
+    students.accountid,
+    record_books.id AS recordbookid,
+    record_books.externalid AS recordbooknumber,
+    students_groups.semesterid,
+    view_groups_reduced.groupid,
+    view_groups_reduced.groupnum,
+    view_groups_reduced.groupname,
+    view_groups_reduced.gradeid,
+    view_groups_reduced.gradenum,
+    view_groups_reduced.degree,
+    view_groups_reduced.specid,
+    view_groups_reduced.specname,
+    view_groups_reduced.specabbr,
+    view_groups_reduced.speccode,
+    view_groups_reduced.facultyid,
+    view_groups_reduced.facultyname,
+    view_groups_reduced.facultyabbr
+   FROM ((((students
+     LEFT JOIN accounts ON ((accounts.id = students.accountid)))
+     LEFT JOIN record_books ON ((record_books.studentid = students.id)))
+     LEFT JOIN students_groups ON ((students_groups.recordbookid = record_books.id)))
+     LEFT JOIN view_groups_reduced ON ((view_groups_reduced.groupid = students_groups.groupid)));
+
+
+--
+-- TOC entry 250 (class 1259 OID 46904)
+-- Name: view_teachers; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW view_teachers AS
+ SELECT teachers.id AS teacherid,
+    accounts.lastname,
+    accounts.firstname,
+    accounts.secondname,
+    teachers.accountid,
+    job_positions.id AS jobpositionid,
+    job_positions.name AS jobpositionname,
+    departments.id AS depid,
+    departments.name AS depname,
+    faculties.id AS facultyid,
+    faculties.name AS facultyname,
+    faculties.abbr AS facultyabbr
+   FROM ((((teachers
+     LEFT JOIN accounts ON ((teachers.accountid = accounts.id)))
+     LEFT JOIN departments ON ((departments.id = teachers.departmentid)))
+     JOIN faculties ON ((teachers.facultyid = faculties.id)))
+     JOIN job_positions ON ((job_positions.id = teachers.jobpositionid)));
+
+
+--
+-- TOC entry 210 (class 1259 OID 46122)
+-- Name: years; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE years (
+    num integer NOT NULL
+);
diff --git a/db/postgresql/types.sql b/db/postgresql/types.sql
new file mode 100644
index 0000000000000000000000000000000000000000..b39c1190259e410a005659dc9450083aa3f51b07
--- /dev/null
+++ b/db/postgresql/types.sql
@@ -0,0 +1,153 @@
+CREATE TYPE absence_pass AS ENUM (
+    'absence',
+    'pass'
+);
+
+--ALTER TYPE absence_pass;
+
+CREATE TYPE add_change_delete AS ENUM (
+    'add',
+    'change',
+    'delete'
+);
+
+--ALTER TYPE add_change_delete;
+
+CREATE TYPE attach_detach AS ENUM (
+    'attach',
+    'detach'
+);
+
+--ALTER TYPE attach_detach;
+
+CREATE TYPE bachelor_master_specialist AS ENUM (
+    'bachelor',
+    'master',
+    'specialist'
+);
+
+--ALTER TYPE bachelor_master_specialist;
+
+CREATE TYPE common_outlet_expulsion_leave AS ENUM (
+    'common',
+    'outlet',
+    'expulsion',
+    'leave'
+);
+
+--ALTER TYPE common_outlet_expulsion_leave;
+
+CREATE TYPE current_landmark_control AS ENUM (
+    'CurrentControl',
+    'LandmarkControl'
+);
+
+--ALTER TYPE current_landmark_control;
+
+CREATE TYPE exam_credit_grading_credit AS ENUM (
+    'exam',
+    'credit',
+    'grading_credit'
+);
+
+--ALTER TYPE exam_credit_grading_credit;
+
+CREATE TYPE exam_rate_all AS ENUM (
+    'exam',
+    'rate',
+    'all'
+);
+
+--ALTER TYPE exam_rate_all;
+
+CREATE TYPE grade_subject_author_semester_milestone_type_maxrate AS ENUM (
+    'grade',
+    'subject',
+    'author',
+    'semester',
+    'milestone',
+    'type',
+    'maxrate'
+);
+
+--ALTER TYPE grade_subject_author_semester_milestone_type_maxrate;
+
+CREATE TYPE group_student AS ENUM (
+    'group',
+    'student'
+);
+
+--ALTER TYPE group_student;
+
+CREATE TYPE login_email_code AS ENUM (
+    'login',
+    'email',
+    'code'
+);
+
+--ALTER TYPE login_email_code;
+
+CREATE TYPE login_email_password AS ENUM (
+    'login',
+    'email',
+    'password'
+);
+
+--ALTER TYPE login_email_password;
+
+CREATE TYPE none_src_dst AS ENUM (
+    'none',
+    'src',
+    'dst'
+);
+
+--ALTER TYPE none_src_dst;
+
+CREATE TYPE opened_processed_closed AS ENUM (
+    'opened',
+    'processed',
+    'closed'
+);
+
+--ALTER TYPE opened_processed_closed;
+
+CREATE TYPE opened_processed_closed_all AS ENUM (
+    'opened',
+    'processed',
+    'closed',
+    'all'
+);
+
+--ALTER TYPE opened_processed_closed_all;
+
+CREATE TYPE regular_exam_bonus_extra AS ENUM (
+    'regular',
+    'exam',
+    'bonus',
+    'extra'
+);
+
+--ALTER TYPE regular_exam_bonus_extra;
+
+CREATE TYPE scientific_disciplinary_coursework AS ENUM (
+    'scientific_coursework',
+    'disciplinary_coursework'
+);
+
+--ALTER TYPE scientific_disciplinary_coursework;
+
+CREATE TYPE student_teacher AS ENUM (
+    'student',
+    'teacher'
+);
+
+--ALTER TYPE student_teacher;
+
+CREATE TYPE student_teacher_admin_dean AS ENUM (
+    'student',
+    'teacher',
+    'admin',
+    'dean'
+);
+
+CREATE TYPE noukd_norate_full AS ENUM ('noukd', 'norate', 'full');
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/Teachers.php b/~dev_rating/application/classes/Controller/Handler/Teachers.php
index e2187fe3bb75cb7826e181b0043b0a6e768012de..ba824a7016909d505c6cbcf96e984b62176bee95 100644
--- a/~dev_rating/application/classes/Controller/Handler/Teachers.php
+++ b/~dev_rating/application/classes/Controller/Handler/Teachers.php
@@ -67,7 +67,7 @@ class Controller_Handler_Teachers extends Controller_Handler
     }
     
     private static function createDepartment($name, Model_Faculty $faculty) {
-        $sql = 'SELECT Department_Create(:name, :faculty) AS `id`';
+        $sql = 'SELECT * FROM Department_Create(:name, :faculty) AS "id"';
         return DB::query(Database::SELECT, $sql)
             ->param(':name', $name)
             ->param(':faculty', $faculty->ID)
diff --git a/~dev_rating/application/classes/Controller/JavaAuthentication.php b/~dev_rating/application/classes/Controller/JavaAuthentication.php
index 93768066bc336fe3685c8a9043a42ea4138590fe..b66ffdf652d46bc5cffb7848669c017515d5801c 100644
--- a/~dev_rating/application/classes/Controller/JavaAuthentication.php
+++ b/~dev_rating/application/classes/Controller/JavaAuthentication.php
@@ -44,7 +44,7 @@ class Controller_JavaAuthentication extends Controller
             $userPassword="userPassword";
 
             $response="{\"session_hash\": \"".md5($s_id.$secretKey)."\",";
-            $sql = "SELECT `SaveSession`('$s_id', '$userLogin', '$userPassword') AS `Num`;";
+            $sql = "SELECT * FROM SaveSession('$s_id', '$userLogin', '$userPassword') AS "Num";";
             $res = DB::query(Database::SELECT, $sql)->execute();
             $response=$response." \"record_id\": ".$res[0]['Num']."}";
             echo $response;
@@ -59,7 +59,7 @@ class Controller_JavaAuthentication extends Controller
         $userPassword="userPassword";
 
         $response="{\"session_hash\": \"".md5($s_id.$secretKey)."\",";
-        $sql = "SELECT `SaveSession`('$s_id', '$userLogin', '$userPassword') AS `Num`;";
+        $sql = "SELECT * FROM SaveSession('$s_id', '$userLogin', '$userPassword') AS "Num";";
         $res = DB::query(Database::SELECT, $sql)->execute();
         $response=$response." \"record_id\": ".$res[0]['Num']."}";
         //echo $response;*/
@@ -95,7 +95,7 @@ class Controller_JavaAuthentication extends Controller
         $userPassword = $user->LastName . $user->FirstName;
 
         //$response="{\"session_hash\": \"".md5($s_id.$secret_key)."\",";
-        //echo "SELECT `SaveSession`('$s_id', '$userLogin', '$userPassword') AS `Num`;";
+        //echo "SELECT * FROM SaveSession('$s_id', '$userLogin', '$userPassword') AS "Num";";
 
         /*echo "String for hash:".$secretKey.$openKey.$userLogin.$userPassword."<br/>";
         echo "Hash:".md5($secretKey.$openKey.$userLogin.$userPassword)."<br/>";*/
@@ -104,7 +104,7 @@ class Controller_JavaAuthentication extends Controller
         exit;
 
         // TODO: move to Model
-        $sql = "SELECT `SaveSession`(:session, :login, :password) AS Num";
+        $sql = "SELECT * FROM SaveSession(:session, :login, :password) AS Num";
         $res = DB::query(Database::SELECT, $sql)
             ->param(':session', $sessionID)
             ->param(':login', $userLogin)
diff --git a/~dev_rating/application/classes/Model/Account.php b/~dev_rating/application/classes/Model/Account.php
index fad2086a0f886b838e2dd7fe73d61b5883b123f9..3aa62bdee63ab0d5955e5ff90f10a7d2f4fc9f2b 100644
--- a/~dev_rating/application/classes/Model/Account.php
+++ b/~dev_rating/application/classes/Model/Account.php
@@ -18,7 +18,7 @@ class Model_Account extends Model
         if ($id <= 0) throw new LogicException(Error::ID_IS_INCORRECT);
 
         $semesterID = $semesterID ?: User::instance()->SemesterID;
-        $sql = 'CALL `GetFullInfo`(:id, :semester);';
+        $sql = 'SELECT * FROM GetFullInfo(:id, :semester);';
         return DB::query(Database::SELECT, $sql)
             ->param(':id', (int) $id)
             ->param(':semester', (int) $semesterID)
@@ -31,7 +31,7 @@ class Model_Account extends Model
      * @return bool true, if password was changed
      */
     public static function changePassword($accountID, $newPassword) {
-        $sql = 'SELECT `ChangeAccountData`(:account, :value, "password") AS Num';
+        $sql = 'SELECT * FROM ChangeAccountData(:account, :value, "password") AS Num';
         return (bool) DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':account' => $accountID,
@@ -48,7 +48,7 @@ class Model_Account extends Model
         if (!preg_match('/^[a-zA-Z0-9_\-\.]{2,}$/', $newLogin))
             throw new InvalidArgumentException('Логин содержит некорректные символы');
         
-        $sql = 'SELECT `ChangeAccountData`(:account, :value, "login") AS Num';
+        $sql = 'SELECT * FROM ChangeAccountData(:account, :value, "login") AS Num';
         return (bool) DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':account' => $accountID,
@@ -62,7 +62,7 @@ class Model_Account extends Model
      * @return bool true, if email was changed
      */
     public static function changeEMail($accountID, $newEmail) {
-        $sql = 'SELECT `ChangeAccountData`(:account, :value, "email") AS Num';
+        $sql = 'SELECT * FROM ChangeAccountData(:account, :value, "email") AS Num';
         return (bool) DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':account' => $accountID,
@@ -76,7 +76,7 @@ class Model_Account extends Model
      * @return bool
      */
     public static function checkAccountExistenceBy($type, $value) {
-        $sql = 'SELECT `CheckAccountExistence`(:value, :type) AS Num';
+        $sql = 'SELECT * FROM CheckAccountExistence(:value, :type) AS Num';
         return (bool) DB::query(Database::SELECT, $sql)
             ->param(':value', $value)
             ->param(':type', $type)
@@ -94,7 +94,7 @@ class Model_Account extends Model
     }
 
     public static function isActivationCodeValid($code) {
-        $sql = "SELECT `CheckAccountExistence`(:acode, 'code') AS Num";
+        $sql = "SELECT * FROM CheckAccountExistence(:acode, 'code') AS Num";
         $res = DB::query(Database::SELECT, $sql)
             ->param(':acode', $code)
             ->execute()->get('Num');
@@ -102,7 +102,7 @@ class Model_Account extends Model
     }
     
     public static function activateAccount($login, $password, $email, $code) {
-        $sql = 'SELECT `ActivateAccount`(:code, :login, :email, :pass) AS `Num`';
+        $sql = 'SELECT * FROM ActivateAccount(:code, :login, :email, :pass) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':code'  => $code,
@@ -117,7 +117,7 @@ class Model_Account extends Model
     // =====================================
 
     public static function checkAuth($login, $password) {
-        $sql = 'SELECT `SignIn`(:login, :pass) AS `ID`';
+        $sql = 'SELECT * FROM SignIn(:login, :pass) AS "ID"';
         return DB::query(Database::SELECT, $sql)
             ->param(':login', $login)
             ->param(':pass', $password)
@@ -125,14 +125,14 @@ class Model_Account extends Model
     }
 
     public static function checkAuthOpenID($globalKey) {
-        $sql = 'SELECT `SignInByOpenID`(:key) AS `ID`';
+        $sql = 'SELECT * FROM SignInByOpenID(:key) AS "ID"';
         return DB::query(Database::SELECT, $sql)
             ->param(':key', $globalKey)
             ->execute()->get('ID');
     }
 
     public static function checkAuthToken($token) {
-        $sql = 'SELECT `SignInByToken`(:token) AS `ID`';
+        $sql = 'SELECT * FROM SignInByToken(:token) AS "ID"';
         return DB::query(Database::SELECT, $sql)
             ->param(':token', $token)
             ->execute()->get('ID');
@@ -144,7 +144,7 @@ class Model_Account extends Model
     // =====================================
 
     public static function createRecoveryToken($email, $token) {
-        $sql = 'SELECT `CreateRecoveryToken`(:email, :token) AS UserName';
+        $sql = 'SELECT * FROM CreateRecoveryToken(:email, :token) AS UserName';
         return DB::query(Database::SELECT, $sql)
             ->param(':email', $email)
             ->param(':token', $token)
@@ -165,7 +165,7 @@ class Model_Account extends Model
     }
 
     public static function useRecoveryToken($token) {
-        $sql = 'SELECT `UseRecoveryToken`(:token) AS Num';
+        $sql = 'SELECT * FROM UseRecoveryToken(:token) AS Num';
         return DB::query(Database::SELECT, $sql)
             ->param(':token', $token)
             ->execute()->get('Num');
@@ -181,7 +181,7 @@ class Model_Account extends Model
      * @return string token, if it was created. Empty string otherwise
      */
     public static function createAuthToken($accountID, $mask = 0, $description = '') {
-        $sql = 'SELECT `CreateAuthToken`(:user, :description, :mask) AS `token`';
+        $sql = 'SELECT * FROM CreateAuthToken(:user, :description, :mask) AS "token"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':user' => (int) $accountID,
@@ -191,7 +191,7 @@ class Model_Account extends Model
     }
 
     public static function deleteAuthToken($token) {
-        $sql = 'SELECT `deleteAuthToken`(:token) AS `res`';
+        $sql = 'SELECT * FROM deleteAuthToken(:token) AS "res"';
         return DB::query(Database::SELECT, $sql)
             ->param(':token', $token)
             ->execute()->get('res');
@@ -202,7 +202,7 @@ class Model_Account extends Model
      * @return mixed
      */
     public static function getAuthTokens($accountID = 0) {
-        $sql = 'CALL `GetAuthTokens`(:user)';
+        $sql = 'SELECT * FROM GetAuthTokens(:user)';
         return DB::query(Database::SELECT, $sql)
             ->param(':user', (int) $accountID)
             ->execute();
diff --git a/~dev_rating/application/classes/Model/Discipline.php b/~dev_rating/application/classes/Model/Discipline.php
index a4c97bd6c4b52e3889448d20f945919b5e7fafed..4afb5a6d8b6a7e87867b54e05d8dbfc1319d5a0c 100644
--- a/~dev_rating/application/classes/Model/Discipline.php
+++ b/~dev_rating/application/classes/Model/Discipline.php
@@ -43,7 +43,7 @@ class Model_Discipline extends Model_Container
      * @throws HTTP_Exception if discipline does not exist
      */
     protected function getRawData($id) {
-        $sql = 'CALL `Discipline_GetInfo`(:id)';
+        $sql = 'SELECT * FROM Discipline_GetInfo(:id)';
         $info = DB::query(Database::SELECT, $sql)
             ->param(':id', $id)->execute();
 
@@ -58,7 +58,7 @@ class Model_Discipline extends Model_Container
      * @throws HTTP_Exception if discipline does not exist
      */
     protected function getRawDataBySubmoduleID($id) {
-        $sql = 'CALL `Discipline_GetInfoBySubmodule`(:id)';
+        $sql = 'SELECT * FROM Discipline_GetInfoBySubmodule(:id)';
         $info = DB::query(Database::SELECT, $sql)
             ->param(':id', $id)->execute();
 
@@ -80,8 +80,8 @@ class Model_Discipline extends Model_Container
      * Create new discipline in db, based on $data.
      */
     protected function create() {
-        $sql = 'SELECT `Discipline_Create`(AuthorID, GradeID, SubjectID, Type, Lectures, Practice, 
-                Labs, FacultyID, SemesterID, Subtype) AS `ID`';
+        $sql = 'SELECT * FROM Discipline_Create(AuthorID, GradeID, SubjectID, Type, Lectures, Practice, 
+                Labs, FacultyID, SemesterID, Subtype) AS "ID"';
 
         $this->data[self::$ID_FIELD] = DB::query(Database::SELECT, $sql)
             ->parameters($this->data)
@@ -89,14 +89,14 @@ class Model_Discipline extends Model_Container
     }
 
     public function delete() {
-        $sql = 'SELECT `Discipline_Delete`(:id)';
+        $sql = 'SELECT * FROM Discipline_Delete(:id)';
         DB::query(Database::SELECT, $sql)->param(':id', $this->ID)->execute();
     }
 
 
     // todo: should return Model_Group[]
     public function getGroups() {
-        $sql = 'CALL `GetGroupsForDiscipline`(:id)';
+        $sql = 'SELECT * FROM GetGroupsForDiscipline(:id)';
         return DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)
             ->execute()->as_array();
@@ -104,7 +104,7 @@ class Model_Discipline extends Model_Container
 
     /** Get groups with separately attached students. */
     public function getAllGroups() {
-        $sql = 'CALL `GetGroupsForDisciplineAll`(:id)';
+        $sql = 'SELECT * FROM GetGroupsForDisciplineAll(:id)';
         return DB::query(Database::SELECT, $sql)->param(':id', $this->ID)->execute();
     }
 
@@ -115,13 +115,13 @@ class Model_Discipline extends Model_Container
 
     // todo: should return Model_Teacher[]
     public function getTeachers() {
-        $sql = 'CALL `GetTeachersForDiscipline`(:id)';
+        $sql = 'SELECT * FROM GetTeachersForDiscipline(:id)';
         return DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)->execute();
     }
 
     public function hasTeacher($teacherID) {
-        $sql = 'SELECT `InternalIsTeacherBound`(:teacher, :discipline) AS `res`';
+        $sql = 'SELECT * FROM InternalIsTeacherBound(:teacher, :discipline) AS "res"';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $this->ID)
             ->param(':teacher', $teacherID)
@@ -132,7 +132,7 @@ class Model_Discipline extends Model_Container
         if ($this->ID == $teacher->ID)
             return;
 
-        $sql = 'SELECT `Discipline_BindTeacher`(:id, :teacher)';
+        $sql = 'SELECT * FROM Discipline_BindTeacher(:id, :teacher)';
         DB::query(Database::SELECT, $sql)
             ->param(':teacher', $teacher->ID)
             ->param(':id', $this->ID)
@@ -143,7 +143,7 @@ class Model_Discipline extends Model_Container
         if ($this->ID == $teacher->ID)
             return;
 
-        $sql = 'SELECT `Discipline_UnbindTeacher`(:id, :teacher)';
+        $sql = 'SELECT * FROM Discipline_UnbindTeacher(:id, :teacher)';
         DB::query(Database::SELECT, $sql)
             ->param(':teacher', $teacher->ID)
             ->param(':id', $this->ID)
@@ -158,7 +158,7 @@ class Model_Discipline extends Model_Container
         if ($this->ID == $teacher->ID)
             return;
 
-        $sql = 'SELECT `Discipline_Delegate`(:id, :teacher)';
+        $sql = 'SELECT * FROM Discipline_Delegate(:id, :teacher)';
         DB::query(Database::SELECT, $sql)
             ->param(':teacher', $teacher->ID)
             ->param(':id', $this->ID)
@@ -169,12 +169,12 @@ class Model_Discipline extends Model_Container
         if ($this->GradeID == $grade)
             return 0;
 
-        $sql = 'SELECT `Discipline_SetGradeUnsafe`(:discipline, :grade) AS `ErrorCode`';
+        $sql = 'SELECT * FROM Discipline_SetGradeUnsafe(:discipline, :grade) AS "ErrorCode"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':discipline' => $this->ID,
                 ':grade'      => $grade,
-            ])->execute()->get('ErrorCode');
+            ])->execute()->get('"ErrorCode"');
     }
 
     public function changeGrade($teacherID, $grade) {
@@ -195,7 +195,7 @@ class Model_Discipline extends Model_Container
 
         $this->Milestone = $stage;
 
-        $sql = 'SELECT `RestrictAfterMilestone`(:discipline, :milestone)';
+        $sql = 'SELECT * FROM RestrictAfterMilestone(:discipline, :milestone)';
         DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':discipline' => $this->ID,
@@ -204,7 +204,7 @@ class Model_Discipline extends Model_Container
     }
 
     public static function find($studyPlanID, $semesterID, $subjectID, $type) {
-        $sql = 'CALL `Discipline_Find`(:studyPlanID, :semesterID, :subjectID, :type)';
+        $sql = 'SELECT * FROM Discipline_Find(:studyPlanID, :semesterID, :subjectID, :type)';
         $data = DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':studyPlanID' => $studyPlanID,
@@ -226,8 +226,8 @@ class Model_Discipline extends Model_Container
     public function update() {
         throw new BadMethodCallException('Method is not implemented yet!');
 // тут нужно делать апдейт записи в БД по полям уже указанным в модели
-//        $sql = 'SELECT `Discipline_ChangeInfo` (ID, AuthorID, GradeID, SubjectID, Type, Lectures, Practice,
-//                Labs, FacultyID, SemesterID, Subtype) AS `Success`';
+//        $sql = 'SELECT * FROM Discipline_ChangeInfo(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();
diff --git a/~dev_rating/application/classes/Model/Disciplines.php b/~dev_rating/application/classes/Model/Disciplines.php
index 16325df568d5160a5b1b8694efecafa30fa0196c..d2a5efb926b129d698b8c276c85feb41f166dc17 100644
--- a/~dev_rating/application/classes/Model/Disciplines.php
+++ b/~dev_rating/application/classes/Model/Disciplines.php
@@ -3,7 +3,7 @@
 class Model_Disciplines extends Model
 {
     public static function getWithFullness($type, $semesterID, $facultyID) {
-        $sql = 'CALL `Discipline_GetWithFullness`(:type, :semesterID, :facultyID)';
+        $sql = 'SELECT * FROM Discipline_GetWithFullness(:type, :semesterID, :facultyID)';
         $info = DB::query(Database::SELECT, $sql)
             ->param(':type', $type)
             ->param(':semesterID', $semesterID)
diff --git a/~dev_rating/application/classes/Model/Faculties.php b/~dev_rating/application/classes/Model/Faculties.php
index bc6bb2dc0648f16a71759681cf3df979af0335b2..63d7aa3f2d228abc268eaee18fc2cb2967953cd8 100644
--- a/~dev_rating/application/classes/Model/Faculties.php
+++ b/~dev_rating/application/classes/Model/Faculties.php
@@ -4,13 +4,13 @@ class Model_Faculties extends Model
 {
     // todo: should generate an array of Model_Faculty
     public static function load() {
-        $sql = 'CALL `GetFaculties`(); ';
+        $sql = 'SELECT * FROM GetFaculties(); ';
         return DB::query(Database::SELECT, $sql)
             ->execute()->as_array();
     }
 
     public static function createFaculty($externalID, $name, $abbr) {
-        $sql = 'SELECT `Faculty_Create`(:externalID, :name, :abbr) AS `ID`;';
+        $sql = 'SELECT * FROM Faculty_Create(:externalID, :name, :abbr) AS "ID";';
         $query = DB::query(Database::SELECT, $sql)
             ->param(':externalID', $externalID)
             ->param(':name', $name)
@@ -25,7 +25,7 @@ class Model_Faculties extends Model
     }
 
     public static function getDepartments($facultyID = 0) {
-        $sql = 'CALL `Departments_Get`(:faculty)';
+        $sql = 'SELECT * FROM Departments_Get(:faculty)';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':faculty', $facultyID)
             ->execute();
@@ -42,7 +42,7 @@ class Model_Faculties extends Model
     }
 
     public static function getDepartmentIdByName($departmentName) {
-        $sql = 'CALL `Department_GetIdByName`(:name)';
+        $sql = 'SELECT * FROM Department_GetIdByName(:name)';
         $id = DB::query(Database::SELECT, $sql)
             ->param(':name', $departmentName)
             ->execute();
@@ -54,7 +54,7 @@ class Model_Faculties extends Model
     }
 
     public static function getDepartmentIdByExternalID($departmentExternalID) {
-        $sql = 'CALL `Department_GetIdByExternalID`(:depExternalID)';
+        $sql = 'SELECT * FROM Department_GetIdByExternalID(:depExternalID)';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':depExternalID', $departmentExternalID)
             ->execute();
@@ -66,7 +66,7 @@ class Model_Faculties extends Model
     }
 
     public static function getIdByExternalID($facultyExternalID) {
-        $sql = 'SELECT `Faculty_GetIdByExternalID`(:facultyExternalID) AS `ID`';
+        $sql = 'SELECT * FROM Faculty_GetIdByExternalID(:facultyExternalID) AS "ID"';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':facultyExternalID', $facultyExternalID)
             ->execute();
@@ -80,7 +80,7 @@ class Model_Faculties extends Model
     }
 
     public static function createDepartment($departmentName, $facultyID) {
-        $sql = 'SELECT `Department_Create`(:name, :facultyID) AS `ID`;';
+        $sql = 'SELECT * FROM Department_Create(:name, :facultyID) AS "ID";';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':name', $departmentName)
             ->param(':facultyID', $facultyID)
@@ -93,7 +93,7 @@ class Model_Faculties extends Model
     }
 
     public static function createDepartmentWithExternalID($externalID, $name, $facultyExternalID) {
-        $sql = 'SELECT `Department_Create_With_ExternalID`(:externalID, :name, :facultyExternalID) AS `ID`;';
+        $sql = 'SELECT * FROM Department_Create_With_ExternalID(:externalID, :name, :facultyExternalID) AS "ID";';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':externalID', $externalID)
             ->param(':name', $name)
@@ -107,7 +107,7 @@ class Model_Faculties extends Model
     }
 
     public static function getJobPositionIdByName($jobPositionName) {
-        $sql = 'CALL `JobPosition_GetIdByName`(:name)';
+        $sql = 'SELECT * FROM JobPosition_GetIdByName(:name)';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':name', $jobPositionName)
             ->execute();
@@ -119,7 +119,7 @@ class Model_Faculties extends Model
     }
 
     public static function createJobPosition($jobPositionName) {
-        $sql = 'SELECT `JobPosition_Create`(:name) AS `ID`;';
+        $sql = 'SELECT * FROM JobPosition_Create(:name) AS "ID";';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':name', $jobPositionName)
             ->execute();
diff --git a/~dev_rating/application/classes/Model/Faculty.php b/~dev_rating/application/classes/Model/Faculty.php
index 80de277e775527e76bf0f2c19e52c87b1e4750d9..4680e923d711237460c1122dd498caa50243d601 100644
--- a/~dev_rating/application/classes/Model/Faculty.php
+++ b/~dev_rating/application/classes/Model/Faculty.php
@@ -30,7 +30,7 @@ class Model_Faculty extends Model
      */
     public function getMilestone($semesterID = null) {
         $semesterID = $semesterID ?: User::instance()->SemesterID;
-        $sql = 'SELECT `GetMilestone`(:faculty, :semester) AS `Num`';
+        $sql = 'SELECT * FROM GetMilestone(:faculty, :semester) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->param(':faculty', $this->ID)
             ->param(':semester', $semesterID)
@@ -46,7 +46,7 @@ class Model_Faculty extends Model
             throw new LogicException('Milestone argument is incorrect!');
 
         $semesterID = $semesterID ?: User::instance()->SemesterID;
-        $sql = 'SELECT `RestrictAfterMilestoneForCredits`(:facultyID, :milestone, :semesterID)';
+        $sql = 'SELECT * FROM RestrictAfterMilestoneForCredits(:facultyID, :milestone, :semesterID)';
         DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':facultyID'  => $this->ID,
@@ -61,7 +61,7 @@ class Model_Faculty extends Model
      */
     public function getDisciplines($semesterID = null) {
         $semesterID = $semesterID ?: User::instance()->SemesterID;
-        $sql = 'CALL `GetDisciplines`(:id, :semesterID)';
+        $sql = 'SELECT * FROM GetDisciplines(:id, :semesterID)';
         $query = DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)
             ->param(':semesterID', $semesterID)
@@ -81,7 +81,7 @@ class Model_Faculty extends Model
      */
     public function getGroups($grade, $semesterID = null) {
         $semesterID = $semesterID ?: User::instance()->SemesterID;
-        $sql = 'CALL `GetGroups`(:grade, :facultyID, :semesterID)';
+        $sql = 'SELECT * FROM GetGroups(:grade, :facultyID, :semesterID)';
         return DB::query(Database::SELECT, $sql)
             ->param(':grade', (int) $grade)
             ->param(':facultyID', $this->ID)
@@ -90,14 +90,14 @@ class Model_Faculty extends Model
     }
 
     public function getSubjects() {
-        $sql = 'CALL `GetSubjects`(:faculty)';
+        $sql = 'SELECT * FROM GetSubjects(:faculty)';
         return DB::query(Database::SELECT, $sql)
             ->param(':faculty', $this->ID)
             ->execute()->as_array();
     }
 
     public function getDepartments() {
-        $sql = 'CALL `Departments_Get`(:faculty)';
+        $sql = 'SELECT * FROM Departments_Get(:faculty)';
         return DB::query(Database::SELECT, $sql)
             ->param(':faculty', $this->ID)
             ->execute()->as_array();
diff --git a/~dev_rating/application/classes/Model/Grades.php b/~dev_rating/application/classes/Model/Grades.php
index bdaa5f2bbd7178b108993ce764dda8f26430dacc..68ff870a3bc0d163db19e3f204b94808ec5f1002 100644
--- a/~dev_rating/application/classes/Model/Grades.php
+++ b/~dev_rating/application/classes/Model/Grades.php
@@ -9,16 +9,16 @@ class Model_Grades extends Model
 {
     /** @return Database_Result */
     public static function loadAll() {
-        return DB::query(Database::SELECT, 'CALL `GetGrades`()')->execute();
+        return DB::query(Database::SELECT, 'SELECT * FROM GetGrades()')->execute();
     }
 
     public static function getCompoundDisciplinesForGrade($gradeID){
-        return DB::query(Database::SELECT, 'CALL `GetCompoundDisciplinesForGrade`(:gradeID)')
+        return DB::query(Database::SELECT, 'SELECT * FROM GetCompoundDisciplinesForGrade(:gradeID)')
             ->param(':gradeID', $gradeID)->execute()->as_array();
     }
 
     public static function getID($gradeNum, $degree) {
-        $sql = 'CALL `Grade_GetID`(:gradeNum, :degree)';
+        $sql = 'SELECT * FROM Grade_GetID(:gradeNum, :degree)';
         $res = DB::query(Database::SELECT, $sql)
             ->param(':gradeNum', $gradeNum)
             ->param(':degree', $degree)
diff --git a/~dev_rating/application/classes/Model/Group.php b/~dev_rating/application/classes/Model/Group.php
index e7d65539e0eeb9f805bfa326d4af221752350f51..67a9d84e48475ce2ef6cfbd155772e3cef971444 100644
--- a/~dev_rating/application/classes/Model/Group.php
+++ b/~dev_rating/application/classes/Model/Group.php
@@ -15,7 +15,7 @@ class Model_Group extends Model
     }
 
     public static function findOrCreate($gradeID, $groupNum, $specialization, $facultyID, $year) {
-        $sql = 'SELECT `CreateGroup`(:gradeID, :groupNum, :specialization, :facultyID, :year) AS `ID`';
+        $sql = 'SELECT * FROM CreateGroup(:gradeID, :groupNum, :specialization, :facultyID, :year) AS "ID"';
         $id = DB::query(Database::SELECT, $sql)
             ->param(':gradeID', $gradeID)
             ->param(':groupNum', $groupNum)
@@ -32,7 +32,7 @@ class Model_Group extends Model
     /** @return Model_Discipline[] */
     public function getDisciplines($lazy = true, $semesterID = null) {
         $semesterID = $semesterID ?: User::instance()->SemesterID;
-        $sql = 'CALL `GetDisciplinesForGroup`(:id, :semesterID)';
+        $sql = 'SELECT * FROM GetDisciplinesForGroup(:id, :semesterID)';
         $query = DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)
             ->param(':semesterID', $semesterID)
diff --git a/~dev_rating/application/classes/Model/Logs.php b/~dev_rating/application/classes/Model/Logs.php
index cec32ebc39b952b1fdfc9a232f2a71f8c9f1cfa8..d8ad719c60cd59fa97bab82d2d4d54f3b0924d3c 100644
--- a/~dev_rating/application/classes/Model/Logs.php
+++ b/~dev_rating/application/classes/Model/Logs.php
@@ -12,7 +12,7 @@ class Model_Logs extends Model
 {
     public static function load()
     {
-        $query = 'CALL `GetSignInHistory`(50)';
+        $query = 'SELECT * FROM GetSignInHistory(50)';
         return DB::query(Database::SELECT, $query)->execute()->as_array();
     }
 
diff --git a/~dev_rating/application/classes/Model/Map.php b/~dev_rating/application/classes/Model/Map.php
index cd492d9dfff52c6025a274b9a93e3111e99057a9..bdc1cf65a42ca2038a8adf9030fb604328f7bce9 100644
--- a/~dev_rating/application/classes/Model/Map.php
+++ b/~dev_rating/application/classes/Model/Map.php
@@ -14,7 +14,7 @@ class Model_Map extends Model
     }
 
     public function addModuleBonus($teacherID) {
-        $sql = 'SELECT `AddModuleBonus`(:teacher, :discipline) AS `Num`';
+        $sql = 'SELECT * FROM AddModuleBonus(:teacher, :discipline) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->param(':teacher', $teacherID)
             ->param(':discipline', $this->discipline->ID)
@@ -22,7 +22,7 @@ class Model_Map extends Model
     }
 
     public function deleteModuleBonus($teacherID) {
-        $sql = 'SELECT `DeleteModuleBonus`(:teacher, :discipline) AS `Num`';
+        $sql = 'SELECT * FROM DeleteModuleBonus(:teacher, :discipline) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->param(':teacher', $teacherID)
             ->param(':discipline', $this->discipline->ID)
@@ -31,7 +31,7 @@ class Model_Map extends Model
 
     /** @return int ID of created module, -2 if map is locked or teacher is not author */
     public function addModule($teacherID, $title = '') {
-        $sql = 'SELECT `AddModule`(:teacher, :discipline, :title) AS `Num`';
+        $sql = 'SELECT * FROM AddModule(:teacher, :discipline, :title) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
@@ -43,7 +43,7 @@ class Model_Map extends Model
     /** @return int ID of created submodule, -2 if map is locked */
     public static function addSubmodule($teacherID, $moduleID, $controlType = 'current', $maxRate = 0, $title = '',
                                         $description = '') {
-        $sql = 'SELECT `AddSubmodule`(:teacher, :moduleID, :maxRate, :title, :desc, :control) AS `Num`';
+        $sql = 'SELECT * FROM AddSubmodule(:teacher, :moduleID, :maxRate, :title, :desc, :control) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'  => $teacherID,
@@ -58,7 +58,7 @@ class Model_Map extends Model
 
     /** @return bool true, if err occurred */
     public static function deleteModule($teacherID, $moduleID) {
-        $sql = 'SELECT `DeleteModule`(:teacher, :module) AS `Num`';
+        $sql = 'SELECT * FROM DeleteModule(:teacher, :module) AS "Num"';
         return (bool) DB::query(Database::SELECT, $sql)
             ->param(':teacher', $teacherID)
             ->param(':module', $moduleID)
@@ -67,7 +67,7 @@ class Model_Map extends Model
 
     /** @return bool true, if err occurred */
     public static function deleteSubmodule($teacherID, $submoduleID) {
-        $sql = 'SELECT `DeleteSubmodule`(:teacher, :submodule) AS `Num`';
+        $sql = 'SELECT * FROM DeleteSubmodule(:teacher, :submodule) AS "Num"';
         return (bool) DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'   => $teacherID,
@@ -77,7 +77,7 @@ class Model_Map extends Model
 
     /** @return bool true, if err occurred */
     public static function setModuleName($teacherID, $moduleID, $name) {
-        $sql = 'SELECT `ChangeModuleName`(:teacher, :module, :name) AS `Num`';
+        $sql = 'SELECT * FROM ChangeModuleName(:teacher, :module, :name) AS "Num"';
         $result = DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher' => $teacherID,
@@ -90,7 +90,7 @@ class Model_Map extends Model
 
     /** @return bool true, if err occurred */
     public static function setSubmoduleName($teacherID, $submoduleID, $name) {
-        $sql = 'SELECT `ChangeSubmoduleName`(:teacher, :submodule, :name) AS `Num`';
+        $sql = 'SELECT * FROM ChangeSubmoduleName(:teacher, :submodule, :name) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'   => $teacherID,
@@ -102,7 +102,7 @@ class Model_Map extends Model
 
     /** return @bool true, if err occurred */
     public static function swapModules($teacherID, $moduleID1, $moduleID2) {
-        $sql = 'SELECT `SwapModuleOrder`(:teacher, :moduleID1, :moduleID2) AS `Num`';
+        $sql = 'SELECT * FROM SwapModuleOrder(:teacher, :moduleID1, :moduleID2) AS "Num"';
         return (bool) DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'   => $teacherID,
@@ -113,7 +113,7 @@ class Model_Map extends Model
 
     /** return @bool true, if err occurred */
     public static function swapSubmodules($teacherID, $submoduleID1, $submoduleID2) {
-        $sql = 'SELECT `SwapSubmoduleOrder`(:teacher, :submodule1, :submodule2) AS `Num`';
+        $sql = 'SELECT * FROM SwapSubmoduleOrder(:teacher, :submodule1, :submodule2) AS "Num"';
         return (bool) DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
@@ -123,7 +123,7 @@ class Model_Map extends Model
     }
 
     public static function setSubmoduleMaxAndControl($teacherID, $submoduleID, $maxRate, $controlType) {
-        $sql = 'SELECT `ChangeSubmoduleMaxAndControl`(:teacher, :submodule, :maxRate, :control) AS `Num`';
+        $sql = 'SELECT * FROM ChangeSubmoduleMaxAndControl(:teacher, :submodule, :maxRate, :control) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'   => $teacherID,
@@ -134,7 +134,7 @@ class Model_Map extends Model
     }
 
     public function changeDisciplineSubject($teacherID, $subjectID) {
-        $sql = 'SELECT `ChangeDisciplineSubject`(:teacher, :discipline, :subject) AS `Num`';
+        $sql = 'SELECT * FROM ChangeDisciplineSubject(:teacher, :discipline, :subject) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
@@ -144,7 +144,7 @@ class Model_Map extends Model
     }
 
     public function changeDisciplineControl($teacherID, $control) {
-        $sql = 'SELECT `ChangeDisciplineControl`(:teacher, :discipline, :control) AS `Num`';
+        $sql = 'SELECT * FROM ChangeDisciplineControl(:teacher, :discipline, :control) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
@@ -154,7 +154,7 @@ class Model_Map extends Model
     }
 
     public function changeDisciplineHours($teacherID, $hours, $type) {
-        $sql = 'SELECT `ChangeDisciplineHours`(:teacher, :discipline, :hours, :type) AS `Num`';
+        $sql = 'SELECT * FROM ChangeDisciplineHours(:teacher, :discipline, :hours, :type) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
@@ -165,7 +165,7 @@ class Model_Map extends Model
     }
 
     public function bindGroup($teacherID, $groupID) {
-        $sql = 'SELECT `BindGroup`(:teacher, :discipline, :group) AS `Num`';
+        $sql = 'SELECT * FROM BindGroup(:teacher, :discipline, :group) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
@@ -180,7 +180,7 @@ class Model_Map extends Model
      * @return Database_Result select from <tt>view_roadmap</tt> table
      */
     public static function getRoadmap($discipline, $type) {
-        $sql = 'CALL `GetRoadmap`(:discipline, :type)';
+        $sql = 'SELECT * FROM GetRoadmap(:discipline, :type)';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $discipline)
             ->param(':type', $type)
@@ -188,7 +188,7 @@ class Model_Map extends Model
     }
 
     public function getModules($type) {
-        $sql = 'CALL `Discipline_GetModules`(:discipline, :type)';
+        $sql = 'SELECT * FROM Discipline_GetModules(:discipline, :type)';
 
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $this->discipline->ID)
@@ -197,7 +197,7 @@ class Model_Map extends Model
     }
 
     public function getSubmodules($type) {
-        $sql = 'CALL `Discipline_GetSubmodules`(:discipline, :type)';
+        $sql = 'SELECT * FROM Discipline_GetSubmodules(:discipline, :type)';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $this->discipline->ID)
             ->param(':type', $type)->execute()
@@ -205,7 +205,7 @@ class Model_Map extends Model
     }
 
     public function unbindGroup($teacherID, $groupID) {
-        $sql = 'SELECT `UnbindGroup`(:teacher, :discipline, :group) AS `Num`';
+        $sql = 'SELECT * FROM UnbindGroup(:teacher, :discipline, :group) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
@@ -215,7 +215,7 @@ class Model_Map extends Model
     }
 
     public function bindStudent($teacherID, $studentID) {
-        $sql = 'SELECT `BindStudent`(:teacher, :discipline, :student) AS `Num`';
+        $sql = 'SELECT * FROM BindStudent(:teacher, :discipline, :student) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
@@ -225,7 +225,7 @@ class Model_Map extends Model
     }
 
     public function unbindStudent($teacherID, $studentID) {
-        $sql = 'SELECT `UnbindStudent`(:teacher, :discipline, :student) AS `Num`';
+        $sql = 'SELECT * FROM UnbindStudent(:teacher, :discipline, :student) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'    => $teacherID,
diff --git a/~dev_rating/application/classes/Model/Plan.php b/~dev_rating/application/classes/Model/Plan.php
index b14ed5a42f8c70c6c5b3ebe1440fbe688e703c25..ef78b42cd05095f5b88dc0bc1562c471352ba40a 100644
--- a/~dev_rating/application/classes/Model/Plan.php
+++ b/~dev_rating/application/classes/Model/Plan.php
@@ -11,7 +11,7 @@
 class Model_Plan extends Model_Container
 {
     protected function getRawData($id) {
-        $sql = 'CALL `Plan_GetInfo`(:id)';
+        $sql = 'SELECT * FROM Plan_GetInfo(:id)';
         $info = DB::query(Database::SELECT, $sql)
             ->param(':id', $id)->execute();
 
@@ -26,7 +26,7 @@ class Model_Plan extends Model_Container
     }
 
     protected function create() {
-        $sql = 'SELECT `Plan_Create`(ExternalID, Year, FacultyID) AS `Identifier`';
+        $sql = 'SELECT * FROM Plan_Create(ExternalID, Year, FacultyID) AS "Identifier"';
         $this->data[self::$ID_FIELD] = DB::query(Database::SELECT, $sql)
             ->parameters($this->data)
             ->execute()->get('Identifier');
@@ -37,7 +37,7 @@ class Model_Plan extends Model_Container
      * @return Model_Plan
      */
     public static function withExternalID($extid) {
-        $sql = 'SELECT `Plan_GetIDFromExternalID`(:extid) AS `ID`';
+        $sql = 'SELECT * FROM Plan_GetIDFromExternalID(:extid) AS "ID"';
         $id = DB::query(Database::SELECT, $sql)
             ->param(':extid', $extid)
             ->execute()->get('ID');
@@ -92,19 +92,19 @@ class Model_Plan extends Model_Container
     }
 
     public function update() {
-        $sql = 'SELECT `Plan_ChangeInfo`(:id, :year, :faculty) AS `ErrorCode`';
+        $sql = 'SELECT * FROM Plan_ChangeInfo(:id, :year, :faculty) AS "ErrorCode"';
         $res = DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)
             ->param(':year', $this->Year)
             ->param(':faculty', $this->FacultyID)
             ->execute();
-        if ($res->get('ErrorCode') < 0) {
+        if ($res->get('"ErrorCode"') < 0) {
             throw new Database_Exception('Plan_ChangeInfo update routine failed!');
         }
     }
 
     public function bindDiscipline($disciplineID) {
-        $sql = 'SELECT `Plan_BindDiscipline`(:id, :discipline) AS `ID`';
+        $sql = 'SELECT * FROM Plan_BindDiscipline(:id, :discipline) AS "ID"';
         DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)
             ->param(':discipline', $disciplineID)
diff --git a/~dev_rating/application/classes/Model/Rating.php b/~dev_rating/application/classes/Model/Rating.php
index bfcddd7fc03a7eee29764a4df5f49c6fc2ef9d54..f2681d20c4c9eb64579ba7457680093bc3e7f190 100644
--- a/~dev_rating/application/classes/Model/Rating.php
+++ b/~dev_rating/application/classes/Model/Rating.php
@@ -7,7 +7,7 @@ class Model_Rating extends Model
      * @return Database_Result
      */
     public static function GetStudentsForRating($discipline) {
-        $sql = 'CALL `GetStudentsForRating`(:discipline)';
+        $sql = 'SELECT * FROM GetStudentsForRating(:discipline)';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $discipline)
             ->execute();
@@ -19,7 +19,7 @@ class Model_Rating extends Model
      * @return Database_Result
      */
     public static function getRates($recordbook, $discipline) {
-        $sql = 'CALL `GetRates`(:recordbook, :discipline)';
+        $sql = 'SELECT * FROM GetRates(:recordbook, :discipline)';
         return DB::query(Database::SELECT, $sql)
             ->param(':recordbook', $recordbook)
             ->param(':discipline', $discipline)
@@ -32,7 +32,7 @@ class Model_Rating extends Model
      * @return Database_Result
      */
     public static function getRatesAll($discipline, $recordBook) {
-        $sql = 'CALL `GetRatesAll`(:recordBook, :discipline)';
+        $sql = 'SELECT * FROM GetRatesAll(:recordBook, :discipline)';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $discipline)
             ->param(':recordBook', $recordBook)
@@ -43,7 +43,7 @@ class Model_Rating extends Model
     public static function getMapForStudent($student, $discipline) {
         # SQL routine not implemented yet
         throw new HTTP_Exception_500('Этот функционал еще не реализован!');
-        $sql = 'CALL `GetMapForStudent`(:student, :discipline)';
+        $sql = 'SELECT * FROM GetMapForStudent(:student, :discipline)';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $discipline)
             ->param(':student', $student)
@@ -51,7 +51,7 @@ class Model_Rating extends Model
     }
 
     public static function getAttestationData($discipline, $group) {
-        $sql = 'CALL `GetAttestationData`(:discipline, :group)';
+        $sql = 'SELECT * FROM GetAttestationData(:discipline, :group)';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $discipline)
             ->param(':group', $group)
@@ -236,7 +236,7 @@ class Model_Rating extends Model
     }
 
     public static function SetRateSQL($teacherID, $recordBookID, $submoduleID, $rate) {
-        $sql = 'SELECT `Discipline_SetRate`(:teacher, :recordBook, :submodule, :rate) AS `Num`';
+        $sql = 'SELECT * FROM Discipline_SetRate(:teacher, :recordBook, :submodule, :rate) AS "Num"';
         $dbAnswer = DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':teacher'      => $teacherID,
@@ -258,7 +258,7 @@ class Model_Rating extends Model
     }
 
     public static function SetExamPeriodOptionSQL($recordBookID, $submoduleID, $option) {
-        $sql = 'SELECT `Discipline_SetExamPeriodOption`(:recordBook, :submodule, :option) as `Num`';
+        $sql = 'SELECT * FROM Discipline_SetExamPeriodOption(:recordBook, :submodule, :option) as "Num"';
         $dbAnswer = DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':recordBook'   => $recordBookID,
@@ -274,7 +274,7 @@ class Model_Rating extends Model
     }
 
     public static function getRatesForDiscipline(Model_Discipline $discipline) {
-        $sql = 'CALL `GetRatesForDiscipline`(:id)';
+        $sql = 'SELECT * FROM GetRatesForDiscipline(:id)';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':id', $discipline->ID)->execute();
 
@@ -289,7 +289,7 @@ class Model_Rating extends Model
     }
 
     public static function getRatesForStudentsGroup($discipline, $group) {
-        $sql = 'CALL `GetRatesForGroup`(:discipline, :group)';
+        $sql = 'SELECT * FROM GetRatesForGroup(:discipline, :group)';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':discipline' => $discipline,
@@ -298,7 +298,7 @@ class Model_Rating extends Model
     }
 
     public static function getRatesForStudentsGroupByStage($discipline, $group, $stage) {
-        $sql = 'CALL `GetRatesForGroupByStage`(:discipline, :group, :stage)';
+        $sql = 'SELECT * FROM GetRatesForGroupByStage(:discipline, :group, :stage)';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':discipline' => $discipline,
@@ -309,7 +309,7 @@ class Model_Rating extends Model
 
     /** @return  Database_RESULT   Database_Result for SELECT queries */
     public static function getRatesForGroupAll($group, $semester) {
-        $sql = 'CALL `GetRatesForGroupAll`(:group, :semester)';
+        $sql = 'SELECT * FROM GetRatesForGroupAll(:group, :semester)';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':group'    => $group,
@@ -318,7 +318,7 @@ class Model_Rating extends Model
     }
 
     public static function getFinalFormInfo($discipline, $group) {
-        $sql = 'CALL `GetFinalFormInfo`(:discipline, :group)';
+        $sql = 'SELECT * FROM GetFinalFormInfo(:discipline, :group)';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':discipline' => $discipline,
@@ -332,7 +332,7 @@ class Model_Rating extends Model
      * @return int
      */
     public static function count(Model_Discipline $discipline) {
-        $sql = 'SELECT `Discipline_CountRatings`(:discipline) AS `res`';
+        $sql = 'SELECT * FROM Discipline_CountRatings(:discipline) AS "res"';
         $res = DB::query(Database::SELECT, $sql)
             ->param(':discipline', $discipline->ID)
             ->execute();
@@ -341,7 +341,7 @@ class Model_Rating extends Model
     }
 
     public static function getHistory($discipline) {
-        $sql = 'CALL `GetRatesHistory`(:discipline)';
+        $sql = 'SELECT * FROM GetRatesHistory(:discipline)';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $discipline)
             ->execute();
diff --git a/~dev_rating/application/classes/Model/RecordBook.php b/~dev_rating/application/classes/Model/RecordBook.php
index 6a51b97e1853be34b409f9f7bbc48b812b1bdddb..5ae3000942e4786bb23602273ab45e635bda982a 100644
--- a/~dev_rating/application/classes/Model/RecordBook.php
+++ b/~dev_rating/application/classes/Model/RecordBook.php
@@ -25,7 +25,7 @@
 class Model_RecordBook extends Model_Container
 {
     protected function getRawData($id) {
-        $sql = 'CALL `RecordBook_GetInfo`(:id)';
+        $sql = 'SELECT * FROM RecordBook_GetInfo(:id)';
         $info = DB::query(Database::SELECT, $sql)
             ->param(':id', $id)->execute();
 
@@ -40,7 +40,7 @@ class Model_RecordBook extends Model_Container
     }
 
     protected function create() {
-        $sql = 'SELECT `RecordBook_Bind`(ExternalID, StudentID, PlanID) AS `ID`';
+        $sql = 'SELECT * FROM RecordBook_Bind(ExternalID, StudentID, PlanID) AS "ID"';
         $this->data[self::$ID_FIELD] = DB::query(Database::SELECT, $sql)
             ->parameters($this->data)
             ->execute()->get('ID');
@@ -54,7 +54,7 @@ class Model_RecordBook extends Model_Container
     }
 
     public static function withExternalID($extid) {
-        $sql = 'SELECT `RecordBook_GetIDFromExternalID`(:ExtID) AS `ID`';
+        $sql = 'SELECT * FROM RecordBook_GetIDFromExternalID(:ExtID) AS "ID"';
         $res = DB::query(Database::SELECT, $sql)
             ->param(':ExtID', $extid)
             ->execute()->get('ID');
@@ -66,7 +66,7 @@ class Model_RecordBook extends Model_Container
         $semesterID = $semesterID ?: User::instance()->SemesterID;
         $recordBookID = $this->ID;
         
-        $sql = 'CALL `Student_GetDisciplines`(:recordBookID, :semesterID)';
+        $sql = 'SELECT * FROM Student_GetDisciplines(:recordBookID, :semesterID)';
         $query = DB::query(Database::SELECT, $sql)
             ->param(':recordBookID', $recordBookID)
             ->param(':semesterID', $semesterID)
@@ -84,7 +84,7 @@ class Model_RecordBook extends Model_Container
         $semesterID = $semesterID ?: User::instance()->SemesterID;
         $recordBookID = $this->ID;
 
-        $sql = 'CALL `Student_GetTeachersList`(:recordBookID, :semesterID, :loadAll)';
+        $sql = 'SELECT * FROM Student_GetTeachersList(:recordBookID, :semesterID, :loadAll)';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':recordBookID', $recordBookID)
             ->param(':semesterID', $semesterID)
@@ -101,11 +101,11 @@ class Model_RecordBook extends Model_Container
 
     public function update($data) {
         $updatedData = array_merge(['ExternalID' => null], $this->data, $data);
-        $sql = 'SELECT `RecordBook_ChangeInfo`(ID, ExternalID, StudentID, PlanID) AS `ErrorCode`';
+        $sql = 'SELECT * FROM RecordBook_ChangeInfo(ID, ExternalID, StudentID, PlanID) AS "ErrorCode"';
 
         $res = (int)DB::query(Database::SELECT, $sql)
             ->parameters($updatedData)
-            ->execute()->get('ErrorCode');
+            ->execute()->get('"ErrorCode"');
         if ($res < 0) {
             throw new Database_Exception('RecordBook update failed!');
         }
@@ -122,7 +122,7 @@ class Model_RecordBook extends Model_Container
      */
     public function setState($group, $state="common", $semesterID = null) {
         $semesterID = $semesterID ?: User::instance()->SemesterID;
-        $sql = 'SELECT `ControlStudentGroup`(:id, :group, :state, :semesterID) AS Result';
+        $sql = 'SELECT * FROM ControlStudentGroup(:id, :group, :state, :semesterID) AS Result';
 
         DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)
diff --git a/~dev_rating/application/classes/Model/Roles.php b/~dev_rating/application/classes/Model/Roles.php
index da1fd243927b3e4ae4ffc5e93a3771bbc44ad383..e17f834cc67d139952513a8374227fc0d5f4d9af 100644
--- a/~dev_rating/application/classes/Model/Roles.php
+++ b/~dev_rating/application/classes/Model/Roles.php
@@ -8,7 +8,7 @@
 class Model_Roles extends Model
 {
     public static function getAccountInfo($uID, $sID) {
-        $sql = 'CALL `GetFullInfo`(:pUserID, :pSemesterID)';
+        $sql = 'SELECT * FROM GetFullInfo(:pUserID, :pSemesterID)';
         $res = DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':pUserID' => $uID,
@@ -19,12 +19,12 @@ class Model_Roles extends Model
     }
     
     public static function getRoles() {
-        $sql = 'CALL `GetRoles`()';
+        $sql = 'SELECT * FROM GetRoles()';
         return DB::query(Database::SELECT, $sql)->execute()->as_array();
     }
     
     public static function setRole($ID, $role) {
-        $sql = 'SELECT `SetRole`(:pID, :pRole)';
+        $sql = 'SELECT * FROM SetRole(:pID, :pRole)';
         $result = '';
         if(
             DB::query(Database::SELECT, $sql)
diff --git a/~dev_rating/application/classes/Model/Semesters.php b/~dev_rating/application/classes/Model/Semesters.php
index 5ccd07aa4ed24e7c2d0ccaa4bc701c86a924fa06..055e86079bc7de610d91a2b90f7b5ad04ab3dc9e 100644
--- a/~dev_rating/application/classes/Model/Semesters.php
+++ b/~dev_rating/application/classes/Model/Semesters.php
@@ -34,7 +34,7 @@ class Model_Semesters extends Model
     }
 
     public static function load($id) {
-        $data = DB::query(Database::SELECT, 'CALL `GetSemestersInfo`(:id)')
+        $data = DB::query(Database::SELECT, 'SELECT * FROM GetSemestersInfo(:id)')
             ->param(':id', $id)->execute();
 
         if (!$data->count())
@@ -44,7 +44,7 @@ class Model_Semesters extends Model
     }
 
     public static function loadAll() {
-        $res = DB::query(Database::SELECT, 'CALL `GetSemestersInfo`(0)')->execute();
+        $res = DB::query(Database::SELECT, 'SELECT * FROM GetSemestersInfo(0)')->execute();
 
         $list = [];
         foreach ($res as $semester)
@@ -54,7 +54,7 @@ class Model_Semesters extends Model
     }
 
     public static function find($year, $semesterNum) {
-        $data = DB::query(Database::SELECT, 'CALL `Semester_Find`(:year, :semesterNum)')
+        $data = DB::query(Database::SELECT, 'SELECT * FROM Semester_Find(:year, :semesterNum)')
             ->param(':year', $year)
             ->param(':semesterNum', $semesterNum)
             ->execute();
diff --git a/~dev_rating/application/classes/Model/Statistics.php b/~dev_rating/application/classes/Model/Statistics.php
index 10883a3dfd62b59eb70014a5f2a1091a64a84792..1550e6b7309a8a37f8ae5ac789d8c155b0c7e932 100644
--- a/~dev_rating/application/classes/Model/Statistics.php
+++ b/~dev_rating/application/classes/Model/Statistics.php
@@ -11,7 +11,7 @@
 class Model_Statistics extends Model
 {
     public static function requests($startDate, $endDate) {
-        $query = 'CALL `Stats_GetSupportRequestFrequency`(:startDate, :endDate)';
+        $query = 'SELECT * FROM Stats_GetSupportRequestFrequency(:startDate, :endDate)';
         $stats = DB::query(Database::SELECT, $query)
             ->param(':startDate', $startDate)
             ->param(':endDate', $endDate)
@@ -20,7 +20,7 @@ class Model_Statistics extends Model
     }
 
     public static function log_ins($startDate, $endDate) {
-        $query = 'CALL `Stats_GetSignInFrequency`(:startDate, :endDate)';
+        $query = 'SELECT * FROM Stats_GetSignInFrequency(:startDate, :endDate)';
         $stats = DB::query(Database::SELECT, $query)
             ->param(':startDate', $startDate)
             ->param(':endDate', $endDate)
diff --git a/~dev_rating/application/classes/Model/Student.php b/~dev_rating/application/classes/Model/Student.php
index 0e04cc9e66506aaf937d602cc75187df0d47d0a7..24177084db80dccd63c017a5fdb57363af22ab6c 100644
--- a/~dev_rating/application/classes/Model/Student.php
+++ b/~dev_rating/application/classes/Model/Student.php
@@ -30,7 +30,7 @@ class Model_Student extends Model_Container
 {
     protected function getRawData($id) {
         $this->data[self::$ID_FIELD] = $id;
-        $sql = 'CALL `Student_GetInfo`(:id)';
+        $sql = 'SELECT * FROM Student_GetInfo(:id)';
         $info = DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)->execute();
 
@@ -46,7 +46,7 @@ class Model_Student extends Model_Container
     }
 
     public function getRecordBooks() {
-        $sql = 'CALL `Student_GetRecordBooks`(:id)';
+        $sql = 'SELECT * FROM Student_GetRecordBooks(:id)';
         return DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)->execute()->as_array();
     }
@@ -56,7 +56,7 @@ class Model_Student extends Model_Container
     }
 
     protected function create() {
-        $sql = 'SELECT `CreateOrAddStudent`(ExternalID, LastName, FirstName, SecondName) AS `ID`';
+        $sql = 'SELECT * FROM CreateOrAddStudent(ExternalID, LastName, FirstName, SecondName) AS "ID"';
         $this->data[self::$ID_FIELD] = DB::query(Database::SELECT, $sql)
             ->parameters($this->data)
             ->execute()->get('ID');
@@ -64,7 +64,7 @@ class Model_Student extends Model_Container
 
     public function update() {
         $updatedData = array_merge(['ExternalID' => null], $this->getRawData($this->ID), $this->data);
-        $sql = 'SELECT `Student_ChangeInfo`(ID, ExternalID, LastName, FirstName, SecondName) AS `Success`';
+        $sql = 'SELECT * FROM Student_ChangeInfo(ID, ExternalID, LastName, FirstName, SecondName) AS "Success"';
         $success = DB::query(Database::SELECT, $sql)
             ->parameters($updatedData)
             ->execute()->get('Success');
@@ -77,7 +77,7 @@ class Model_Student extends Model_Container
         if (!$semesterID)
             $semesterID = Model_System::$SemesterID;
 
-        $sql = 'SELECT `CreateStudentEx`(:last, :first, :second, :grade, :group, :degree, :spec, :faculty, :code, :semester) AS `UserID`;';
+        $sql = 'SELECT * FROM CreateStudentEx(:last, :first, :second, :grade, :group, :degree, :spec, :faculty, :code, :semester) AS "UserID"';
         $response = DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':last'     => trim($lastName),
@@ -100,7 +100,7 @@ class Model_Student extends Model_Container
      * @return integer
      */
     public static function withExternalID($extid) {
-        $sql = 'SELECT `Student_GetIDFromExternalID`(:ExtID) AS `ID`';
+        $sql = 'SELECT * FROM Student_GetIDFromExternalID(:ExtID) AS "ID"';
         $res = DB::query(Database::SELECT, $sql)
             ->param(':ExtID', $extid)
             ->execute()->get('ID');
@@ -112,7 +112,7 @@ class Model_Student extends Model_Container
         $semesterID = $semesterID ?: User::instance()->SemesterID;
         $recordBookID = $recordBookID ?: User::instance()->RecordBookID;
         
-        $sql = 'CALL `Student_GetDisciplines`(:recordBookID, :semesterID)';
+        $sql = 'SELECT * FROM Student_GetDisciplines(:recordBookID, :semesterID)';
         $query = DB::query(Database::SELECT, $sql)
             ->param(':recordBookID', $recordBookID)
             ->param(':semesterID', $semesterID)
@@ -130,7 +130,7 @@ class Model_Student extends Model_Container
         $semesterID = $semesterID ?: User::instance()->SemesterID;
         $recordBookID = $recordBookID ?: User::instance()->RecordBookID;
 
-        $sql = 'CALL `Student_GetTeachersList`(:recordBookID, :semesterID, :loadAll)';
+        $sql = 'SELECT * FROM Student_GetTeachersList(:recordBookID, :semesterID, :loadAll)';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':recordBookID', $recordBookID)
             ->param(':semesterID', $semesterID)
@@ -161,7 +161,7 @@ class Model_Student extends Model_Container
     public function toAcademicLeave($semesterID = null) {
         $semesterID = $semesterID ?: User::instance()->SemesterID;
         throw new InvalidArgumentException('Supply recordbook id instead of student id!');
-        $sql = 'SELECT `ControlStudentGroup`(:id, -1, "leave", :semesterID)';
+        $sql = 'SELECT * FROM ControlStudentGroup(:id, -1, "leave", :semesterID)';
 
 
         DB::query(Database::SELECT, $sql)
@@ -180,7 +180,7 @@ class Model_Student extends Model_Container
     public function setState($group, $state="common", $semesterID = null) {
         $semesterID = $semesterID ?: User::instance()->SemesterID;;
         throw new InvalidArgumentException('Supply recordbook id instead of student id!');
-        $sql = 'SELECT `ControlStudentGroup`(:id, :group, :state, :semesterID) AS Result';
+        $sql = 'SELECT * FROM ControlStudentGroup(:id, :group, :state, :semesterID) AS Result';
 
         DB::query(Database::SELECT, $sql)
             ->param(':id', $this->ID)
diff --git a/~dev_rating/application/classes/Model/Students.php b/~dev_rating/application/classes/Model/Students.php
index 0e36b4a3d882e09ccbce48e37de750d264edcd74..b124acaecc68c4531b31e5d6a8e147430c4bd461 100644
--- a/~dev_rating/application/classes/Model/Students.php
+++ b/~dev_rating/application/classes/Model/Students.php
@@ -4,7 +4,7 @@ class Model_Students extends Model
 {
     /** @return Model_Student[] */
     public static function ofDiscipline(Model_Discipline $discipline) {
-        $sql = 'CALL `Discipline_GetStudents`(:id)';
+        $sql = 'SELECT * FROM Discipline_GetStudents(:id)';
         $result = DB::query(Database::SELECT, $sql)
             ->param(':id', $discipline->ID)
             ->execute();
@@ -26,7 +26,7 @@ class Model_Students extends Model
 
     public static function getGradeID($gradeNum, $degree) {
         $degree = Database::instance()->escape($degree);
-        $sql = 'SELECT `GetGradeID`(:gradeNum, :degree) AS `ID`';
+        $sql = 'SELECT * FROM GetGradeID(:gradeNum, :degree) AS "ID"';
         return DB::query(Database::SELECT, $sql)
             ->param(':grade', $gradeNum)
             ->param(':degree', $degree)
@@ -34,7 +34,7 @@ class Model_Students extends Model
     }
 
     public static function search($facultyID, $gradeID, $groupID, $disciplineID, $name) {
-        $sql = 'CALL `SearchStudents`(:grade, :group, :faculty, :name, :discipline)';
+        $sql = 'SELECT * FROM SearchStudents(:grade, :group, :faculty, :name, :discipline)';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':name'       => $name,
@@ -50,7 +50,7 @@ class Model_Students extends Model
             $words = [$words];
         $words += ['', '', ''];
 
-        $sql = 'CALL `GetStudents`(:faculty, :grade, :group, :semester, :word1, :word2, :word3)';
+        $sql = 'SELECT * FROM GetStudents(:faculty, :grade, :group, :semester, :word1, :word2, :word3)';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':word1'    => $words[0],
diff --git a/~dev_rating/application/classes/Model/Subject.php b/~dev_rating/application/classes/Model/Subject.php
index b7fa868f63c4999eec56d5c26b31e59f0fdfddf9..c067a52790085b4320c542c01fb3977c0417b324 100644
--- a/~dev_rating/application/classes/Model/Subject.php
+++ b/~dev_rating/application/classes/Model/Subject.php
@@ -36,7 +36,7 @@ class Model_Subject
     }
 
     public static function createOrUpdate($name, $abbr, $facultyID, $extID=null) {
-        $sql = 'SELECT `Subject_Create`(:faculty, :name, :abbr, :extID) AS `Num`';
+        $sql = 'SELECT * FROM Subject_Create(:faculty, :name, :abbr, :extID) AS "Num"';
         $res = DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':faculty' => $facultyID,
@@ -49,7 +49,7 @@ class Model_Subject
     }
 
     public static function withExternalID($extID, $name, $abbr, $facultyID) {
-        $sql = 'SELECT `Subject_GetByExternalID`(:extID) AS `ID`';
+        $sql = 'SELECT * FROM Subject_GetByExternalID(:extID) AS "ID"';
         $id = DB::query(Database::SELECT, $sql)
             ->param(':extID', $extID)
             ->execute()->get('ID');
diff --git a/~dev_rating/application/classes/Model/Support.php b/~dev_rating/application/classes/Model/Support.php
index b728e620e8c0684389d173afcc6e7b8d704eed4d..03a68cb51413458ea0177dde479e4be95d80d751 100644
--- a/~dev_rating/application/classes/Model/Support.php
+++ b/~dev_rating/application/classes/Model/Support.php
@@ -4,7 +4,7 @@ class Model_Support extends Model
 {
     // return request ID
     public static function createRequest($accountID, $title, $description, $hasImg = false) {
-        $sql = 'SELECT `CreateRequest`(:account, :title, :description, :hasImg) AS Num';
+        $sql = 'SELECT * FROM CreateRequest(:account, :title, :description, :hasImg) AS Num';
         return DB::query(Database::SELECT, $sql)
             ->param(':account', (int) $accountID)
             ->param(':description', $description)
@@ -15,7 +15,7 @@ class Model_Support extends Model
 
     // returns status code
     public static function updateRequest($requestID, $title, $description) {
-        $sql = 'SELECT `UpdateRequest`(:requestID, :title, :description) AS Num';
+        $sql = 'SELECT * FROM UpdateRequest(:requestID, :title, :description) AS Num';
         return DB::query(Database::SELECT, $sql)
             ->param(':requestID', (int) $requestID)
             ->param(':description', $description)
@@ -24,7 +24,7 @@ class Model_Support extends Model
     }
 
     public static function getRequests($userID, $offset = 0, $count = 1000, $statusFilter = 'all') {
-        $sql = 'CALL `GetRequests`(:offset, :count, :account, :filter)';
+        $sql = 'SELECT * FROM GetRequests(:offset, :count, :account, :filter)';
         return DB::query(Database::SELECT, $sql)
             ->param(':account', $userID)
             ->param(':offset', $offset)
@@ -34,14 +34,14 @@ class Model_Support extends Model
     }
 
     public static function getNumberOfRequests($statusFilter) {
-        $sql = 'CALL `RequestsNum` (:filter)';
+        $sql = 'SELECT * FROM RequestsNum(:filter)';
         return DB::query(Database::SELECT, $sql)
             ->param(':filter', $statusFilter)
             ->execute()->get('Num');
     }
 
     public static function setStatus($requestID, $status) {
-        $sql = 'SELECT `SetRequestStatus`(:requestID, :status) AS Num';
+        $sql = 'SELECT * FROM SetRequestStatus(:requestID, :status) AS Num';
         return DB::query(Database::SELECT, $sql)
             ->param(':requestID', (int) $requestID)
             ->param(':status', $status)
diff --git a/~dev_rating/application/classes/Model/Teacher.php b/~dev_rating/application/classes/Model/Teacher.php
index 00aaa9dee8546eb5e7fc29b7a9f90b444a17eabf..492bc123fda9a54c8b9f6d368f8fa6168d19c20e 100644
--- a/~dev_rating/application/classes/Model/Teacher.php
+++ b/~dev_rating/application/classes/Model/Teacher.php
@@ -30,7 +30,7 @@ class Model_Teacher extends Model_Container
 
 
     protected function getRawData($id) {
-        $sql = 'CALL `Teacher_GetInfo`(:id)';
+        $sql = 'SELECT * FROM Teacher_GetInfo(:id)';
         $info = DB::query(Database::SELECT, $sql)
             ->param(':id', $id)->execute();
 
@@ -49,14 +49,14 @@ class Model_Teacher extends Model_Container
     }
 
     public static function withExternalID($extid) {
-        $sql = 'SELECT `Teacher_GetIDFromExternalID`(:ExtID) AS `ID`';
+        $sql = 'SELECT * FROM Teacher_GetIDFromExternalID(:ExtID) AS "ID"';
         return (int)DB::query(Database::SELECT, $sql)
             ->param(':ExtID', $extid)
             ->execute()->get('ID');
     }
 
     public static function withINILA($extid) {
-        $sql = 'SELECT `Teacher_GetIDFromINILA`(:ExtID) AS `ID`';
+        $sql = 'SELECT * FROM Teacher_GetIDFromINILA(:ExtID) AS "ID"';
         return (int)DB::query(Database::SELECT, $sql)
             ->param(':ExtID', $extid)
             ->execute()->get('ID');
@@ -64,15 +64,15 @@ class Model_Teacher extends Model_Container
 
     protected function create() {
         if ( isset($this->data['ExternalID']) ) {
-            $sql = 'SELECT `Teacher_CreateActivated`(LastName, FirstName, SecondName, JobPositionID, FacultyID, DepID, 
-                                                        ExternalID, INILA) AS `ID`';
+            $sql = 'SELECT * FROM Teacher_CreateActivated(LastName, FirstName, SecondName, JobPositionID, FacultyID, DepID, 
+                                                        ExternalID, INILA) AS "ID"';
 
             $this->data[self::$ID_FIELD] = DB::query(Database::SELECT, $sql)
                 ->parameters($this->data)
                 ->execute()->get('ID');
         } else {
-            $sql = 'SELECT `Teacher_Create`(LastName, FirstName, SecondName, JobPositionID, DepID, 
-                                                ActivationCode) AS `ID`';
+            $sql = 'SELECT * FROM Teacher_Create(LastName, FirstName, SecondName, JobPositionID, DepID, 
+                                                ActivationCode) AS "ID"';
 
             $this->data[self::$ID_FIELD] = DB::query(Database::SELECT, $sql)
                 ->parameters($this->data)
@@ -85,7 +85,7 @@ class Model_Teacher extends Model_Container
 
 
     public function changeInfo($externalID, $inila, $lastName, $firstName, $secondName, $degreeID, $departmentID, $isWorking=true) {
-        $sql = 'SELECT `ChangeTeacherInfo`(:externalID, :inila, :id, :last, :first, :second, :degree, :department, :status) AS `Num`';
+        $sql = 'SELECT * FROM ChangeTeacherInfo(:externalID, :inila, :id, :last, :first, :second, :degree, :department, :status) AS "Num"';
         $res = DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':externalID' => $externalID,
@@ -106,7 +106,7 @@ class Model_Teacher extends Model_Container
      * @return Model_Discipline[]
      */
     public function getDisciplines($semesterID) {
-        $sql = 'CALL `GetDisciplinesForTeacher`(:id, :semesterID)';
+        $sql = 'SELECT * FROM GetDisciplinesForTeacher(:id, :semesterID)';
         $query = DB::query(Database::SELECT, $sql)
             ->param(':semesterID', $semesterID)
             ->param(':id', $this->ID)
@@ -127,7 +127,7 @@ class Model_Teacher extends Model_Container
      *                    -1 otherwise.
      */
     public function getRightsForDiscipline(Model_Discipline $discipline) {
-        $sql = 'SELECT `GetEditRightsForTeacher`(:teacher, :discipline) AS `Num`';
+        $sql = 'SELECT * FROM GetEditRightsForTeacher(:teacher, :discipline) AS "Num"';
         return DB::query(Database::SELECT, $sql)
             ->param(':discipline', $discipline->ID)
             ->param(':teacher', $this->ID)
@@ -135,7 +135,7 @@ class Model_Teacher extends Model_Container
     }
 
     public function getSimilarDisciplines($subjectID) {
-        $sql = 'CALL `Teacher_GetSimilarDisciplines`(:teacher, :subject)';
+        $sql = 'SELECT * FROM Teacher_GetSimilarDisciplines(:teacher, :subject)';
         return DB::query(Database::SELECT, $sql)
             ->param(':teacher', $this->ID)
             ->param(':subject', $subjectID)
diff --git a/~dev_rating/application/classes/Model/Teachers.php b/~dev_rating/application/classes/Model/Teachers.php
index 6f5f65f823d0784ee94ab8a5d7a3af0b9d7b875e..64489d28a6cd4534f7668f6baed4462e85a8925f 100644
--- a/~dev_rating/application/classes/Model/Teachers.php
+++ b/~dev_rating/application/classes/Model/Teachers.php
@@ -3,12 +3,12 @@
 class Model_Teachers extends Model
 {
     public static function getJobPositions() {
-        $sql = 'CALL `JobPositions_Get`()';
+        $sql = 'SELECT * FROM JobPositions_Get()';
         return DB::query(Database::SELECT, $sql)->execute()->as_array();
     }
 
     public static function ofFaculty($facultyID) {
-        $sql = 'CALL `GetTeachers`(:faculty, :department)';
+        $sql = 'SELECT * FROM GetTeachers(:faculty, :department)';
         return DB::query(Database::SELECT, $sql)
             ->param(':faculty', $facultyID)
             ->param(':department', 0)
@@ -16,7 +16,7 @@ class Model_Teachers extends Model
     }
 
     public static function ofDepartment($departmentID) {
-        $sql = 'CALL `GetTeachers`(:faculty, :department)';
+        $sql = 'SELECT * FROM GetTeachers(:faculty, :department)';
         return DB::query(Database::SELECT, $sql)
             ->param(':department', $departmentID)
             ->param(':faculty', 0)
@@ -29,7 +29,7 @@ class Model_Teachers extends Model
             $words = [$words];
         $words += ['', '', ''];
 
-        $sql = 'CALL `SearchTeachers`(:faculty, :department, :word1, :word2, :word3, :discipline)';
+        $sql = 'SELECT * FROM SearchTeachers(:faculty, :department, :word1, :word2, :word3, :discipline)';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':word1'      => $words[0],
@@ -42,7 +42,7 @@ class Model_Teachers extends Model
     }
 
     public static function searchTeacherNew($facultyID, $departmentID, $last, $first, $second, $disciplineID) {
-        $sql = 'CALL `SearchTeacherNew`(:faculty, :department, :last, :first, :second, :discipline)';
+        $sql = 'SELECT * FROM SearchTeacherNew(:faculty, :department, :last, :first, :second, :discipline)';
         return DB::query(Database::SELECT, $sql)
             ->parameters([
                 ':faculty'    => $facultyID,