| 6 | | === Чекори |
| 7 | | 1. Студентот навигира до страната „Пријави“ |
| 8 | | 2. Студентот избира испитна сесија |
| 9 | | 3. Системот ги прикажува предметите достапни за пријавување |
| 10 | | 4. Студентот избира предмет и кликнува на копчето „Пријави“ |
| 11 | | 5. Системот креира нова пријава за испит за избраниот предмет и сесија |
| 12 | | 6. На студентот му се прикажува потврда со сервисен и архивски број |
| | 5 | '''Други актери:''' - |
| | 6 | |
| | 7 | Студентот сака да запише нов семестар и да избере точно пет предмети од својата |
| | 8 | студиска програма. Целта е креиран запишан семестар со петте избрани предмети, |
| | 9 | на секој од нив доделен професор кој тој семестар го предава предметот. |
| | 10 | |
| | 11 | === Сценарио |
| | 12 | |
| | 13 | 1. Студентот ја отвора страницата '''Семестри''' и избира '''Запиши семестар'''. |
| | 14 | |
| | 15 | 2. Системот ги презема активните семестри во кои студентот сè уште не е запишан. |
| | 16 | {{{#!sql |
| | 17 | SELECT a.id, a.year, a.type |
| | 18 | FROM project.active_semesters a |
| | 19 | WHERE NOT EXISTS ( |
| | 20 | SELECT 1 FROM project.enrolled_semesters es |
| | 21 | WHERE es.user_id = 3 AND es.semester_id = a.id |
| | 22 | ) |
| | 23 | ORDER BY a.year, (a.type = 'summer'); |
| | 24 | }}} |
| | 25 | |
| | 26 | 3. Системот ги презема предметите кои ги нуди избраната студиска програма, подредени по семестарот во кој се слушаат. |
| | 27 | {{{#!sql |
| | 28 | SELECT s.id, s.code, s.name, s.awarded_credits, ms.mandatory_semester |
| | 29 | FROM project.major_subjects ms |
| | 30 | JOIN project.subjects s ON s.id = ms.subject_id |
| | 31 | WHERE ms.major_id = 2 |
| | 32 | ORDER BY ms.mandatory_semester, s.name; |
| | 33 | }}} |
| | 34 | |
| | 35 | 4. Системот прикажува формулар со избор на семестар, избор на студиска програма и листа на предмети со полиња за штиклирање. Бројачот покажува колку предмети се избрани, а копчето за потврда е неактивно сè додека не се избрани точно пет. |
| | 36 | |
| | 37 | 5. Студентот избира семестар, програма и пет предмети, па го потврдува запишувањето. |
| | 38 | |
| | 39 | 6. Системот отвора трансакција и го креира запишаниот семестар. |
| | 40 | {{{#!sql |
| | 41 | INSERT INTO project.enrolled_semesters |
| | 42 | (user_id, quota, major_id, semester_id, created_at, last_change) |
| | 43 | VALUES (3, 'drzavna', 2, 3, now(), now()) |
| | 44 | RETURNING id; |
| | 45 | }}} |
| | 46 | |
| | 47 | 7. Системот ги додава петте предмети на новиот запишан семестар. За секој предмет професорот се презема од professour_subjects, односно од распоредот кој професор го предава тој предмет во тој семестар. |
| | 48 | {{{#!sql |
| | 49 | INSERT INTO project.semesters_subjects |
| | 50 | (enrolled_semesters_id, subjects_id, professor_id, signature) |
| | 51 | SELECT e.id, |
| | 52 | v.subject_id, |
| | 53 | (SELECT min(ps.prof_id) |
| | 54 | FROM project.professour_subjects ps |
| | 55 | WHERE ps.subject_id = v.subject_id |
| | 56 | AND ps.active_semester_id = e.semester_id), |
| | 57 | FALSE |
| | 58 | FROM project.enrolled_semesters e, |
| | 59 | (VALUES (1), (9), (10), (11), (12)) AS v(subject_id) |
| | 60 | WHERE e.user_id = 3 AND e.semester_id = 3; |
| | 61 | }}} |
| | 62 | |
| | 63 | 8. Системот ја потврдува трансакцијата и се враќа на листата на семестри, каде новиот семестар е веќе видлив. |
| | 64 | |
| | 65 | === Алтернативни текови |
| | 66 | |
| | 67 | * '''5а.''' Избрани се помалку или повеќе од пет предмети - системот не го дозволува испраќањето на формуларот. |
| | 68 | * '''6а.''' Студентот веќе е запишан во тој семестар - ограничувањето UNIQUE (user_id, semester_id) го отфрла записот и системот прикажува порака. |
| | 69 | * '''7а.''' За некој предмет нема професор во тој семестар - вредноста за professor_id би била NULL, што ограничувањето NOT NULL го спречува, па целата трансакција се враќа назад. |
| | 70 | |
| | 71 | === Забелешки |
| | 72 | |
| | 73 | * Чекорите 6 и 7 мораат да бидат во иста трансакција, за да не остане запишан семестар без предмети. |