Skip to content
Snippets Groups Projects
Commit 5dffaefb authored by Anton Bagliy's avatar Anton Bagliy
Browse files

v.2.8.0

parents 2125a611 7454924a
Branches
No related merge requests found
DROP FUNCTION IF EXISTS public.getdisciplinesforgroup(pgroupid integer, psemesterid integer, pshowhidden boolean);
DROP FUNCTION IF EXISTS public.getdisciplinesforgroup(pgroupid integer, psemesterid integer, pshowglobal boolean, pshowhidden boolean);
CREATE OR REPLACE FUNCTION public.getdisciplinesforgroup(pgroupid integer, psemesterid integer, pshowglobal boolean DEFAULT false, pshowhidden boolean DEFAULT false)
RETURNS TABLE("ID" integer, "SubjectID" integer, "SubjectName" character varying, "Subtype" scientific_disciplinary_coursework, "Type" exam_credit_grading_credit, "CompoundDiscID" integer, "CompoundDiscName" character varying, "CurRate" integer, "MaxRate" integer, "IsGlobal" boolean, "GlobalName" character varying)
LANGUAGE plpgsql
AS $function$
BEGIN
return query
SELECT DISTINCT view_disciplines.DisciplineID AS "ID",
view_disciplines.subjectid as "SubjectID",
view_disciplines.SubjectName as "SubjectName",
view_disciplines.Subtype as "Subtype",
view_disciplines.ExamType AS "Type",
view_disciplines.CompoundDiscID as "CompoundDiscID",
view_disciplines.CompoundDiscName as "CompoundDiscName",
view_disciplines.CurRate as "CurRate",
view_disciplines.MaxRate as "MaxRate",
view_disciplines.isGlobal as "IsGlobal",
global_disciplines.name as "GlobalName"
FROM students_groups
LEFT JOIN view_disciplines_recordbooks ON students_groups.RecordBookID = view_disciplines_recordbooks.RecordBookID
INNER JOIN view_disciplines ON view_disciplines_recordbooks.DisciplineID = view_disciplines.DisciplineID
LEFT JOIN global_disciplines ON view_disciplines.DisciplineID = global_disciplines.disciplineid
WHERE students_groups.GroupID = pGroupID AND
students_groups.SemesterID = pSemesterID AND
view_disciplines.SemesterID = pSemesterID AND
(NOT (view_disciplines.IsInactive) OR pshowhidden) AND
(NOT (view_disciplines.IsGlobal) OR pshowglobal) AND
students_groups.State <= 'outlet' AND
-- view_disciplines_recordbooks.Type may be attach or NULL
COALESCE(view_disciplines_recordbooks.Type, 'attach') = 'attach'
ORDER BY view_disciplines.ExamType DESC,
view_disciplines.SubjectName ASC;
end;
$function$;
DROP FUNCTION IF EXISTS public.getdisciplinesforexport(pgroupid integer, psemesterid integer);
CREATE OR REPLACE FUNCTION public.getdisciplinesforexport(pgroupid integer, psemesterid integer)
RETURNS TABLE("ID" integer, "SubjectName" character varying, "DisciplineExternalID" character varying, "PlanExternalID" integer)
LANGUAGE plpgsql
AS $function$
BEGIN
return query
select D."ID" as "ID",
D."SubjectName" as "SubjectName",
subjects.externalid as "DisciplineExternalID",
study_plans.externalid as "PlanExternalID"
from public.getdisciplinesforgroup(pgroupid, psemesterid, True, True) as D
join disciplines on disciplines.id = D."ID"
join subjects on disciplines.subjectid = subjects.id
join disciplines_study_plans on disciplines_study_plans.disciplineid = D."ID"
join students_groups on public.students_groups.groupid = pgroupid
join record_books_plans on record_books_plans.recordbookid = public.students_groups.recordbookid
join study_plans on disciplines_study_plans.studyplanid = study_plans.id and record_books_plans.studyplanid = study_plans.id;
end;
$function$;
This diff is collapsed.
...@@ -61,6 +61,37 @@ class Controller_Office_Bill extends Controller_Environment_Office ...@@ -61,6 +61,37 @@ class Controller_Office_Bill extends Controller_Environment_Office
return $res; return $res;
} }
protected static function processGlobal($disciplines, $students, $rates) {
$res = [];
$subjectsToGlobals = [];
$disciplinesToGlobals = [];
$nextGlobalNum = 1;
foreach ($disciplines as $disc) {
if ($disc['IsGlobal']) {
$subj = $disc['SubjectID'];
if (array_key_exists($subj, $subjectsToGlobals)) {
$disciplinesToGlobals[$disc['ID']] = $nextGlobalNum - 1;
} else {
$subjectsToGlobals[$subj] = $nextGlobalNum;
$disciplinesToGlobals[$disc['ID']] = $nextGlobalNum;
$newGlobalDiscipline = [
'ID' => $nextGlobalNum,
'SubjectName' => $disc["SubjectName"],
];
$res[$nextGlobalNum] = $newGlobalDiscipline;
$nextGlobalNum++;
}
foreach($students as $student) {
$rate = $rates[$student['ID']][$disc['ID']];
if ($rate) {
$res[$disciplinesToGlobals[$disc['ID']]][$student['ID']] = $disc['ID'];
}
}
}
}
return $res;
}
public function action_show() { public function action_show() {
$semesterID = $this->request->post('semesterID'); $semesterID = $this->request->post('semesterID');
$groupID = $this->request->post('groupID'); $groupID = $this->request->post('groupID');
...@@ -69,16 +100,18 @@ class Controller_Office_Bill extends Controller_Environment_Office ...@@ -69,16 +100,18 @@ class Controller_Office_Bill extends Controller_Environment_Office
self::concatNames($students); self::concatNames($students);
// TODO: refactor after new groups implemented // TODO: refactor after new groups implemented
$disciplines = Model_Group::with($groupID)->getDisciplines(false, $semesterID); $disciplines = Model_Group::with($groupID)->getDisciplines($lazy = false, $semesterID, $showglobal = true);
$disciplines = Arr::groupByUniqueKey('ID', $disciplines); $disciplines = Arr::groupByUniqueKey('ID', $disciplines);
$discWithCompounds = self::processCompounds($disciplines); $discWithCompounds = self::processCompounds($disciplines);
$rates = Model_Rating::getRatesForGroupAll($groupID, $semesterID); $rates = Model_Rating::getRatesForGroupAll($groupID, $semesterID);
$ratesMap = self::getRateMap($rates, $disciplines); $ratesMap = self::getRateMap($rates, $disciplines);
$globalDisciplines = self::processGlobal($disciplines, $students, $ratesMap);
$this->twig->set_filename(static::OFFICE . 'bill') $this->twig->set_filename(static::OFFICE . 'bill')
->set([ ->set([
'Disciplines' => $discWithCompounds, 'Disciplines' => $discWithCompounds,
'GlobalDisciplines' => $globalDisciplines,
'Students' => $students, 'Students' => $students,
'Rates' => $ratesMap, 'Rates' => $ratesMap,
]); ]);
......
...@@ -45,12 +45,13 @@ class Model_Group extends Model ...@@ -45,12 +45,13 @@ class Model_Group extends Model
} }
/** @return Model_Discipline[] */ /** @return Model_Discipline[] */
public function getDisciplines($lazy = true, $semesterID = null) { public function getDisciplines($lazy = true, $semesterID = null, $showglobal = false) {
$semesterID = $semesterID ?: User::instance()->SemesterID; $semesterID = $semesterID ?: User::instance()->SemesterID;
$sql = 'SELECT * FROM GetDisciplinesForGroup(:id, :semesterID)'; $sql = 'SELECT * FROM GetDisciplinesForGroup(:id, :semesterID, :showglobal)';
$query = DB::query(Database::SELECT, $sql) $query = DB::query(Database::SELECT, $sql)
->param(':id', $this->ID) ->param(':id', $this->ID)
->param(':semesterID', $semesterID) ->param(':semesterID', $semesterID)
->param(':showglobal', $showglobal)
->execute(); ->execute();
$list = []; $list = [];
......
...@@ -2,30 +2,57 @@ ...@@ -2,30 +2,57 @@
<tbody> <tbody>
<tr class="RatingTableModulesHead"> <tr class="RatingTableModulesHead">
<td class="student_td title">&nbsp;</td> <td class="student_td title">&nbsp;</td>
{% for dis in Disciplines %} {% for dis in GlobalDisciplines %}
<td class="title"> <td class="title">
{% if dis.CompoundDiscID %} {{ HTML.anchor('#', dis.SubjectName ~ '(межфакультетская дисциплина)', {'title': dis.SubjectName ~ '(межфакультетская дисциплина)' })|raw }}
{{ HTML.anchor('/compound_disciplines/' ~ dis.CompoundDiscID,
dis.CompoundDiscName, {'title': dis.CompoundDiscName })|raw }}
{% else %}
{{ HTML.anchor('/discipline/' ~ dis.ID ~ '/rate', dis.SubjectName, {'title': dis.SubjectName })|raw }}
{% endif %}
</td> </td>
{% endfor %} {% endfor %}
{% for dis in Disciplines %}
{% if not dis.IsGlobal %}
<td class="title">
{% if dis.CompoundDiscID %}
{{ HTML.anchor('/compound_disciplines/' ~ dis.CompoundDiscID,
dis.CompoundDiscName, {'title': dis.CompoundDiscName })|raw }}
{% else %}
{{ HTML.anchor('/discipline/' ~ dis.ID ~ '/rate', dis.SubjectName, {'title': dis.SubjectName })|raw }}
{% endif %}
</td>
{% endif %}
{% endfor %}
</tr> </tr>
{% set typeClasses = ['success_rate', 'debt_rate', 'repass_rate', 'absent_rate'] %} {% set typeClasses = ['success_rate', 'debt_rate', 'repass_rate', 'absent_rate'] %}
{% for stud in Students %} {% for stud in Students %}
<tr> <tr>
<td class="student_td">{{ stud.FullName }} </td> <td class="student_td">{{ stud.FullName }} </td>
{% for disc in Disciplines %} {% for disc in GlobalDisciplines %}
{% set id = -disc.CompoundDiscID ?: disc.ID %} {% set id = GlobalDisciplines[disc.ID][stud.ID] %}
{% set rate = Rates[stud.ID][id] %} {% set rate = Rates[stud.ID][id] %}
{% if rate %} {% if rate %}
<td class="{{ typeClasses[rate.Type] }}">{{ rate.rating }}</td> <td>
{{ HTML.anchor('/discipline/' ~ id ~ '/rate',
'☞<div class = ' ~ typeClasses[rate.Type] ~ '>' ~ rate.rating ~ '</div>',
{
'title': Disciplines[id].GlobalName,
'target': '_blank'
})|raw }}
</td>
{% else %} {% else %}
<td class="absent_rate"> - </td> <td class="absent_rate">
-
</td>
{% endif %}
{% endfor %}
{% for disc in Disciplines %}
{% if not disc.IsGlobal %}
{% set id = -disc.CompoundDiscID ?: disc.ID %}
{% set rate = Rates[stud.ID][id] %}
{% if rate %}
<td class="{{ typeClasses[rate.Type] }}">{{ rate.rating }}</td>
{% else %}
<td class="absent_rate"> -</td>
{% endif %}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</tr> </tr>
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment