== UC007 - Запишување на семестар '''Иницијален актер:''' Студент '''Други актери:''' - Студентот сака да запише нов семестар и да избере точно пет предмети од својата студиска програма. Целта е креиран запишан семестар со петте избрани предмети, на секој од нив доделен професор кој тој семестар го предава предметот. === Сценарио 1. Студентот ја отвора страницата '''Семестри''' и избира '''Запиши семестар'''. 2. Системот ги презема активните семестри во кои студентот сè уште не е запишан. {{{#!sql 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'); }}} 3. Системот ги презема предметите кои ги нуди избраната студиска програма, подредени по семестарот во кој се слушаат. {{{#!sql 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; }}} 4. Системот прикажува формулар со избор на семестар, избор на студиска програма и листа на предмети со полиња за штиклирање. Бројачот покажува колку предмети се избрани, а копчето за потврда е неактивно сè додека не се избрани точно пет. 5. Студентот избира семестар, програма и пет предмети, па го потврдува запишувањето. 6. Системот отвора трансакција и го креира запишаниот семестар. {{{#!sql 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; }}} 7. Системот ги додава петте предмети на новиот запишан семестар. За секој предмет професорот се презема од professour_subjects, односно од распоредот кој професор го предава тој предмет во тој семестар. {{{#!sql INSERT INTO project.semesters_subjects (enrolled_semesters_id, subjects_id, professor_id, signature) SELECT e.id, v.subject_id, (SELECT min(ps.prof_id) FROM project.professour_subjects ps WHERE ps.subject_id = v.subject_id AND ps.active_semester_id = e.semester_id), 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; }}} 8. Системот ја потврдува трансакцијата и се враќа на листата на семестри, каде новиот семестар е веќе видлив. === Алтернативни текови * '''5а.''' Избрани се помалку или повеќе од пет предмети - системот не го дозволува испраќањето на формуларот. * '''6а.''' Студентот веќе е запишан во тој семестар - ограничувањето UNIQUE (user_id, semester_id) го отфрла записот и системот прикажува порака. * '''7а.''' За некој предмет нема професор во тој семестар - вредноста за professor_id би била NULL, што ограничувањето NOT NULL го спречува, па целата трансакција се враќа назад. === Забелешки * Чекорите 6 и 7 мораат да бидат во иста трансакција, за да не остане запишан семестар без предмети.