wiki:UseCase007

Version 2 (modified by 233149, 2 weeks ago) ( diff )

--

UC007 - Запишување на семестар

Иницијален актер: Студент

Други актери: -

Студентот сака да запише нов семестар и да избере точно пет предмети од својата студиска програма. Целта е креиран запишан семестар со петте избрани предмети, на секој од нив доделен професор кој тој семестар го предава предметот.

Сценарио

  1. Студентот ја отвора страницата Семестри и избира Запиши семестар.
  1. Системот ги презема активните семестри во кои студентот сè уште не е запишан.
    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');
    
  1. Системот ги презема предметите кои ги нуди избраната студиска програма, подредени по семестарот во кој се слушаат.
    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;
    
  1. Системот прикажува формулар со избор на семестар, избор на студиска програма и листа на предмети со полиња за штиклирање. Бројачот покажува колку предмети се избрани, а копчето за потврда е неактивно сè додека не се избрани точно пет.
  1. Студентот избира семестар, програма и пет предмети, па го потврдува запишувањето.
  1. Системот отвора трансакција и го креира запишаниот семестар.
    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;
    
  1. Системот ги додава петте предмети на новиот запишан семестар. За секој предмет професорот се презема од professour_subjects, односно од распоредот кој професор го предава тој предмет во тој семестар.
    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;
    
  1. Системот ја потврдува трансакцијата и се враќа на листата на семестри, каде новиот семестар е веќе видлив.

Алтернативни текови

  • 5а. Избрани се помалку или повеќе од пет предмети - системот не го дозволува испраќањето на формуларот.
  • 6а. Студентот веќе е запишан во тој семестар - ограничувањето UNIQUE (user_id, semester_id) го отфрла записот и системот прикажува порака.
  • 7а. За некој предмет нема професор во тој семестар - вредноста за professor_id би била NULL, што ограничувањето NOT NULL го спречува, па целата трансакција се враќа назад.

Забелешки

  • Чекорите 6 и 7 мораат да бидат во иста трансакција, за да не остане запишан семестар без предмети.
Note: See TracWiki for help on using the wiki.