Changes between Version 22 and Version 23 of DatabaseProgramming


Ignore:
Timestamp:
06/12/26 17:13:46 (3 days ago)
Author:
231093
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v22 v23  
    77**Процедура за почеток на смена на возач**
    88
    9 Процедурата проверува дали постои id-то на возачот и VIN бројот кај возилото и фрла соодветен исклучот. Доколку возачот и возилото се валидни се додава нов запис за смена во табелата Driver_Vehicle.
     9Процедурата проверува дали постои id-то на возачот и VIN бројот кај возилото и фрла соодветен исклучот. Доколку возачот и возилото се валидни се додава нов запис за смена во табелата `Driver_Vehicle`.
    1010
    1111{{{
     
    3434**Процедура за завршување на смена на возач**
    3535
    36 Процедурата проверува дали постои id-то на возачот, доколку не постои фрла соодветен исклучок. Потоа се проверува дали возачот има точно една активна смена која не е завршена. На крај се ажурира записот во табелата Driver_Vehicle на тој начин што се поставува тековното време во колоната time_to.
     36Процедурата проверува дали постои id-то на возачот, доколку не постои фрла соодветен исклучок. Потоа се проверува дали возачот има точно една активна смена која не е завршена. На крај се ажурира записот во табелата `Driver_Vehicle` на тој начин што се поставува тековното време во колоната `time_to`.
    3737
    3838{{{
     
    113113**Процедура за отпуштање/завршување на договор на возач во компанија**
    114114
    115 Процедурата прави две проверки. Првата проверка ја пребарува табелата Driver за id-то на возачот, доколку истото не постои се фрла соодветен исклучок. Потоа се проверува дали постои соодветен запис во табелата !EmploymentHistory кој потврдува дека возачот е тековно вработен во компанијата. На крај се променува записот од табелата !EmploymentHistory на тој начин што се става краен датум.
     115Процедурата прави две проверки. Првата проверка ја пребарува табелата Driver за id-то на возачот, доколку истото не постои се фрла соодветен исклучок. Потоа се проверува дали постои соодветен запис во табелата `EmploymentHistory` кој потврдува дека возачот е тековно вработен во компанијата. На крај се променува записот од табелата `EmploymentHistory` на тој начин што се става краен датум.
    116116
    117117{{{
     
    147147**Процедура за отпуштање/завршување на договор на диспечер во компанија**
    148148
    149 Процедурата прави две проверки. Првата проверка ја пребарува табелата Dispatcher за id-то на диспечарот, доколку истото не постои се фрла соодветен исклучок. Потоа се проверува дали постои соодветен запис во табелата !EmploymentHistory кој потврдува дека деспечерот е тековно вработен во компанијата. На крај се променува записот од табелата !EmploymentHistory на тој начин што се става краен датум.
     149Процедурата прави две проверки. Првата проверка ја пребарува табелата `Dispatcher` за id-то на диспечарот, доколку истото не постои се фрла соодветен исклучок. Потоа се проверува дали постои соодветен запис во табелата `EmploymentHistory` кој потврдува дека деспечерот е тековно вработен во компанијата. На крај се променува записот од табелата `EmploymentHistory` на тој начин што се става краен датум.
    150150
    151151{{{
     
    226226**Процедура за креирање на барање за превоз**
    227227
    228 Процедурата make_request се повикува кога корисникот креира ново барање за превоз. Најпрво се проверува дали постои корисникот со даденото customer_id, по што се валидираат координатите за почетната и крајната локација. Дополнително се проверуваат параметрите поврзани со бројот на патници, детски седишта и багаж, при што се фрлаат соодветни исклучоци доколку некоја вредност е невалидна. Исто така, процедурата проверува дали почетната и крајната локација не се исти. Доколку сите проверки се успешни, се додава нов запис во табелата Request со статус pending, а идентификаторот на новокреираното барање се враќа преку излезниот параметар request_id.
     228Процедурата `make_request` се повикува кога корисникот креира ново барање за превоз. Најпрво се проверува дали постои корисникот со даденото `customer_id`, по што се валидираат координатите за почетната и крајната локација. Дополнително се проверуваат параметрите поврзани со бројот на патници, детски седишта и багаж, при што се фрлаат соодветни исклучоци доколку некоја вредност е невалидна. Исто така, процедурата проверува дали почетната и крајната локација не се исти. Доколку сите проверки се успешни, се додава нов запис во табелата `Request` со статус `pending`, а идентификаторот на новокреираното барање се враќа преку излезниот параметар `request_id`.
    229229
    230230{{{
     
    323323**Процедура за додавање на Waypoint на некое барање**
    324324
    325 Процедурата add_waypoint се повикува кога корисникот сака да додаде попатна точка на постоечко барање за превоз. Најпрво се проверува дали постои барањето со даденото request_id, по што се валидираат координатите на waypoint-от. Дополнително се проверува дали истиот waypoint веќе е додаден за конкретното барање, при што се фрла соодветен исклучок доколку постои дупликат. Потоа се пресметува редниот број (seqno) на новиот waypoint врз основа на бројот на веќе постоечки waypoints за тоа барање. Доколку сите проверки се успешни, се додава нов запис во табелата Waypoints.
     325Процедурата `add_waypoint` се повикува кога корисникот сака да додаде попатна точка на постоечко барање за превоз. Најпрво се проверува дали постои барањето со даденото `request_id`, по што се валидираат координатите на waypoint-от. Дополнително се проверува дали истиот `waypoint` веќе е додаден за конкретното барање, при што се фрла соодветен исклучок доколку постои дупликат. Потоа се пресметува редниот број (`seqno`) на новиот `waypoint` врз основа на бројот на веќе постоечки waypoints за тоа барање. Доколку сите проверки се успешни, се додава нов запис во табелата `Waypoints`.
    326326
    327327{{{
     
    367367**Процедура за зпочнување на возење со такси**
    368368
    369 Процедурата проверува дали постои id-то на понудата, доколку не постои фрла соодветен исклучок. Потоа се пронаоѓа најблискиот слободен возач кој е на активна смена. На крај се додава нов запис во табелата Ride со статус in_progress, а статусите на понудата и барањето се ажурираат во accepted и in_progress.
     369Процедурата проверува дали постои id-то на понудата, доколку не постои фрла соодветен исклучок. Потоа се пронаоѓа најблискиот слободен возач кој е на активна смена. На крај се додава нов запис во табелата `Ride` со статус `in_progress`, а статусите на понудата и барањето се ажурираат во accepted и `in_progress`.
    370370
    371371{{{
     
    444444}}}
    445445
     446** Процедура за креирање понуда за одредено барање **
     447
     448Процедурата се повикува кога диспечерот креира нова понуда за одредено барање за превоз. Најпрво се проверува дали постои барање со даденото `request_id` и дали истото е во статус pending, при што се фрла соодветен исклучок доколку условот не е исполнет. Потоа се валидираат влезните параметри: цената мора да биде поголема од нула, а проценетото време на пристигнување (eta) мора да биде во иднина во однос на тековното време. Дополнително, процедурата проверува дали диспечерот и возачот се тековно вработени во истата компанија преку пребарување на нивните активни договори во табелата `EmploymentHistory`. Доколку сите проверки се успешни, се додава нов запис во табелата `Offer` со иницијален статус pending.
     449
    446450{{{
    447451create or replace procedure create_offer(
     
    482486}}}
    483487
     488** Процедура за прифаќање на понуда **
     489
     490Оваа процедура се повикува кога корисникот прифаќа одредена понуда за превоз. Таа го ажурира статусот на избраната понуда и на самото барање во `accepted`, додека сите останати конкурентни понуди за истото барање се одбиваат, односно нивниот статус се променува во `rejected`.
     491
    484492{{{
    485493create or replace procedure accept_offer(offer_id int4)
     
    508516**Функција и тригер за проверка на достапност на возач**
    509517
    510 Функцијата ride_assign враќа тригер кој фрла исклучок во случај возачот да е зафатен со друго возење во моментот на доделување на возач. Тригерот се извршува пред внес на запис во табелата Ride.
     518Функцијата `ride_assign` враќа тригер кој фрла исклучок во случај возачот да е зафатен со друго возење во моментот на доделување на возач. Тригерот се извршува пред внес на запис во табелата `Ride`.
    511519
    512520{{{
     
    559567}}}
    560568
     569** Функција и тригер за спречување на манипулација со цената **
     570
     571Функцијата враќа тригер кој спречува промена на цената на понудата откако истата ќе добие статус `accepted` или `completed`. Дополнително, се прави проверка дали внесената цена е поголема од нула, при што се фрла соодветен исклучок доколку овие услови не се исполнети.
     572
    561573{{{
    562574create or replace function prevent_price_manipulation()
     
    575587end;
    576588$prevent_price_manipulation$ language plpgsql;
     589
     590create trigger prevent_price_manipulation
     591    before update on offer
     592    for each row
     593    execute function prevent_price_manipulation();
    577594}}}
    578595
    579596**Тригер и функција за проверка на единствена оценка**
    580597
    581 Секој корисник смее да остави максимум една оценка за секое возење. Функцијата враќа тригер кој доколку во табелата Review постои оценка од корисникот за тоа возење фрла соодветен исклучот. Тригерот се извршува пред внес на запис во табелата Review.
     598Секој корисник смее да остави максимум една оценка за секое возење. Функцијата враќа тригер кој доколку во табелата `Review` постои оценка од корисникот за тоа возење фрла соодветен исклучот. Тригерот се извршува пред внес на запис во табелата `Review`.
    582599
    583600{{{
     
    604621**Тригер и функција за проверка на бројот на слободни седишта**
    605622
    606 Секој корисник при испраќање на барање за превоз напоменува колку патници ќе има (деца, воздрасни и бебиња). Функцијата check_available_seats проверува дали во возилото кое се нуди во понудата има доволно седишта. Функцијата враќа тригер кои се извршува пред внес или промена на запис во табелата Offer.
     623Секој корисник при испраќање на барање за превоз напоменува колку патници ќе има (деца, воздрасни и бебиња). Функцијата `check_available_seats` проверува дали во возилото кое се нуди во понудата има доволно седишта. Функцијата враќа тригер кои се извршува пред внес или промена на запис во табелата `Offer`.
    607624
    608625{{{
     
    633650**Функција и тригер за спречување на возење со неважечка возачка дозвола**
    634651
    635 Функцијата го пребарува датумот на истекување на возачката дозвола за соодветниот возач преку поврзување на табелите Driver и DriverLicense. Доколку дозволата е истечена во однос на тековниот датум, се фрла соодветен исклучок. Тригерот се извршува пред внес на нов запис во табелата Ride.
     652Функцијата го пребарува датумот на истекување на возачката дозвола за соодветниот возач преку поврзување на табелите `Driver` и `DriverLicense`. Доколку дозволата е истечена во однос на тековниот датум, се фрла соодветен исклучок. Тригерот се извршува пред внес на нов запис во табелата `Ride`.
    636653
    637654{{{
     
    664681**Функција и тригер за спречување на промена на статус на завршена понуда**
    665682
    666 Функцијата проверува дали претходниот статус на понудата бил 'completed', при што фрла соодветен исклучок доколку се направи обид за негова промена во било кој друг статус. Тригерот се извршува пред ажурирање на запис во табелата Offer.
     683Функцијата проверува дали претходниот статус на понудата бил `completed`, при што фрла соодветен исклучок доколку се направи обид за негова промена во било кој друг статус. Тригерот се извршува пред ажурирање на запис во табелата `Offer`.
    667684
    668685{{{
     
    685702execute function prevent_completed_offer_downgrade();
    686703}}}
     704
     705** Функција и тригер за контрола на времето на важност на понудата **
     706
     707Оваа функција враќа тригер кој спречува прифаќање на понуди кои се постари од 5 минути од моментот на нивното креирање. Доколку се направи обид за промена на статусот од `pending` во `accepted` по истекот на овој рок, статусот на понудата автоматски се менува во `expired` и истата не може да биде прифатена.
     708
    687709{{{
    688710create or replace function enforce_offer_validity()
     
    710732**Функција и тригер за проверка на валидноста на email адреса и телефонски број**
    711733
    712 Функцијата проверува дали постои корисник со ист email или ист телефонски број и фрла исклучоци 'User with this email already exists' и 'User with this phone number already exists' соодветно. Функцијата враќа тригер кои се извршува пред секое додавање на нов запис-корисник во табелата !AppUser.
     734Функцијата проверува дали постои корисник со ист email или ист телефонски број и фрла исклучоци `User with this email already exists` и `User with this phone number already exists` соодветно. Функцијата враќа тригер кои се извршува пред секое додавање на нов запис-корисник во табелата `AppUser`.
    713735
    714736{{{