= Приказ на сите услуги што ги нуди салонот == Актери * Најавен или ненајавен корисник == Чекор 1 Корисникот кликнува на копчето „Services“ во навигацијата. == Чекор 2 Системот ги вчитува сите категории и услугите што припаѓаат на нив преку SQL погледот `v_services_grouped_by_category`: {{{ SELECT category_id, category_name, services FROM v_services_grouped_by_category ORDER BY category_id; }}} Овој поглед ги агрегира услугите по категории и ги прикажува нивните цени, времетраење, просечна оцена, број на рецензии и целосната листа на рецензии (reviews). == Чекор 3 Системот проверува дали табелата `Package` ја содржи колоната `total_price`, што е потребно за пресметка на крајната цена на секој пакет: {{{ SELECT 1 FROM information_schema.columns WHERE table_name = 'package' AND column_name = 'total_price' LIMIT 1; }}} == Чекор 4 Системот ги вчитува сите пакети и услугите што ги содржат пакетите, вклучувајќи попустена цена по услуга и пресметана вкупна цена: {{{ SELECT p.package_id, p.name AS package_name, p.max_usage, ${totalPriceExpr}::numeric AS total_price, s.service_id, s.name AS service_name, ps.discounted_price FROM Package p LEFT JOIN LATERAL ( SELECT COALESCE(SUM(ps2.discounted_price), 0)::numeric AS calc_total_price FROM PackageService ps2 WHERE ps2.package_id = p.package_id ) package_price ON true LEFT JOIN PackageService ps ON ps.package_id = p.package_id LEFT JOIN Service s ON s.service_id = ps.service_id ORDER BY p.package_id, s.name; }}} == Чекор 5 Системот ја прикажува страницата „Services“, која ги содржи: * сите категории, * сите услуги во секоја категорија, * деталите за услуги (име, цена, времетраење, број на рецензии и комплетен список на рецензии), * сите достапни пакети со нивната пресметана цена и детали за услугите во нив. [[Image(showservices-1.jpg, width=600px)]]