Changes between Version 2 and Version 3 of DatabaseProgramming


Ignore:
Timestamp:
04/30/26 12:56:25 (2 days ago)
Author:
231027
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v2 v3  
    55=== `fn_calculate_price`
    66
     7Оваа функција ја пресметува крајната цена на билетот во реално време преку проверка на сите активни периоди за попуст или поскапување. Таа овозможува системот да биде флексибилен со цените без да се менуваат оригиналните записи во табелата со билети.
     8
     9{{{
     10
     11CREATE OR REPLACE FUNCTION fn_calculate_price(p_ticket_id BIGINT) RETURNS FLOAT4 AS $$
     12DECLARE v_base FLOAT4; v_perc INT; v_inc BOOLEAN;
     13BEGIN
     14    SELECT base_price INTO v_base FROM "Ticket" WHERE ticket_id = p_ticket_id;
     15    SELECT price_change_percent, increase_decrease INTO v_perc, v_inc FROM "Event_Period"
     16    WHERE event_happening_id = (SELECT event_happening_id FROM "Ticket" WHERE ticket_id = p_ticket_id)
     17    AND CURRENT_DATE BETWEEN start_date AND end_date LIMIT 1;
     18    IF v_perc IS NOT NULL THEN
     19        IF v_inc THEN v_base := v_base + (v_base * v_perc / 100.0);
     20        ELSE v_base := v_base - (v_base * v_perc / 100.0); END IF;
     21    END IF;
     22    RETURN v_base;
     23END; $$ LANGUAGE plpgsql;
     24
     25}}}
     26
     27=== `fn_check_resource_availability`
     28
     29Оваа функција служи како централен систем за детекција на конфликти помеѓу термините на настаните. Проверува дали одредена локација или изведувач се веќе зафатени во бараниот временски интервал, спречувајќи дуплирање на резервациите.
     30
     31{{{
     32
     33CREATE OR REPLACE FUNCTION fn_check_resource_availability(p_type TEXT, p_id BIGINT, p_start TIMESTAMP, p_dur INT) RETURNS BOOLEAN AS $$
     34BEGIN
     35    IF p_type = 'VENUE' THEN
     36        RETURN NOT EXISTS (SELECT 1 FROM "Event_Happening" WHERE venue_id = p_id AND (p_start, (p_start + (p_dur || ' minutes')::interval)) OVERLAPS (event_time, (event_time + (duration || ' minutes')::interval)));
     37    ELSIF p_type = 'PERFORMER' THEN
     38        RETURN NOT EXISTS (SELECT 1 FROM "Event_Happening_Performer" ehp JOIN "Event_Happening" eh ON ehp.event_happening_id = eh.event_happening_id
     39        WHERE ehp.performer_id = p_id AND (p_start, (p_start + (p_dur || ' minutes')::interval)) OVERLAPS (eh.event_time, (eh.event_time + (eh.duration || ' minutes')::interval)));
     40    END IF;
     41    RETURN TRUE;
     42END; $$ LANGUAGE plpgsql;
     43
     44}}}
     45
     46=== `fn_validate_hierarchy_capacity`
     47
     48Оваа функција врши строга контрола врз хиерархиската структура на објектот (Venue -> Section -> Seat). Гарантира дека вкупниот број на седишта во секциите не ја надминува границата на салата, ниту пак бројот на реални седишта го надминува капацитетот на секцијата.
     49
     50{{{
     51
     52CREATE OR REPLACE FUNCTION fn_validate_hierarchy_capacity(p_parent_id BIGINT, p_new_amount INT, p_type TEXT) RETURNS BOOLEAN AS $$
     53DECLARE v_limit INT; v_current INT;
     54BEGIN
     55    IF p_type = 'VENUE_LIMIT' THEN
     56        SELECT number_of_seats INTO v_limit FROM "Venue" WHERE venue_id = p_parent_id;
     57        SELECT COALESCE(SUM(number_of_seats), 0) INTO v_current FROM "Section" WHERE venue_id = p_parent_id;
     58    ELSIF p_type = 'SECTION_LIMIT' THEN
     59        SELECT number_of_seats INTO v_limit FROM "Section" WHERE section_id = p_parent_id;
     60        SELECT COUNT(*) INTO v_current FROM "Seat" WHERE section_id = p_parent_id;
     61    END IF;
     62    RETURN (v_current + p_new_amount) <= v_limit;
     63END; $$ LANGUAGE plpgsql;
     64
     65}}}
     66
    767== Процедури
    868