| Version 3 (modified by , 2 weeks ago) ( diff ) |
|---|
UC007 - Запишување на семестар
Иницијален актер: Студент
Други актери: -
Студентот сака да запише нов семестар и да избере точно пет предмети од својата студиска програма. Целта е креиран запишан семестар со петте избрани предмети, на секој од нив доделен професор кој тој семестар го предава предметот.
Сценарио
- Студентот ја отвора страницата Семестри и избира Запиши семестар.
- Системот ги презема активните семестри во кои студентот сè уште не е запишан.
SELECT a.id, a.year, a.type FROM project.active_semesters a WHERE NOT EXISTS ( SELECT 1 FROM project.enrolled_semesters es WHERE es.user_id = 3 AND es.semester_id = a.id ) ORDER BY a.year, (a.type = 'summer');
- Системот ги презема предметите кои ги нуди избраната студиска програма, подредени по семестарот во кој се слушаат.
SELECT s.id, s.code, s.name, s.awarded_credits, ms.mandatory_semester FROM project.major_subjects ms JOIN project.subjects s ON s.id = ms.subject_id WHERE ms.major_id = 2 ORDER BY ms.mandatory_semester, s.name;
- Системот прикажува формулар со избор на семестар, избор на студиска програма и листа на предмети со полиња за штиклирање. Бројачот покажува колку предмети се избрани, а копчето за потврда е неактивно сè додека не се избрани точно пет.
- Студентот избира семестар, програма и пет предмети, па го потврдува запишувањето.
- Системот отвора трансакција и го креира запишаниот семестар.
INSERT INTO project.enrolled_semesters (user_id, quota, major_id, semester_id, created_at, last_change) VALUES (3, 'drzavna', 2, 3, now(), now()) RETURNING id;
- Системот ги додава петте предмети на новиот запишан семестар. За секој предмет професорот се презема од professour_subjects. Бидејќи ист предмет во ист семестар може да го предаваат повеќе професори, се избира оној кој засега има најмалку студенти на тој предмет, а идентификаторот се користи само за разрешување при ист број студенти.
INSERT INTO project.semesters_subjects (enrolled_semesters_id, subjects_id, professor_id, signature) SELECT e.id, v.subject_id, (SELECT ps.prof_id FROM project.professour_subjects ps WHERE ps.subject_id = v.subject_id AND ps.active_semester_id = e.semester_id ORDER BY (SELECT count(*) FROM project.semesters_subjects ss2 JOIN project.enrolled_semesters es2 ON es2.id = ss2.enrolled_semesters_id WHERE ss2.subjects_id = v.subject_id AND ss2.professor_id = ps.prof_id AND es2.semester_id = e.semester_id) ASC, ps.prof_id ASC LIMIT 1), FALSE FROM project.enrolled_semesters e, (VALUES (1), (9), (10), (11), (12)) AS v(subject_id) WHERE e.user_id = 3 AND e.semester_id = 3;
- Системот ја потврдува трансакцијата и се враќа на листата на семестри, каде новиот семестар е веќе видлив.
Алтернативни текови
- 5а. Избрани се помалку или повеќе од пет предмети - системот не го дозволува испраќањето на формуларот.
- 6а. Студентот веќе е запишан во тој семестар - ограничувањето UNIQUE (user_id, semester_id) го отфрла записот и системот прикажува порака.
- 7а. За некој предмет нема професор во тој семестар - вредноста за professor_id би била NULL, што ограничувањето NOT NULL го спречува, па целата трансакција се враќа назад.
Забелешки
- Чекорите 6 и 7 мораат да бидат во иста трансакција, за да не остане запишан семестар без предмети.
- Распоредувањето на професор е рамномерно: студентите се распределуваат по професорите кои го предаваат предметот, наместо секој да добие ист професор.
Note:
See TracWiki
for help on using the wiki.
