| | 1 | = UseCaseC - Тренер |
| | 2 | |
| | 3 | === UseCaseC01 – Преглед на неделен внес на храна на клиент |
| | 4 | * Актер кој го иницира: Тренер |
| | 5 | * Други актери: Редовен корисник (клиентот) |
| | 6 | **Опис:** Тренерот проверува што реално консумирал клиентот во текот на една недела, ден по ден, со цел советите што ги дава да се засноваат на внесени податоци, наместо на она што клиентот го памети. |
| | 7 | |
| | 8 | * Tренерот ја избира опцијата „Извештај за клиент“ и ја внесува е-поштата на клиентот и неделата. |
| | 9 | * Системот го прикажува дневниот внес на енергија за таа недела. |
| | 10 | {{{ |
| | 11 | SELECT ip.date_time::date AS day, |
| | 12 | ROUND(SUM(ip.kcal)) AS kcal_consumed, |
| | 13 | COUNT(*) AS meals_logged |
| | 14 | FROM intake_planner ip |
| | 15 | WHERE ip.user_email = :client_email |
| | 16 | AND ip.is_consumed = TRUE |
| | 17 | AND ip.date_time >= :week_start |
| | 18 | AND ip.date_time < :week_start + INTERVAL '7 days' |
| | 19 | GROUP BY 1 |
| | 20 | ORDER BY 1; |
| | 21 | }}} |
| | 22 | |
| | 23 | * Tренерот отвора одреден ден за да види од кои оброци се состои. |
| | 24 | {{{ |
| | 25 | SELECT ip.date_time, ip.notes, r.name AS meal, |
| | 26 | ROUND(r.kcal_sum / r.servings) AS kcal_per_portion |
| | 27 | FROM intake_planner ip |
| | 28 | LEFT JOIN intake_planner_save_to_list_post sp ON sp.planner_id = ip.id |
| | 29 | LEFT JOIN post p ON p.id = sp.post_id |
| | 30 | LEFT JOIN recipe r ON r.id = p.recipe_id |
| | 31 | WHERE ip.user_email = :client_email |
| | 32 | AND ip.date_time::date = :day |
| | 33 | ORDER BY ip.date_time; |
| | 34 | }}} |
| | 35 | * Системот прикажува кои макронутриенти ги обезбедиле оброците на клиентот во текот на таа недела (полесно изведливо апликативно). |
| | 36 | {{{ |
| | 37 | SELECT n.description AS nutrient, n.unit, |
| | 38 | ROUND(SUM(icn.quantity * rci.ingredient_quantity / 100.0 / r.servings), 1) AS total |
| | 39 | FROM intake_planner ip |
| | 40 | JOIN intake_planner_save_to_list_post sp ON sp.planner_id = ip.id |
| | 41 | JOIN post p ON p.id = sp.post_id |
| | 42 | JOIN recipe r ON r.id = p.recipe_id |
| | 43 | JOIN recipe_contains_ingredient rci ON rci.recipe_id = r.id |
| | 44 | JOIN ingredient_contains_nutrient icn ON icn.ingredient_name = rci.ingredient_name |
| | 45 | JOIN nutrient n ON n.id = icn.nutrient_id |
| | 46 | WHERE ip.user_email = :client_email |
| | 47 | AND ip.is_consumed = TRUE |
| | 48 | AND n.type = 'macro' |
| | 49 | AND ip.date_time >= :week_start |
| | 50 | AND ip.date_time < :week_start + INTERVAL '7 days' |
| | 51 | GROUP BY n.description, n.unit |
| | 52 | ORDER BY n.description; |
| | 53 | }}} |
| | 54 | * Tренерот пишува повратна информација како коментар на една од објавите на клиентот. |
| | 55 | {{{ |
| | 56 | INSERT INTO comment (description, post_id, created_by) |
| | 57 | VALUES (:description, :post_id, :trainer_email); |
| | 58 | }}} |
| | 59 | |
| | 60 | === UseCaseC02 – Следење на биометрискиот напредок на клиентот |
| | 61 | * Актер кој го иницира: Тренер |
| | 62 | * Други актери: Редовен корисник (клиентот) |
| | 63 | **Опис:** Тренерот следи како се менувале тежината и телесниот состав на клиентот во одреден временски период, со цел да процени дали тековниот план дава резултати. |
| | 64 | |
| | 65 | * Тренерот ја избира опцијата „Напредок“ за одреден клиент. |
| | 66 | * Системот го прикажува секое мерење заедно со промената во однос на претходното мерење. |
| | 67 | {{{ |
| | 68 | SELECT b.date, b.weight, b.muscle_fat_ratio, |
| | 69 | ROUND(b.weight - LAG(b.weight) OVER (ORDER BY b.date), 1) AS weight_change, |
| | 70 | ROUND(b.weight / ((b.height / 100.0) * (b.height / 100.0)), 1) AS bmi |
| | 71 | FROM biometrics b |
| | 72 | WHERE b.user_email = :client_email |
| | 73 | ORDER BY b.date; |
| | 74 | }}} |
| | 75 | * Системот ја прикажува вкупната промена за целиот временски период. |
| | 76 | {{{ |
| | 77 | SELECT MIN(date) AS from_date, MAX(date) AS to_date, |
| | 78 | ROUND(MAX(weight) - MIN(weight), 1) AS weight_span, |
| | 79 | COUNT(*) AS measurements |
| | 80 | FROM biometrics |
| | 81 | WHERE user_email = :client_email; |
| | 82 | }}} |
| | 83 | * Тренерот го споредува трендот на тежината со енергијата што клиентот ја внесувал во истиот период, за да утврди дали внесот ја објаснува промената. |
| | 84 | |
| | 85 | === UseCaseC03 – Објавување рецепт за одредено диетално ограничување |
| | 86 | * Актер кој го иницира: Тренер |
| | 87 | * Други актери: Редовен корисник (клиентите кои го следат почетниот приказ) |
| | 88 | **Опис:** Тренерот креира рецепт наменет за специфично диетално барање, на пример без лактоза или за дијабетичари, и го објавува за клиентите кои го филтрираат почетниот приказ според тоа ограничување да можат да го пронајдат. |
| | 89 | |
| | 90 | * Тренерот ја избира опцијата „Креирај рецепт“ и ги означува диетално ограничувања на кои рецептот одговара. |
| | 91 | * Системот го внесува рецептот и неговите состојки исто како во UseCaseА01. |
| | 92 | * Системот го означува рецептот со избраните ограничувања. |
| | 93 | {{{ |
| | 94 | INSERT INTO recipe_contains_restriction (recipe_id, restriction_id) |
| | 95 | SELECT :recipe_id, id |
| | 96 | FROM restriction |
| | 97 | WHERE type = :restriction_type; |
| | 98 | }}} |
| | 99 | |
| | 100 | * Тренерот го објавува рецептот на почетната страница. |
| | 101 | {{{ |
| | 102 | INSERT INTO post (is_private, is_favourite, status, created_by, recipe_id) |
| | 103 | VALUES (FALSE, FALSE, 'published', :trainer_email, :recipe_id); |
| | 104 | }}} |
| | 105 | |
| | 106 | * Клиентот го филтрира почетниот приказ според диетално ограничување кое го следи (полесно изведено апликативно). |
| | 107 | {{{ |
| | 108 | SELECT r.name, ROUND(r.kcal_sum / r.servings) AS kcal_per_portion, |
| | 109 | u.username AS author |
| | 110 | FROM post p |
| | 111 | JOIN recipe r ON r.id = p.recipe_id |
| | 112 | JOIN "user" u ON u.email = p.created_by |
| | 113 | WHERE p.status = 'published' |
| | 114 | AND p.is_private = FALSE |
| | 115 | AND EXISTS ( |
| | 116 | SELECT 1 |
| | 117 | FROM recipe_contains_restriction rcr |
| | 118 | JOIN restriction res ON res.id = rcr.restriction_id |
| | 119 | WHERE rcr.recipe_id = r.id |
| | 120 | AND res.type = :restriction_type |
| | 121 | ) |
| | 122 | AND NOT EXISTS ( |
| | 123 | SELECT 1 |
| | 124 | FROM recipe_contains_restriction rcr |
| | 125 | JOIN restriction res ON res.id = rcr.restriction_id |
| | 126 | WHERE rcr.recipe_id = r.id |
| | 127 | AND res.description = ANY(:allergens_to_avoid) |
| | 128 | ) |
| | 129 | ORDER BY kcal_per_portion; |
| | 130 | }}} |
| | 131 | |
| | 132 | === [https://develop.finki.ukim.mk/projects/nutritioneer/wiki/UseCaseModel ⬅️Назад кон општ преглед] |