== Функции == === '''fn_artist_average_rating(p_bookable_id INT)''' === Оваа функција ја пресметува просечната оцена за даден артист/бенд (bookable) така што ги зема сите рецензии (''Review'') за неговите букинзи и ја враќа средната вредност заокружена на две децимали. Со тоа се имплементира бизнис логиката за прикажување на рејтинг на артистите во апликацијата и за статистика/сортирање по оцена. === '''fn_artist_total_earnings(p_bookable_id INT)''' === Функцијата ја собира сумата на сите плаќања со статус ''PAID'' за сите букинзи поврзани со даден артист или бенд. Така се имплементира бизнис логиката за пресметка на вкупната заработка на артистот, која може да се прикаже во неговиот профил или во администраторскиот дел. === '''fn_check_artist_availability(p_bookable_id INT, p_date DATE)''' === Оваа функција проверува дали артистот има барем еден запис во ''AvailabilitySlot'' со статус ''AVAILABLE'' на дадениот датум и враќа TRUE/FALSE. Со тоа се имплементира логиката за проверка на достапност при креирање понуда или букинг – апликацијата прво проверува дали артистот е слободен на конкретниот датум. === '''fn_total_client_bookings(p_client_id INT)''' === Функцијата го брои бројот на букинзи за даден клиент преку поврзување на ''BookingRequest'', ''Offer'' и ''Booking'' и враќа цел број. Ова ја покрива бизнис логиката за статистика за клиентот (на пример колку настани има букирано), што може да се користи во неговиот профил или за аналитика. == Процедури == === '''sp_create_booking_request(p_client_id, p_duration_id, p_event_type, p_event_date, p_location_id)''' === Процедурата креира нов запис во ''BookingRequest'' со основните информации за настанот (клиент, траење, тип, датум, локација). На тој начин ја инкапсулира бизнис операцијата „клиентот испраќа барање за букинг“ и осигурува дека секогаш се пополнуваат потребните полиња на централизирано место. === '''sp_cancel_booking(p_booking_id INT)''' === Оваа процедура го ажурира полето ''booking_status'' на избраниот букинг во вредност ''CANCELLED''. На тој начин се имплементира логиката за откажување на букинг од страна на клиент или администратор, а преку тригерот за историја автоматски се логира и промената на статусот. === '''sp_create_payment(p_booking_id INT, p_amount NUMERIC)''' === Процедурата додава нов запис во ''Payment'' за одреден букинг, со зададена сума и статус ''PAID''. Така се имплементира делот од бизнис логиката за евиденција на успешно извршени плаќања, што потоа се користи и во функцијата за вкупна заработка на артистите. == Тригери == === '''fn_update_slot_status() / trg_update_slot_status''' === Овој тригер се активира по вметнување (AFTER INSERT) на нов букинг во ''Booking'' и преку функцијата ''fn_update_slot_status'' ги ажурира сите ''AvailabilitySlot'' записи за соодветниот артист на датумот на настанот во статус ''BOOKED''. Со тоа се имплементира бизнис правилото дека кога ќе се потврди букинг за одреден датум, слободните термини за тој датум повеќе не се достапни во календарот на артистот. === '''fn_prevent_double_booking() / trg_prevent_double_booking''' === Тригерот се активира пред вметнување (BEFORE INSERT) на нов букинг и во функцијата ''fn_prevent_double_booking'' проверува дали веќе постои букинг со статус ''CONFIRMED'' за истиот артист (bookable_id) и истиот датум на настан (event_date). Ако постои, се крева грешка „Artist already booked on that date!“ и се спречува внесот, со што директно се имплементира бизнис правилото дека артист може да има најмногу еден потврден настап во еден ден. === '''fn_booking_status_history() / trg_booking_status_history''' === Овој тригер се активира по ажурирање (AFTER UPDATE) на ''Booking'' кога статусот се менува и преку функцијата ''fn_booking_status_history'' внесува ред во ''BookingStatusHistory'' со новиот статус и времето на промена. Така се имплементира бизнис логиката за водење историја (audit trail) на статусите на букинзите, што е корисно за следење на целиот животен циклус на букинг (''CREATED → CONFIRMED → COMPLETED/CANCELLED'').