| | 69 | === `proc_execute_purchase` |
| | 70 | |
| | 71 | Оваа процедура го менаџира целиот процес на продажба на билет во една сигурна трансакција. Ја пресметува точната цена, го евидентира купувачот и автоматски го заклучува билетот за да спречи негова повторна продажба. |
| | 72 | |
| | 73 | {{{ |
| | 74 | |
| | 75 | CREATE OR REPLACE PROCEDURE proc_execute_purchase(p_uid BIGINT, p_tid BIGINT, p_qr VARCHAR) AS $$ |
| | 76 | BEGIN |
| | 77 | IF (SELECT is_available FROM "Ticket" WHERE ticket_id = p_tid) = FALSE THEN RAISE EXCEPTION 'Ticket is already sold'; END IF; |
| | 78 | INSERT INTO "Ticket_Purchase" (ticket_id, user_id, qr_code, purchase_amount) |
| | 79 | VALUES (p_tid, p_uid, p_qr, fn_calculate_price(p_tid)); |
| | 80 | UPDATE "Ticket" SET is_available = FALSE WHERE ticket_id = p_tid; |
| | 81 | END; $$ LANGUAGE plpgsql; |
| | 82 | |
| | 83 | }}} |
| | 84 | |
| | 85 | === `proc_execute_refund` |
| | 86 | |
| | 87 | Ове е автоматизирана процедура за рефундирање која пресметува 85% поврат на средствата за корисникот. По успешното запишување на рефундацијата, таа веднаш го враќа билетот во продажба како „слободен“. |
| | 88 | |
| | 89 | {{{ |
| | 90 | |
| | 91 | CREATE OR REPLACE PROCEDURE proc_execute_refund(p_purchase_id BIGINT) AS $$ |
| | 92 | DECLARE v_paid FLOAT4; v_tid BIGINT; |
| | 93 | BEGIN |
| | 94 | SELECT purchase_amount, ticket_id INTO v_paid, v_tid FROM "Ticket_Purchase" WHERE purchase_id = p_purchase_id; |
| | 95 | INSERT INTO "Ticket_Refund" (purchase_id, refund_amount, refund_time) VALUES (p_purchase_id, v_paid * 0.85, CURRENT_TIMESTAMP); |
| | 96 | UPDATE "Ticket" SET is_available = TRUE WHERE ticket_id = v_tid; |
| | 97 | END; $$ LANGUAGE plpgsql; |
| | 98 | |
| | 99 | }}} |
| | 100 | |
| | 101 | === `proc_create_full_event` |
| | 102 | |
| | 103 | Оваа процедура овозможува креирање на комплетен настан заедно со неговиот термин и доделен изведувач со една команда. Процедурата ја користи логиката за проверка на достапност за да гарантира дека новиот настан не се поклопува со веќе постоечките. |
| | 104 | |
| | 105 | {{{ |
| | 106 | |
| | 107 | CREATE OR REPLACE PROCEDURE proc_create_full_event(p_name VARCHAR, p_age INT, p_ven_id BIGINT, p_perf_id BIGINT, p_time TIMESTAMP, p_dur INT) AS $$ |
| | 108 | DECLARE v_eid BIGINT; v_hid BIGINT; |
| | 109 | BEGIN |
| | 110 | IF NOT fn_check_resource_availability('VENUE', p_ven_id, p_time, p_dur) THEN RAISE EXCEPTION 'Venue is already booked for this time'; END IF; |
| | 111 | INSERT INTO "Event" (name, min_age) VALUES (p_name, p_age) RETURNING event_id INTO v_eid; |
| | 112 | INSERT INTO "Event_Happening" (event_id, venue_id, event_time, duration) VALUES (v_eid, p_ven_id, p_time, p_dur) RETURNING event_happening_id INTO v_hid; |
| | 113 | INSERT INTO "Event_Happening_Performer" (event_happening_id, performer_id) VALUES (v_hid, p_perf_id); |
| | 114 | END; $$ LANGUAGE plpgsql; |
| | 115 | |
| | 116 | }}} |
| | 117 | |