Changes between Initial Version and Version 1 of UCC


Ignore:
Timestamp:
09/15/26 03:00:06 (2 weeks ago)
Author:
201165
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • UCC

    v1 v1  
     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 ⬅️Назад кон општ преглед]