Changes between Version 26 and Version 27 of DatabaseProgramming
- Timestamp:
- 06/15/26 22:22:15 (13 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
DatabaseProgramming
v26 v27 7 7 **Процедура за почеток на смена на возач** 8 8 9 Процедурата проверува дали постои id-то на возачот и VIN бројот кај возилото и фрла соодветен исклучот. Доколку возачот и возилото се валидни се додава нов запис за смена во табелата `Driver_Vehicle`. 9 Процедурата проверува дали постои id-то на возачот и VIN бројот кај возилото и фрла соодветен исклучот. Доколку возачот и возилото се валидни се додава нов запис за смена во табелата `Driver_Vehicle`. Оваа процедура ја имплементира бизнис логиката за најава на возачите на системот, со што тие официјално стануваат активни и достапни за преземање на патници. 10 10 11 11 {{{ … … 34 34 **Процедура за завршување на смена на возач** 35 35 36 Процедурата проверува дали постои id-то на возачот, доколку не постои фрла соодветен исклучок. Потоа се проверува дали возачот има точно една активна смена која не е завршена. На крај се ажурира записот во табелата `Driver_Vehicle` на тој начин што се поставува тековното време во колоната `time_to`. 36 Процедурата проверува дали постои id-то на возачот, доколку не постои фрла соодветен исклучок. Потоа се проверува дали возачот има точно една активна смена која не е завршена. На крај се ажурира записот во табелата `Driver_Vehicle` на тој начин што се поставува тековното време во колоната `time_to`. Во апликацијата, оваа логика се повикува кога возачот сака да се одјави од системот, означувајќи го крајот на неговото работно време. 37 37 38 38 {{{ … … 65 65 **Процедура за вработување на возач во компанија** 66 66 67 Процедурата проверува дали id-то на возачот е валидно, доколку не постои фрла соодветен исклучок. 67 Процедурата проверува дали id-то на возачот е валидно, доколку не постои фрла соодветен исклучок. Оваа процедура е дел од административниот модул на апликацијата и овозможува менаџирање на човечки ресурси, односно формално поврзување на возачот со конкретна такси компанија. 68 68 69 69 {{{ … … 89 89 **Процедура за вработување на диспечер во компанија** 90 90 91 Процедурата проверува дали id-то на диспечерот е валидно, доколку не постои фрла соодветен исклучок. 91 Процедурата проверува дали id-то на диспечерот е валидно, доколку не постои фрла соодветен исклучок. Се користи за управување со кадар во рамките на компанијата. Ова овозможува диспечерот да добие овластување за креирање и испраќање на понуди во таа компанија. 92 92 93 93 {{{ … … 113 113 **Процедура за отпуштање/завршување на договор на возач во компанија** 114 114 115 Процедурата прави две проверки. Првата проверка ја пребарува табелата Driver за id-то на возачот, доколку истото не постои се фрла соодветен исклучок. Потоа се проверува дали постои соодветен запис во табелата `EmploymentHistory` кој потврдува дека возачот е тековно вработен во компанијата. На крај се променува записот од табелата `EmploymentHistory` на тој начин што се става краен датум. 115 Процедурата прави две проверки. Првата проверка ја пребарува табелата Driver за id-то на возачот, доколку истото не постои се фрла соодветен исклучок. Потоа се проверува дали постои соодветен запис во табелата `EmploymentHistory` кој потврдува дека возачот е тековно вработен во компанијата. На крај се променува записот од табелата `EmploymentHistory` на тој начин што се става краен датум. Оваа процедура служи за прекинување на соработката, оневозможувајќи му на возачот понатаму да вози за таа компанија. 116 116 117 117 {{{ … … 147 147 **Процедура за отпуштање/завршување на договор на диспечер во компанија** 148 148 149 Процедурата прави две проверки. Првата проверка ја пребарува табелата `Dispatcher` за id-то на диспечарот, доколку истото не постои се фрла соодветен исклучок. Потоа се проверува дали постои соодветен запис во табелата `EmploymentHistory` кој потврдува дека деспечерот е тековно вработен во компанијата. На крај се променува записот од табелата `EmploymentHistory` на тој начин што се става краен датум. 149 Процедурата прави две проверки. Првата проверка ја пребарува табелата `Dispatcher` за id-то на диспечарот, доколку истото не постои се фрла соодветен исклучок. Потоа се проверува дали постои соодветен запис во табелата `EmploymentHistory` кој потврдува дека деспечерот е тековно вработен во компанијата. На крај се променува записот од табелата `EmploymentHistory` на тој начин што се става краен датум. Се користи за администрирање на правата на вработените, по извршувањето диспечерот ги губи сите привилегии за менаџирање со барањата на таа компанија. 150 150 151 151 {{{ … … 181 181 **Процедура за пишување на оцена** 182 182 183 Оваа процедурата се повикува кога корисник испраќа свој коментар и рејтинг за возењето откако ќе пристигне на дестинацијата. Се проверува дали постои запис во табелата Ride за соодветните `id_ride` и `id_customer` доколку не постои се фрла исклучок `Customer can not give a rating on a ride they do not have.`. 184 183 Оваа процедурата се повикува кога корисник испраќа свој коментар и рејтинг за возењето откако ќе пристигне на дестинацијата. Се проверува дали постои запис во табелата Ride за соодветните `id_ride` и `id_customer` доколку не постои се фрла исклучок `Customer can not give a rating on a ride they do not have.`. Имплементира логика за корисничка повратна информација, која е клучна за евалуација на квалитетот на такси услугата. 184 185 185 {{{ 186 186 create or replace procedure write_rating(rating numeric, comment text, id_ride int, id_customer int) … … 205 205 **Процедура за испраќање порака** 206 206 207 Пораките можат да бидат испратени од возачот или патникот и се однесуваат на едно возење. Доколку не постои возење за соодветните `id_ride` и `id_user` се фрла исклучок `User can not write a chat for a ride they do not have.`. 207 Пораките можат да бидат испратени од возачот или патникот и се однесуваат на едно возење. Доколку не постои возење за соодветните `id_ride` и `id_user` се фрла исклучок `User can not write a chat for a ride they do not have.`. Оваа процедура е главна во системот за чет помеѓу патникот и возачот за време на реализацијата на услугата. 208 208 209 209 {{{ … … 229 229 **Процедура за поднесување пријава** 230 230 231 Оваа процедура се повикува кога корисниците поднесуваат пријава за време на возењето. Тоа може да биде некоја поплака од типот брзо возење или скршнување од патот. Доколку не постои возење за соодветните `id_ride` и `user_id` се фрла исклучок `Customer can not write a report on a ride they do not have.`. 231 Оваа процедура се повикува кога корисниците поднесуваат пријава за време на возењето. Тоа може да биде некоја поплака од типот брзо возење или скршнување од патот. Доколку не постои возење за соодветните `id_ride` и `user_id` се фрла исклучок `Customer can not write a report on a ride they do not have.`. Се користи во модулот за безбедност и заштита на корисниците, овозможувајќи брза реакција на поддршката. 232 232 233 233 {{{ … … 253 253 **Процедура за креирање на барање за превоз** 254 254 255 Процедурата `make_request` се повикува кога корисникот креира ново барање за превоз. Најпрво се проверува дали постои корисникот со даденото `customer_id`, по што се валидираат координатите за почетната и крајната локација. Дополнително се проверуваат параметрите поврзани со бројот на патници, детски седишта и багаж, при што се фрлаат соодветни исклучоци доколку некоја вредност е невалидна. Исто така, процедурата проверува дали почетната и крајната локација не се исти. Доколку сите проверки се успешни, се додава нов запис во табелата `Request` со статус `pending`, а идентификаторот на новокреираното барање се враќа преку излезниот параметар `request_id`.255 Процедурата се повикува кога корисникот иницира ново барање за превоз, при што детало се валидираат координатите, бројот на патници, седишта за деца и багаж. Доколку сите бизнис правила се исполнети, се генерира нов запис во `Request` со почетен статус `pending` и се враќа неговиот ID. Ова е почетната точка на главниот тек во апликацијата, процесот на повикување такси возило. 256 256 257 257 {{{ … … 350 350 **Процедура за додавање на Waypoint на некое барање** 351 351 352 Процедурата `add_waypoint` се повикува кога корисникот сака да додаде попатна точка на постоечко барање за превоз. Најпрво се проверува дали постои барањето со даденото `request_id`, по што се валидираат координатите на waypoint-от. Дополнително се проверува дали истиот `waypoint` веќе е додаден за конкретното барање, при што се фрла соодветен исклучок доколку постои дупликат. Потоа се пресметува редниот број (`seqno`) на новиот `waypoint` врз основа на бројот на веќе постоечки waypoints за тоа барање. Доколку сите проверки се успешни, се додава нов запис во табелата `Waypoints`.352 Оваа процедура му овозможува на корисникот да додаде попатна дестинација (waypoint) на веќе креирано барање за превоз. Таа ги проверува географските опсези и спречува внес на дупликат локации, притоа автоматски пресметувајќи го редоследот (`seqno`). Ја имплементира бизнис логиката за сложени рути, овозможувајќи им на возачите однапред да го видат точниот план на движење. 353 353 354 354 {{{ … … 394 394 **Процедура за зпочнување на возење со такси** 395 395 396 Процедурата проверува дали постои id-то на понудата, доколку не постои фрла соодветен исклучок. Потоа се пронаоѓа најблискиот слободен возач кој е на активна смена . На крај се додава нов запис во табелата `Ride` со статус `in_progress`, а статусите на понудата и барањето се ажурираат во accepted и `in_progress`.396 Процедурата проверува дали постои id-то на понудата, доколку не постои фрла соодветен исклучок. Потоа се пронаоѓа најблискиот слободен возач кој е на активна смена и на крај се додава нов запис во табелата `Ride` со статус `in_progress`, а статусите на понудата и барањето се ажурираат во accepted и `in_progress`. Ова е критичен дел од бизнис логиката кој го означува физичкиот почеток на патувањето и транзицијата на возилото во зафатена состојба. 397 397 398 398 {{{ … … 473 473 ** Процедура за креирање понуда за одредено барање ** 474 474 475 Процедурата се повикува кога диспечерот креира нова понуда за одредено барање за превоз. Најпрво се проверува дали постои барање со даденото `request_id` и дали истото е во статус pending, при што се фрла соодветен исклучок доколку условот не е исполнет. Потоа се валидираат влезните параметри: цената мора да биде поголема од нула, а проценетото време на пристигнување (eta) мора да биде во иднина во однос на тековното време. Дополнително, процедурата проверува дали диспечерот и возачот се тековно вработени во истата компанија преку пребарување на нивните активни договори во табелата `EmploymentHistory`. Доколку сите проверки се успешни, се додава нов запис во табелата `Offer` со иницијален статус pending.475 Се повикува кога диспечерот креира понуда со цена и проценето време на пристигнување (`ETA`) за некое активно барање. Процедурата гарантира дека цената е позитивна, времето е во иднина и дека диспечерот и избраниот возач работат за иста компанија. Ја имплементира бизнис логиката за понуди, каде компаниите поднесуваат предлози кои патникот понатаму треба да ги разгледа. 476 476 477 477 {{{ … … 515 515 ** Процедура за прифаќање на понуда ** 516 516 517 Оваа процедура се повикува кога корисникот прифаќа одредена понуда за превоз. Таа го ажурира статусот на избраната понуда и на самото барање во `accepted`, додека сите останати конкурентни понуди за истото барање се одбиваат, односно нивниот статус се променува во `rejected`. 517 Оваа процедура се повикува кога корисникот прифаќа одредена понуда за превоз. Таа го ажурира статусот на избраната понуда и на самото барање во `accepted`, додека сите останати конкурентни понуди за истото барање се одбиваат, односно нивниот статус се променува во `rejected`. Ова ја завршува бизнис логиката на договарање на цената и условите за превоз. 518 518 519 519 {{{ … … 543 543 **Функција и тригер за проверка на достапност на возач** 544 544 545 Функцијата `ride_assign` враќа тригер кој фрла исклучок во случај возачот да е зафатен со друго возење во моментот на доделување на возач. Тригерот се извршува пред внес на запис во табелата `Ride`. 545 Функцијата `ride_assign` враќа тригер кој фрла исклучок во случај возачот да е зафатен со друго возење во моментот на доделување на возач. Тригерот се извршува пред внес на запис во табелата `Ride`. Во контекст на бизнис логиката, ова спречува преклопување на возењата и гарантира дека еден возач не може физички да извршува две патувања истовремено. 546 546 547 547 {{{ … … 562 562 **Функција и тригер кој спречува два пати доделување на активна смена на ист возач** 563 563 564 Функцијата проверува дали постои id-то на возачот и VIN бројот на возилото, при што фрла соодветен исклучок доколку некој од нив не е валиден. Дополнително, се проверува дали возачот е на смена. Тригерот се извршува пред внесување или ажурирање на запис во табелата Driver_Vehicle. 564 Функцијата проверува дали постои id-то на возачот и VIN бројот на возилото, при што фрла соодветен исклучок доколку некој од нив не е валиден. Дополнително, се проверува дали возачот е на смена. Тригерот се извршува пред внесување или ажурирање на запис во табелата Driver_Vehicle. Неговата намена е да ја одржи конзистентноста на работното време и да спречи логички грешки при најава во апликацијата. 565 565 566 566 {{{ … … 596 596 ** Функција и тригер за спречување на манипулација со цената ** 597 597 598 Функцијата враќа тригер кој спречува промена на цената на понудата откако истата ќе добие статус `accepted` или `completed`. Дополнително, се прави проверка дали внесената цена е поголема од нула, при што се фрла соодветен исклучок доколку овие услови не се исполнети. 598 Функцијата враќа тригер кој спречува промена на цената на понудата откако истата ќе добие статус `accepted` или `completed`. Дополнително, се прави проверка дали внесената цена е поголема од нула, при што се фрла соодветен исклучок доколку овие услови не се исполнети. Ова директно ја заштитува финансиската сигурност во системот и спречува неовластени или измамнички промени на трошоците по договарањето. 599 599 600 600 {{{ … … 623 623 **Тригер и функција за проверка на единствена оценка** 624 624 625 Секој корисник смее да остави максимум една оценка за секое возење. Функцијата враќа тригер кој доколку во табелата `Review` постои оценка од корисникот за тоа возење фрла соодветен исклучот . Тригерот се извршува пред внес на запис во табелата `Review`.625 Секој корисник смее да остави максимум една оценка за секое возење. Функцијата враќа тригер кој доколку во табелата `Review` постои оценка од корисникот за тоа возење фрла соодветен исклучот и тригерот се извршува пред внес на запис во табелата `Review`. Ова бизнис правило спречува вештачко манипулирање со рејтинзите на возачите и гарантира фер статистика. 626 626 627 627 {{{ … … 648 648 **Тригер и функција за проверка на бројот на слободни седишта** 649 649 650 Секој корисник при испраќање на барање за превоз напоменува колку патници ќе има (деца, воздрасни и бебиња). Функцијата `check_available_seats` проверува дали во возилото кое се нуди во понудата има доволно седишта . Функцијата враќа тригер кои се извршува пред внес или промена на запис во табелата `Offer`.650 Секој корисник при испраќање на барање за превоз напоменува колку патници ќе има (деца, воздрасни и бебиња). Функцијата `check_available_seats` проверува дали во возилото кое се нуди во понудата има доволно седишта и враќа тригер кои се извршува пред внес или промена на запис во табелата `Offer`. Ја спроведува клучната логика за логистичка компатибилност, со што системот оневозможува испраќање на возило кое физички не може да ги собере патниците. 651 651 652 652 {{{ … … 677 677 **Функција и тригер за спречување на возење со неважечка возачка дозвола** 678 678 679 Функцијата го пребарува датумот на истекување на возачката дозвола за соодветниот возач преку поврзување на табелите `Driver` и `DriverLicense`. Доколку дозволата е истечена во однос на тековниот датум, се фрла соодветен исклучок . Тригерот се извршува пред внес на нов запис во табелата `Ride`.679 Функцијата го пребарува датумот на истекување на возачката дозвола за соодветниот возач преку поврзување на табелите `Driver` и `DriverLicense`. Доколку дозволата е истечена во однос на тековниот датум, се фрла соодветен исклучок, а тригерот се извршува пред внес на нов запис во табелата `Ride`. Целта на оваа рестрикција е правна и сигурносна заштита на платформата, осигурувајќи дека само лиценцирани возачи можат да превезуваат патници. 680 680 681 681 {{{ … … 708 708 **Функција и тригер за спречување на промена на статус на завршена понуда** 709 709 710 Функцијата проверува дали претходниот статус на понудата бил `completed`, при што фрла соодветен исклучок доколку се направи обид за негова промена во било кој друг статус. Тригерот се извршува пред ажурирање на запис во табелата `Offer`. 710 Функцијата проверува дали претходниот статус на понудата бил `completed`, при што фрла соодветен исклучок доколку се направи обид за негова промена во било кој друг статус. Тригерот се извршува пред ажурирање на запис во табелата `Offer`. Ова ја гарантира веродостојноста на архивските податоци во системот кои подоцна се користат за генерирање извештаи. 711 711 712 712 {{{ … … 732 732 ** Функција и тригер за контрола на времето на важност на понудата ** 733 733 734 Оваа функција враќа тригер кој спречува прифаќање на понуди кои се постари од 5 минути од моментот на нивното креирање. Доколку се направи обид за промена на статусот од `pending` во `accepted` по истекот на овој рок, статусот на понудата автоматски се менува во `expired` и истата не може да биде прифатена. 734 Оваа функција враќа тригер кој спречува прифаќање на понуди кои се постари од 5 минути од моментот на нивното креирање. Доколку се направи обид за промена на статусот од `pending` во `accepted` по истекот на овој рок, статусот на понудата автоматски се менува во `expired` и истата не може да биде прифатена. Оваа логика овозможува динамичност на пазарот, со цел возачите и диспечерите да не бидат долго блокирани чекајќи одговор од патникот. 735 735 736 736 {{{ … … 759 759 **Функција и тригер за проверка на валидноста на email адреса и телефонски број** 760 760 761 Функцијата проверува дали постои корисник со ист email или ист телефонски број и фрла исклучоци `User with this email already exists` и `User with this phone number already exists` соодветно. Функцијата враќа тригер кои се извршува пред секое додавање на нов запис-корисник во табелата `AppUser`. 761 Функцијата проверува дали постои корисник со ист email или ист телефонски број и фрла исклучоци `User with this email already exists` и `User with this phone number already exists` соодветно. Функцијата враќа тригер кои се извршува пред секое додавање на нов запис-корисник во табелата `AppUser`. Ова спречува дуплирање на идентитети и потенцијални злоупотреби во апликацијата при регистрација. 762 762 763 763 {{{
