= Имплементација на случај на употреба 0003 - Поднесување на пријава = '''Иницијатор:''' Граѓанин '''Други актери:''' Мапски сервис (во прототипот координатите се внесуваат рачно) Граѓанинот пријавува нов комунален проблем со опис, категорија, локација и фотографии. Пред поднесувањето, системот проверува дали во близина веќе постои активна пријава од истата категорија. Пријавата, фотографиите и првиот запис во историјата на статуси се зачувуваат во една SQL команда. == Сценарио == 1. Корисникот ја стартува апликацијата и ја избира улогата „Граѓанин“. [[Image(UC0003_01_uloga.png)]] 2. Системот ги прикажува граѓаните, а корисникот се најавува со избор од листата: {{{#!sql SELECT citizen_id, full_name, email FROM citizens ORDER BY full_name; }}} [[Image(UC0003_02_najava.png)]] 3. Граѓанинот избира „Поднеси нова пријава“. [[Image(UC0003_03_meni.png)]] 4. Системот ги прикажува категориите. Граѓанинот избира категорија и го внесува описот на проблемот: {{{#!sql SELECT category_id, name FROM categories ORDER BY name; }}} [[Image(UC0003_04_kategorija_opis.png)]] 5. Граѓанинот избира начин на внесување на локацијата и ги внесува адресата и координатите. Системот проверува дали координатите се во дозволениот опсег. [[Image(UC0003_05_lokacija.png)]] 6. Системот бара активни пријави од истата категорија во близина и ги прикажува. Граѓанинот потврдува дека сепак сака да продолжи: {{{#!sql SELECT r.report_id, r.description, r.status, r.created_at FROM reports r WHERE r.category_id = %s AND r.status NOT IN ('resolved', 'rejected') AND r.latitude BETWEEN %s - 0.001 AND %s + 0.001 AND r.longitude BETWEEN %s - 0.001 AND %s + 0.001; }}} [[Image(UC0003_06_slicni_prijavi.png)]] 7. Граѓанинот ги внесува имињата на фотографиите. Системот прикажува преглед, а граѓанинот ја потврдува пријавата. [[Image(UC0003_07_pregled.png)]] 8. Системот ги зачувува пријавата, фотографиите и статусот „submitted“ и прикажува потврда: {{{#!sql WITH new_report AS ( INSERT INTO reports (description, location_text, latitude, longitude, category_id, citizen_id) VALUES (%s, %s, %s, %s, %s, %s) RETURNING report_id, created_at ), new_photos AS ( INSERT INTO photos (image_url, report_id) SELECT '/uploads/reports/' || report_id || '/' || f, report_id FROM new_report, unnest(%s::text[]) AS f ), new_log AS ( INSERT INTO status_logs (status, changed_at, report_id, worker_id) SELECT 'submitted', created_at, report_id, NULL FROM new_report ) SELECT report_id FROM new_report; SELECT r.report_id, c.name AS category, r.description, r.location_text, r.status, r.priority, r.created_at, (SELECT COUNT(*) FROM photos p WHERE p.report_id = r.report_id) AS photos FROM reports r JOIN categories c ON c.category_id = r.category_id WHERE r.report_id = %s; }}} [[Image(UC0003_08_potvrda.png)]] Ознаката %s означува параметар кој апликацијата го предава на базата (на пример избраната категорија и внесениот опис).