From f8292407626a2c44ebbb4521eeb50d13620371c4 Mon Sep 17 00:00:00 2001 From: User <maric@math.sfedu.ru> Date: Tue, 11 Sep 2018 17:29:45 +0300 Subject: [PATCH] functions for requests --- db/postgresql/functions.sql | 169 +++++++++++++++++------------------- 1 file changed, 79 insertions(+), 90 deletions(-) diff --git a/db/postgresql/functions.sql b/db/postgresql/functions.sql index e75383ae6..961d5f2b5 100644 --- a/db/postgresql/functions.sql +++ b/db/postgresql/functions.sql @@ -523,7 +523,7 @@ BEGIN END $function$; -CREATE OR REPLACE FUNCTION public.calculatemaxrateforextra(pdisciplineid integer, precordbookid integer) + CREATE OR REPLACE FUNCTION public.calculatemaxrateforextra(pdisciplineid integer, precordbookid integer) RETURNS integer LANGUAGE plpgsql AS $function$ @@ -544,7 +544,7 @@ BEGIN 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 + SELECT cast (SUM(CASE WHEN view_roadmap.ModuleType = 'regular' THEN rating_table.Rate ELSE 0 END) as integer) INTO vResult FROM view_roadmap LEFT JOIN rating_table --ON rating_table.StudentID = pStudentID AND @@ -2390,41 +2390,40 @@ CREATE OR REPLACE FUNCTION public.discipline_setrate(pteacherid integer, precord LANGUAGE plpgsql AS $function$ DECLARE vDisciplineID INT DEFAULT -1; - vMaxRate INT DEFAULT -1; - vModuleType regular_exam_bonus_extra; + vMaxRate INT DEFAULT -1; + vModuleType regular_exam_bonus_extra; DECLARE vIsOver int DEFAULT 0; - vIsLocked int DEFAULT 0; - vIsUsed int2 DEFAULT 0; - vIsUpdated boolean default false; + vIsLocked int DEFAULT 0; + vIsUsed int2 DEFAULT 0; + 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) +-- 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 здесь еще нельзя проверять, т.к. нет vDisciplineID -- нужно переставить очередность /* IF NOT InternalIsStudentAttached(pRecordBookID, vDisciplineID) OR NOT InternalIsTeacherBound(pTeacherID, vDisciplineID) THEN RETURN 1; END IF;*/ - - IF pRate < 0 THEN + + 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 = 0; + END IF; + vIsOver = 0; SELECT disciplines.ID, disciplines.IsLocked, disciplines.Milestone, @@ -2437,7 +2436,7 @@ begin INNER JOIN disciplines ON modules.DisciplineID = disciplines.ID WHERE submodules.ID = pSubmoduleID LIMIT 1; - + -- correct max rate for extra module IF vModuleType = 'extra' THEN -- 4 - extra vMaxRate = CalculateMaxRateForExtra(vDisciplineID, pRecordBookID); @@ -2462,7 +2461,7 @@ begin -- add rate, or update old visUpdated = exists (select * from rating_table where RecordBookID=pRecordBookID and SubmoduleID= pSubmoduleID); - INSERT INTO rating_table (RecordBookID, TeacherID, SubmoduleID, Rate, "date") + 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 @@ -2483,20 +2482,21 @@ begin ; END IF; ---add submodule to max rate counting (see triggers) - +--add submodule to max rate counting (see triggers) IF vIsUsed=0 THEN UPDATE submodules - SET submodules.IsUsed = 1 - WHERE submodules.ID = pSubmoduleID + SET IsUsed = 1 + where ID = pSubmoduleID ; END IF; - + RETURN 0; EXCEPTION when others then RETURN -1; end $function$; +end + $function$; CREATE OR REPLACE FUNCTION public.discipline_unbindteacher(pdisciplineid integer, pbindingteacher integer) RETURNS integer @@ -3304,15 +3304,35 @@ BEGIN END $function$; -CREATE OR REPLACE FUNCTION public.getrequests(poffset integer, pcount integer, paccountid integer, pfilter opened_processed_closed_all) - RETURNS void +CREATE OR REPLACE FUNCTION public.getrequests(poffset integer, pcount integer, paccountid integer, pfilter varchar) + RETURNS table ("ID" integer, "AccountID" integer, "Title" varchar, "Description" text, "Date" timestamp, +"Status" opened_processed_closed, + "HasImage" integer, + "FullName" varchar, "UserRoleID" integer,"PersonalID" integer) LANGUAGE plpgsql AS $function$ -BEGIN - SELECT requests.*, GetUserFullNameByAccountID(accounts.ID) as FullName, accounts.UserRoleID, - GetUserStudentOrTeacherID(AccountID, accounts.UserRoleID) as PersonalID +declare vfilter opened_processed_closed; +begin + if pfilter ='all' then vfilter=null; + else vfilter = cast(pfilter as opened_processed_closed); + end if; + return query + SELECT --requests.*, + requests.id as "ID", + requests.accountid as "AccountID", + requests.title as "Title", + requests.description as "Description", + requests."date" as "Date", + requests.status as "Status", + requests.hasimage as "HasImage", + GetUserFullNameByAccountID(accounts.ID) as "FullName", + accounts.UserRoleID as "UserRoleID", + GetUserStudentOrTeacherID(AccountID, accounts.UserRoleID) as "PersonalID" FROM requests join accounts on requests.AccountID = accounts.ID - WHERE if (pFilter = 'all', TRUE, requests.Status = pFilter) AND + WHERE --iif_sql (pFilter = 'all', TRUE, requests.Status = pFilter) AND + ( vfilter is null or requests.Status = vFilter) + + AND requests.Title != '' AND requests.Description != '' ORDER BY requests.Date DESC @@ -3939,23 +3959,12 @@ BEGIN -- :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; + select concat(coalesce(accounts.lastname,''),' ', + coalesce(accounts.firstname,''),' ', + coalesce(accounts.secondname,'')) + into vUserFullName + from accounts + where accounts.id=paccountid ; RETURN vUserFullName; END; @@ -4586,23 +4595,26 @@ begin END; $function$; -CREATE OR REPLACE FUNCTION public.requestsnum(pfilter opened_processed_closed_all) +CREATE OR REPLACE FUNCTION public.requestsnum(pfilter varchar) RETURNS integer LANGUAGE plpgsql AS $function$ -declare vtype opened_processed_closed; +declare vtype opened_processed_closed default null; + vNum integer; begin --select public.requestsnum( -- :pfilter -- put the pfilter parameter value instead of 'pfilter' (opened_processed_closed_all) --); + vtype = null; if (pFilter != 'all') then vtype = cast (pFilter as opened_processed_closed); end if; - SELECT COUNT(*) AS Num + SELECT COUNT(*) into vNum FROM requests - WHERE iif_sql(pFilter = 'all', TRUE, requests.Status = vtype) AND + WHERE (vtype is null or requests.Status = vtype) AND requests.Title != '' AND requests.Description != ''; + return vNum; end $function$; @@ -4782,13 +4794,13 @@ BEGIN --); UPDATE requests - SET requests.Status = pStatus + SET Status = pStatus WHERE requests.ID = pRequestID; get diagnostics vROWS = ROW_COUNT; RETURN vROWS-1; - EXCEPTION - when others then RETURN -1; + EXCEPTION + when others then RETURN -1; END $function$; @@ -4860,7 +4872,7 @@ begin INSERT INTO logs_signin (AccountID) VALUES (vAccountID); RETURN vAccountID; END - $function$ + $function$; CREATE OR REPLACE FUNCTION public.signinbytoken(ptoken character) @@ -5274,6 +5286,7 @@ begin where disciplines.ID = vDisciplineID; return new; end if; + return new; end $function$; @@ -5578,9 +5591,9 @@ BEGIN -- :pDescription -- put the pDescription parameter value instead of 'pDescription' (CHAR(1)) --); UPDATE requests - SET requests.Description = pDescription, - requests.Title = pTitle, - requests.Date = NOW() + SET Description = pDescription, + Title = pTitle, + "date" = NOW() WHERE requests.ID = pRequestID AND requests.Description IS NULL AND requests.Title IS NULL; @@ -5875,32 +5888,7 @@ SELECT --faculties.* -- ID, Abbr, Name $function$; 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) + 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, "Year" integer, "SemesterNum" integer) LANGUAGE sql AS $function$ --select * from public.getfinalforminfo( @@ -5947,6 +5935,7 @@ AS $function$ WHERE study_groups.ID = pGroupID LIMIT 1; $function$; + CREATE OR REPLACE FUNCTION public.getgrades() RETURNS TABLE("ID" integer, "Num" integer, "Degree" bachelor_master_specialist) LANGUAGE sql @@ -6272,8 +6261,8 @@ AS $function$ SELECT ENCODE(DIGEST(password,'sha1'),'hex'); $function$; -CREATE OR REPLACE FUNCTION public.stats_getsupportrequestfrequency(dlimit date) - RETURNS TABLE(counted_leads bigint, count_date date) +CREATE OR REPLACE FUNCTION public.stats_getsupportrequestfrequency(datefrom date, dateto date) + RETURNS TABLE(counter bigint, day date) LANGUAGE sql AS $function$ @@ -6281,8 +6270,8 @@ AS $function$ -- :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 + count(DATE(requests.Date)) as counter, DATE(requests.Date) as day +FROM requests WHERE requests.Date between datefrom and dateto+1 GROUP BY DATE(requests.Date); $function$; -- GitLab