== Database Programming Во оваа фаза е имплементирана апликациската логика со функции, процедури и тригери. Секоја од нив е документирана во продолжение. == Процедури **Процедура за вработување на возач во компанија** Процедурата проверува дали id-то на возачот е валидно, доколку не постои фрла соодветен исклучок. {{{ create or replace procedure employ_driver(id_employee int, id_company int) language plpgsql as $$ begin if not exists ( select 1 from driver where user_id=id_employee) then raise exception 'Driver does not exist'; else insert into employmenthistory (employee_user_id, start_date, end_date, company_id) values (id_employee,current_date, null,id_company); end if; end; $$; }}} **Процедура за вработување на диспечер во компанија** Процедурата проверува дали id-то на диспечерот е валидно, доколку не постои фрла соодветен исклучок. {{{ create or replace procedure employ_dispatcher(id_employee int, id_company int) language plpgsql as $$ begin if not exists ( select 1 from dispatcher where user_id=id_employee) then raise notice 'Dispatcher does not exist'; else insert into employmenthistory (employee_user_id, start_date, end_date, company_id) values (id_employee,current_date, null,id_company); end if; end; $$; }}} {{{ create or replace procedure fire_driver(id_employee int, id_company int) language plpgsql as $$ begin if not exists ( select 1 from driver where user_id=id_employee) then raise exception 'Driver does not exist'; else if not exists ( select 1 from employmenthistory where employee_user_id=id_employee and end_date==null and company_id=id_company) then raise exception 'Driver does not have an employment'; else update employmenthistory set end_date=current_date where employee_user_id==id_employee and end_date==null and company_id=id_company; raise notice 'Driver is fired'; commit; end if; end if; end; $$; }}} {{{ create or replace procedure fire_dispatcher(id_employee int, id_company int) language plpgsql as $$ begin if not exists ( select 1 from dispatcher where user_id=id_employee) then raise notice 'Dispatcher does not exist'; else if not exists( select 1 from employmenthistory where employee_user_id=id_employee and end_date==null and company_id=id_company) then raise exception 'Dispatcher does not have an employment'; else update employmenthistory set end_date=current_date where employee_user_id=id_employee and end_date==null and company_id=id_company; raise notice 'Dispatcher is fired'; commit; end if; end if; end; $$; }}} **Процедура за пишување на оценка** {{{ create or replace procedure write_rating(rating numeric, comment text, id_ride int, id_customer int) language plpgsql as $$ begin insert into review (rating, comment, ride_id, customer_user_id) values (write_rating.rating,write_rating.comment,id_ride,id_customer); end; $$; }}} **Процедура за испраќање порака** Пораките можат да бидат испратени од возачот или патникот и се однесуваат на едно возење. {{{ create or replace procedure write_chat(new_message text, id_ride int, id_user int) language plpgsql as $$ begin insert into chatmessage(message, user_id_from, ride_id) values (new_message,id_user,id_ride); end; $$; }}} **Процедура за поднесување пријава** Оваа процедура се повикува кога корисниците сакаат да поднесат пријава за време на возењето. Тоа може да биде некоја поплака за брзо возење или скршнување од патот. {{{ create or replace procedure write_report(id_ride int, user_id int, new_message text, new_title text,temp_latitude float, temp_long float, new_reason text) language plpgsql as $$ begin insert into report(ride_id, customer_user_id, message, title, latitude, longitude, reason) values (id_ride,user_id,new_message,new_title,temp_latitude,temp_long,new_reason); end; $$; {{{ == Функции и тригери