= UseCaseImplementations = || ИД || Use Case || Опис || || 1 || Регистрација на нов корисник || Креирање нов кориснички профил со внес на податоци || || 2 || Најава на корисник || Влез во системот со корисничко име и лозинка || || 3 || Преглед на сите продукти || Приказ на сите достапни продукти во системот || || 4 || Филтрирање на продукти || Пребарување според име, категорија, сличност и други критериуми || || 5 || Преглед детали за еден продукт || Приказ на детални информации за избран продукт || || 6 || Додавање продукт во листа || Корисникот додава продукт во своја листа || || 7 || Креирање нова листа на продукти || Корисникот креира нова листа за организација на продукти || || 8 || Преглед на сите листи на корисникот || Приказ на сите листи креирани од корисникот || || 9 || Уредување/бришење листа || Можност за модификација или бришење на постоечка листа || || 10 || Додавање продукт во омилени || Корисникот додава продукт во листата на омилени продукти || || 11 || Преглед на омилени продукти || Приказ на сите продукти означени како омилени || || 12 || Отстранување продукт од омилени || Можност за бришење продукт од листата на омилени || || 13 || Статистика/агрегација на продукти || Прикажување на анализи и рангирања поврзани со продукти || || 14 || Сортирање || Прикажување на продукти според степен на сличност || || 15 || Приказ на флаери за продукти кои се на попуст || Приказ на сите продукти кои се на попуст во конкретен маркет || || 16 || Пребарување продукти со прилагодлив алгоритам || Пребарување според зборови со поддршка за кирилица, латиница и печатни грешки || == ИД 1 - Регистрација на нов корисник == Ако корисникот испрати податоци (POST), формуларот се валидира; ако е валиден, се креира нов корисник и се зачувува во базата. Потоа корисникот се аутентицира и, ако е успешна аутентикацијата, автоматски се логира и се пренасочува на почетната страница. Ако барањето не е POST, се прикажува празен регистрациски формулар. [[Image(registracija_kod.png)]] == ИД 2 - Најава на корисник == За регистрацијата е креиран URL кој го поврзува register view-то со соодветниот шаблон. Формуларот RegisterForm се користи за внес на корисничките податоци и нивна валидација. По успешно пополнување и зачувување на податоците, корисникот автоматски се логира, слично како кај LoginView, и се пренасочува на почетната страница. [[Imagenajava_kod1.png​)]] [[Imagenajava_kod2.png​)]] == ИД 3 - Преглед на сите продукти == Преглед на сите продукти: ова view ја прикажува листата на сите продукти со опции за пребарување, филтрирање по категории, продавници, цена и попусти, сортирање по различни критериуми, пагинација, прикажување слични продукти и одбележување на омилените продукти за логирани корисници. [[Image(productlist_kod1.png)]] [[Image(productlist_kod2.png)]] [[Image(productlist_kod3.png)]] [[Image(productlist_kod4.png)]] [[Image(productlist_kod5.png)]] == ИД 4 - Филтрирање на продукти == Овој JavaScript го управува филтерот за продукти. Секциите со филтри можат да се отвораат и затвораат, а при кликање надвор од филтрите тие автоматски се затвораат. Слајдерот за максимална цена ја прикажува моменталната вредност во реално време, а кога корисникот менува категории, продавници или сортирање, формуларот се испраќа автоматски за да се апдејтира листата на продукти без рефреш на страницата. [[Image(filter_kod1.png)]] [[Image(filter_kod2.png)]] [[Image(filter_kod3.png)]] == ИД 5 - Преглед детали за еден продукт == Ова view ја прикажува деталната страница на еден продукт. Се вчитува продуктот по неговото ID, се извлекува историјата на цените од базата за креирање график, и се наоѓаат слични продукти. Сите овие податоци се проследуваат на шаблонот product_detail.html за прикажување на информациите и графикот со цените. [[Image(productdetail_kod.png)]] == ИД 6 - Додавање продукт во листа == Овој JavaScript го управува додавањето продукти во корисничката листа. Кога корисникот кликне на копчето ‘add to list’, се зема ID-то на продуктот и се праќа POST барање до /add-to-list/ преку fetch со JSON тело и CSRF токен за заштита. Серверот враќа JSON со статус; ако е успешен, се прикажува известување дека продуктот е додаден, а ако не, се прикажува грешка. На овој начин целата операција се случува без рефреш на страницата, што ја прави интеракцијата побрза и поинтерактивна. [[Image(dodadivolista_kod1.png)]] [[Image(dodadivolista_kod2.png)]] == ИД 7 - Креирање нова листа на продукти == Овој JavaScript управува создавањето на нови листи: при кликање на копчето за креирање се прикажува формуларот, а при кликање на ‘откажи’ се сокрива. Формуларот за листа се валидара локално (име не смее да е празно или подолго од 100 карактери) и се испраќа преку AJAX повик без рефреш на страницата. [[Image(kreirajlista_kod1.png)]] [[Image(kreirajlista_kod2.png)]] [[Image(kreirajlista_kod3.png)]] == ИД 8 - Преглед на сите листи на корисникот == Ова view го прикажува сите листи на тековниот корисник. Ако корисникот е логирани, се вчитуваат неговите листи од базата и се прикажуваат во шаблонот lists.html. [[Image(prikazlisti_kod.png)]] == ИД 9 - Уредување/бришење листа == Овој view овозможува корисникот да ја избрише конкретната шопинг листа. Серверот најпрво ја наоѓа листата што соодветствува на дадениот list_id и припаѓа на тековниот корисник, а потоа, ако е примено POST барање, ја брише од базата и го пренасочува корисникот на прегледот на останатите листи. [[Image(brishenjelista_kod.png)]] == ИД 10 - Додавање продукт во омилени == Овој use case овозможува корисникот да додава или отстранува производи од својата листа на омилени. Кога корисникот кликне на иконата за омилени, JavaScript-от праќа POST барање до серверот, кој проверува дали производот веќе е омилен и соодветно го додава или отстранува од базата. Статусот на омилените производи се прикажува веднаш на интерфејсот со промена на иконата и бојата, а ако корисникот е на страницата „Омилени“, се освежува листата за да се прикаже актуелната содржина. [[Image(favorite_kod1.png​)]] [[Image(favorite_kod2.png​)]] [[Image(togglefav_kod1.png)]] [[Image(togglefav_kod2.png)]] [[Image(togglefav_kod3.png)]] == ИД 11 - Преглед на омилени продукти == Овој код ја прикажува листата на омилени продукти за тековниот најавен корисник. Тој ги влече омилените продукти од базата и ги предава на шаблонот favorites.html за прикажување на страницата. [[Image(pregledfav_kod1.png)]] == ИД 12 - Отстранување продукт од омилени == [[Image(otstrani_omileni.jpg)]] == ИД 13 - Статистика/агрегација на продукти == Функцијата stats_view ја прикажува статистиката за цените на одреден производ во избрана продавница. Таа ја пребарува базата според името на производот и продавницата, наоѓа точен натпревар или слични производи, и ги зема податоците за цените во зададен временски период. Потоа пресметува тековна, минимална, максимална и просечна цена, и ги предава овие информации за прикажување во шаблонот (stats.html). [[Image(stats_kod1.png)]] [[Image(stats_kod2.png)]] [[Image(stats_kod3.png)]] [[Image(stats_kod4.png)]] [[Image(stats_kod5.png)]] [[Image(stats_kod6.png)]] == ИД 14 - Сортирање == Кога корисникот избира нов критериум од select полето, се ажурира URL-от со новиот параметар sort и ресетира page на 1. На тој начин страницата се освежува и прикажува продукти сортирани според избраниот критериум без потреба за повторно рачно пребарување. [[Image(sort_kod.png)]] == ИД 15 - Приказ на флаери за продукти кои се на попуст == Овој скрипт управува со модален прозорец кој прикажува сите продукти на попуст за одредена продавница. Кога корисникот кликне на „Види ги сите“ копчето, се испраќа AJAX барање до backend (/get-store-products/) за да се добијат продуктите на попуст. Добиените продукти се прикажуваат динамички во модалниот прозорец со слики, имиња, стара и нова цена и процент на попуст. Доколку нема продукти на попуст, се прикажува порака „Нема достапни попусти“. [[Image(flaeri_kod1.png​)]] [[Image(flaeri_kod2.png​)]] [[Image(flaeri_kod3.png​)]] == ИД 16 - Пребарување продукти со прилагодлив алгоритам == За овој use case се користи комбинација од backend и frontend логика. На backend-от, функцијата get_similar_products (Python) ги наоѓа сличните продукти според име и категорија користејќи SentenceTransformer за векторско претставување на имињата и пресметка на косинусна сличност. Дополнително се земаат предвид клучни зборови, бонус за специфични категории и различни продавници, а резултатите се сортираат по вкупен скор за да се прикажат најрелевантните продукти. На frontend-от, JavaScript кодот ги нормализира пребарувањата на корисникот со преведување од латиница во кирилица и автоматска корекција на честите печатни грешки. Ова овозможува пребарување без разлика дали корисникот внесува текст на латиница, кирилица или со грешки, а резултатот се испраќа до backend-от за да се прикажат соодветните продукти. [[Image(alg_kod1.png)]] [[Image(alg_kod2.png)]] [[Image(alg_kod3.png)]] [[Image(sim_kod1.png)]] [[Image(sim_kod2.png)]] [[Image(sim_kod3.png)]] [[Image(sim_kod4.png)]]