= Функции, процедури и тригери = == Функции == === `fn_available_rooms` === {{{#!sql SELECT * FROM fn_available_rooms(hotel_name, p_check_in, p_check_out); }}} * '''Цел:''' Ги враќа сите слободни соби во даден хотел за даден временски период. ---- === `fn_estimate_cost` === {{{#!sql SELECT * FROM fn_estimate_cost(p_room_id, p_check_in, p_check_out); }}} * '''Цел:''' Пресметува проценета цена на престој (соба * ноќи), без притоа да создава резервација. ---- == Процедури == === `pr_book_pet_stay` === {{{#!sql CALL pr_book_pet_stay(p_pet_id, p_employee_id, p_room_id, p_check_in, p_check_out); }}} * '''Цел:''' Креира резервација и истовремено ѝ доделува соба. * '''Валидации:''' Датумот на заминување мора да е по датумот на пристигнување и собата мора да е слободна за бараниот период (се исфрлаат `cancelled`/`no-show` резервации). Статусот автоматски се поставува на `confirmed`. ---- === `sp_complete_finished_reservations` === {{{#!sql CALL sp_complete_finished_reservations(); }}} * '''Цел:''' Batch-задача која ги обележува како `completed` сите резервации чиј `check_out_date` веќе поминал, а сè уште не се `completed`/`cancelled`/`no-show`. * '''Забелешка:''' Процедурата не се активира автоматски со промена на податок, туку мора да биде повикана рачно или од некој сервис. ---- === `pr_cancel_reservation` === {{{#!sql CALL pr_cancel_reservation(p_reservation_id); }}} * '''Цел:''' Ја откажува резервацијата и сите нејзини закажани услуги во едно повикување. ---- === `pr_add_service_to_reservation` === {{{#!sql CALL pr_add_service_to_reservation(p_reservation_id, p_service_id, p_date, p_time); }}} * '''Цел:''' Додава услуга на постоечка резервација. * '''Валидации:''' Резервацијата мора да постои и да не е `cancelled`/`no-show` и датумот на услугата не смее да е во минатото. ---- === `pr_extend_reservation` === {{{#!sql CALL pr_extend_reservation(p_reservation_id, p_new_check_out); }}} * '''Цел:''' Продолжува постоечки престој со нов, подоцнежен `check_out_date`. * '''Валидации:''' Резервацијата не смее да е `cancelled`/`no-show`/`completed`, новиот датум мора да е подоцна од стариот, собата мора да е слободна за додадените ноќи (сопствениот опсег на резервацијата се исклучува од проверката). * '''Забелешка:''' Преку `UPDATE RoomReservation` автоматски ги активира `trg_sync_date_status` и `trg_update_cost_on_roomreservation`. ---- == Тригери == === `trg_sync_date_status` === * '''Функција:''' `fn_sync_date_status()` * '''Се активира:''' `AFTER INSERT OR UPDATE OR DELETE ON RoomReservation` * '''Цел:''' Ја одржува табелата `Date` синхронизирана со реалните резервации, така што `vw_available_rooms` секогаш прикажува точни, живи податоци. При бришење или промена го ослободува стариот опсег на датуми (`status_id = 2`, available), при внес или промена го означува новиот опсег како зафатен (`status_id = 1`, occupied). ---- === `trg_reservation_status_guard` === * '''Функција:''' `fn_reservation_status_guard()` * '''Се активира:''' `BEFORE UPDATE ON Reservation` * '''Цел:''' Спречува невалидни промини на статус на резервација (пр. од `completed` назад во `pending`). Дозволени промини: `pending -> confirmed | cancelled`, `confirmed -> completed | cancelled | no-show`. Останатите статуси се терминални и не можат да се променуваат. Невалиден обид фрла `EXCEPTION`. ---- === `trg_update_cost_on_roomreservation` / `trg_update_cost_on_servicereservation` === * '''Функција:''' `fn_update_reservation_cost()` * '''Се активираат:''' `AFTER INSERT OR UPDATE OR DELETE` на `RoomReservation` и `ServiceReservation` * '''Цел:''' Автоматски го прекалкулира `Reservation.total_cost` секогаш кога ќе се промени собата, или ќе се додаде или отстрани услуга. Откажаните услуги (`status = cancelled`) не влегуваат во сметката.