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