| | 1 | = Имплементација на случај на употреба 0003 - Поднесување на пријава = |
| | 2 | |
| | 3 | '''Иницијатор:''' Граѓанин |
| | 4 | |
| | 5 | '''Други актери:''' Мапски сервис (во прототипот координатите се внесуваат рачно) |
| | 6 | |
| | 7 | Граѓанинот пријавува нов комунален проблем со опис, категорија, локација и фотографии. Пред поднесувањето, системот проверува дали во близина веќе постои активна пријава од истата категорија. Пријавата, фотографиите и првиот запис во историјата на статуси се зачувуваат во една SQL команда. |
| | 8 | |
| | 9 | == Сценарио == |
| | 10 | |
| | 11 | 1. Корисникот ја стартува апликацијата и ја избира улогата „Граѓанин“. |
| | 12 | |
| | 13 | [[Image(UC0003_01_uloga.png)]] |
| | 14 | |
| | 15 | 2. Системот ги прикажува граѓаните, а корисникот се најавува со избор од листата: |
| | 16 | {{{#!sql |
| | 17 | SELECT citizen_id, full_name, email FROM citizens ORDER BY full_name; |
| | 18 | }}} |
| | 19 | |
| | 20 | [[Image(UC0003_02_najava.png)]] |
| | 21 | |
| | 22 | 3. Граѓанинот избира „Поднеси нова пријава“. |
| | 23 | |
| | 24 | [[Image(UC0003_03_meni.png)]] |
| | 25 | |
| | 26 | 4. Системот ги прикажува категориите. Граѓанинот избира категорија и го внесува описот на проблемот: |
| | 27 | {{{#!sql |
| | 28 | SELECT category_id, name FROM categories ORDER BY name; |
| | 29 | }}} |
| | 30 | |
| | 31 | [[Image(UC0003_04_kategorija_opis.png)]] |
| | 32 | |
| | 33 | 5. Граѓанинот избира начин на внесување на локацијата и ги внесува адресата и координатите. Системот проверува дали координатите се во дозволениот опсег. |
| | 34 | |
| | 35 | [[Image(UC0003_05_lokacija.png)]] |
| | 36 | |
| | 37 | 6. Системот бара активни пријави од истата категорија во близина и ги прикажува. Граѓанинот потврдува дека сепак сака да продолжи: |
| | 38 | {{{#!sql |
| | 39 | SELECT r.report_id, r.description, r.status, r.created_at |
| | 40 | FROM reports r |
| | 41 | WHERE r.category_id = %s |
| | 42 | AND r.status NOT IN ('resolved', 'rejected') |
| | 43 | AND r.latitude BETWEEN %s - 0.001 AND %s + 0.001 |
| | 44 | AND r.longitude BETWEEN %s - 0.001 AND %s + 0.001; |
| | 45 | }}} |
| | 46 | |
| | 47 | [[Image(UC0003_06_slicni_prijavi.png)]] |
| | 48 | |
| | 49 | 7. Граѓанинот ги внесува имињата на фотографиите. Системот прикажува преглед, а граѓанинот ја потврдува пријавата. |
| | 50 | |
| | 51 | [[Image(UC0003_07_pregled.png)]] |
| | 52 | |
| | 53 | 8. Системот ги зачувува пријавата, фотографиите и статусот „submitted“ и прикажува потврда: |
| | 54 | {{{#!sql |
| | 55 | WITH new_report AS ( |
| | 56 | INSERT INTO reports (description, location_text, latitude, longitude, |
| | 57 | category_id, citizen_id) |
| | 58 | VALUES (%s, %s, %s, %s, %s, %s) |
| | 59 | RETURNING report_id, created_at |
| | 60 | ), new_photos AS ( |
| | 61 | INSERT INTO photos (image_url, report_id) |
| | 62 | SELECT '/uploads/reports/' || report_id || '/' || f, report_id |
| | 63 | FROM new_report, unnest(%s::text[]) AS f |
| | 64 | ), new_log AS ( |
| | 65 | INSERT INTO status_logs (status, changed_at, report_id, worker_id) |
| | 66 | SELECT 'submitted', created_at, report_id, NULL |
| | 67 | FROM new_report |
| | 68 | ) |
| | 69 | SELECT report_id FROM new_report; |
| | 70 | |
| | 71 | SELECT r.report_id, c.name AS category, r.description, r.location_text, |
| | 72 | r.status, r.priority, r.created_at, |
| | 73 | (SELECT COUNT(*) FROM photos p WHERE p.report_id = r.report_id) AS photos |
| | 74 | FROM reports r |
| | 75 | JOIN categories c ON c.category_id = r.category_id |
| | 76 | WHERE r.report_id = %s; |
| | 77 | }}} |
| | 78 | |
| | 79 | [[Image(UC0003_08_potvrda.png)]] |
| | 80 | |
| | 81 | Ознаката %s означува параметар кој апликацијата го предава на базата (на пример избраната категорија и внесениот опис). |