| 1 | ----------------------------- View 1: view_events_by_date -----------------------------
|
|---|
| 2 | -- Home page со идни настани
|
|---|
| 3 | CREATE VIEW view_events_by_date AS
|
|---|
| 4 | SELECT
|
|---|
| 5 | e.id,
|
|---|
| 6 | e.title,
|
|---|
| 7 | e.start_date,
|
|---|
| 8 | e.end_date,
|
|---|
| 9 | MIN(ei.image_url) AS image
|
|---|
| 10 | FROM EVENT e
|
|---|
| 11 | LEFT JOIN EVENT_IMAGE ei ON ei.EVENTid = e.id
|
|---|
| 12 | WHERE e.start_date >= CURRENT_DATE
|
|---|
| 13 | GROUP BY e.id, e.title, e.start_date, e.end_date
|
|---|
| 14 | ORDER BY e.start_date ASC;
|
|---|
| 15 |
|
|---|
| 16 | SELECT *
|
|---|
| 17 | FROM view_events_by_date
|
|---|
| 18 | WHERE id = 12455;
|
|---|
| 19 |
|
|---|
| 20 | -- Погледот ги прикажува сите идни настани подредени по датум со по една слика за секој настан.
|
|---|
| 21 | -- Се користи на почетната страница на апликацијата и
|
|---|
| 22 | -- ја имплементира бизнис логиката за приказ на листа на достапни настани.
|
|---|
| 23 |
|
|---|
| 24 |
|
|---|
| 25 | ----------------------------- View 2: view_event_details -----------------------------
|
|---|
| 26 | -- Детали за избран конкретен настан
|
|---|
| 27 | CREATE VIEW view_event_details AS
|
|---|
| 28 | SELECT
|
|---|
| 29 | e.id,
|
|---|
| 30 | e.title,
|
|---|
| 31 | e.description,
|
|---|
| 32 | e.start_date,
|
|---|
| 33 | e.end_date,
|
|---|
| 34 | e.end_date - e.start_date AS duration_days,
|
|---|
| 35 | c.category_name AS category,
|
|---|
| 36 | ARRAY_AGG(DISTINCT ei.image_url) FILTER (WHERE ei.image_url IS NOT NULL) AS images
|
|---|
| 37 | FROM EVENT e
|
|---|
| 38 | LEFT JOIN CATEGORIZATION c ON e.CATEGORIZATIONid = c.id
|
|---|
| 39 | LEFT JOIN EVENT_IMAGE ei ON e.id = ei.EVENTid
|
|---|
| 40 | GROUP BY e.id, e.title, e.start_date, e.end_date, c.category_name ;
|
|---|
| 41 |
|
|---|
| 42 | SELECT *
|
|---|
| 43 | FROM view_event_details
|
|---|
| 44 | WHERE id=56984;
|
|---|
| 45 |
|
|---|
| 46 | -- Погледот ги прикажува деталите за конкретен настан —
|
|---|
| 47 | -- наслов, опис, датуми, траење, категорија и сите слики.
|
|---|
| 48 | -- Се користи на страницата за детали на настан кога корисникот ќе кликне на конкретен настан и
|
|---|
| 49 | -- ја имплементира бизнис логиката за приказ на комплетни информации за настанот.
|
|---|
| 50 |
|
|---|
| 51 |
|
|---|
| 52 | ----------------------------- View 3: view_event_halls -----------------------------
|
|---|
| 53 | -- Пред да се купи тикет, преглед на сала и venues за настанот
|
|---|
| 54 | CREATE VIEW view_event_halls AS
|
|---|
| 55 | SELECT
|
|---|
| 56 | e.id AS event_id,
|
|---|
| 57 | e.title,
|
|---|
| 58 | h.id AS hall_id,
|
|---|
| 59 | h.hall_name AS hall_name,
|
|---|
| 60 | h.capacity,
|
|---|
| 61 | eh.allowed_access,
|
|---|
| 62 | v.venue_name AS venue_name,
|
|---|
| 63 | v.city
|
|---|
| 64 | FROM EVENT e
|
|---|
| 65 | JOIN EVENT_HALL eh ON eh.EVENTid = e.id
|
|---|
| 66 | JOIN HALL h ON h.id = eh.HALLid
|
|---|
| 67 | JOIN VENUE v ON v.id = h.VENUEid;
|
|---|
| 68 |
|
|---|
| 69 | SELECT *
|
|---|
| 70 | FROM view_event_halls
|
|---|
| 71 | WHERE event_id = 12356;
|
|---|
| 72 |
|
|---|
| 73 | -- Погледот ги прикажува сите сали и venues за даден настан заедно со
|
|---|
| 74 | -- нивниот капацитет и дозволен пристап.
|
|---|
| 75 | -- Се користи при процесот на купување тикет кога корисникот треба да избере сала и
|
|---|
| 76 | -- ја имплементира бизнис логиката за приказ на достапни локации за настанот.
|
|---|
| 77 |
|
|---|
| 78 |
|
|---|
| 79 | ----------------------------- View 4: view_event_ticket_availability -----------------------------
|
|---|
| 80 | -- Преглед на типови на тикети, цени и количини за веќе избрана сала
|
|---|
| 81 | CREATE VIEW view_event_ticket_availability AS
|
|---|
| 82 | SELECT
|
|---|
| 83 | e.id AS event_id,
|
|---|
| 84 | tt.id AS ticket_type_id,
|
|---|
| 85 | tt.type_name AS ticket_type,
|
|---|
| 86 | ett.price,
|
|---|
| 87 | ett.quantity_available,
|
|---|
| 88 | COUNT(DISTINCT t.id) FILTER (WHERE t.status = 'ACTIVE') AS sold,
|
|---|
| 89 | ett.quantity_available - COUNT(DISTINCT t.id) FILTER (WHERE t.status = 'ACTIVE') AS remaining
|
|---|
| 90 | FROM EVENT e
|
|---|
| 91 | JOIN EVENT_TICKET_TYPE ett ON ett.EVENTid = e.id
|
|---|
| 92 | JOIN TICKET_TYPE tt ON tt.id = ett.TICKET_TYPEid
|
|---|
| 93 | LEFT JOIN TICKET t ON t.EVENTid = e.id AND t.TICKET_TYPEid = tt.id
|
|---|
| 94 | GROUP BY e.id, tt.id, tt.type_name , ett.price, ett.quantity_available;
|
|---|
| 95 |
|
|---|
| 96 | SELECT *
|
|---|
| 97 | FROM view_event_ticket_availability
|
|---|
| 98 | WHERE event_id = 12455;
|
|---|
| 99 |
|
|---|
| 100 | -- Погледот ги прикажува достапните типови на тикети за даден настан заедно со
|
|---|
| 101 | -- нивните цени, вкупен број, продадени и преостанати количини.
|
|---|
| 102 | -- Се користи при купување тикет по избор на сала и
|
|---|
| 103 | -- ја имплементира бизнис логиката за приказ на достапност на тикети во реално време.
|
|---|
| 104 |
|
|---|
| 105 |
|
|---|
| 106 | ----------------------------- View 5: view_ticket_status -----------------------------
|
|---|
| 107 | -- Преглед на детали за тикет
|
|---|
| 108 | CREATE VIEW view_ticket_status AS
|
|---|
| 109 | SELECT
|
|---|
| 110 | t.id AS ticket_id,
|
|---|
| 111 | t.code,
|
|---|
| 112 | t.status,
|
|---|
| 113 | e.title AS event_title,
|
|---|
| 114 | e.start_date,
|
|---|
| 115 | h.hall_name AS hall_name,
|
|---|
| 116 | CASE
|
|---|
| 117 | WHEN s.seat_number IS NULL THEN 'N/A'
|
|---|
| 118 | ELSE s.seat_number::TEXT
|
|---|
| 119 | END AS seat_number,
|
|---|
| 120 | tt.type_name AS ticket_type,
|
|---|
| 121 | u.first_name || ' ' || u.last_name AS holder_name
|
|---|
| 122 | FROM TICKET t
|
|---|
| 123 | JOIN EVENT e ON t.EVENTid = e.id
|
|---|
| 124 | JOIN HALL h ON t.HALLid = h.id
|
|---|
| 125 | JOIN TICKET_TYPE tt ON t.TICKET_TYPEid = tt.id
|
|---|
| 126 | JOIN APP_USER u ON t.APP_USERid = u.id
|
|---|
| 127 | LEFT JOIN SEAT s ON t.SEATid = s.id;
|
|---|
| 128 |
|
|---|
| 129 | SELECT *
|
|---|
| 130 | FROM view_ticket_status
|
|---|
| 131 | WHERE ticket_id = 3;
|
|---|
| 132 |
|
|---|
| 133 | -- Погледот ги прикажува деталите за конкретен тикет —
|
|---|
| 134 | -- статус, настан, сала, седиште, тип и корисник. Се користи при преглед на тикет
|
|---|
| 135 | -- од страна на корисникот и при скенирање на тикет при влез на настан и
|
|---|
| 136 | -- ја имплементира бизнис логиката за верификација и приказ на тикети.
|
|---|
| 137 |
|
|---|
| 138 |
|
|---|
| 139 | ----------------------------- View 6: view_event_reviews -----------------------------
|
|---|
| 140 | -- Приказ на рецензии и оценки за минат настан
|
|---|
| 141 | CREATE OR REPLACE VIEW view_event_reviews AS
|
|---|
| 142 | SELECT
|
|---|
| 143 | e.id AS event_id,
|
|---|
| 144 | e.title AS event_title,
|
|---|
| 145 | e.start_date AS start_date,
|
|---|
| 146 | r.id AS review_id,
|
|---|
| 147 | CASE
|
|---|
| 148 | WHEN u.first_name IS NULL THEN 'Anonymous'
|
|---|
| 149 | ELSE u.first_name || ' ' || u.last_name
|
|---|
| 150 | END
|
|---|
| 151 | AS user_name,
|
|---|
| 152 | r.rating,
|
|---|
| 153 | r.review_comment
|
|---|
| 154 | FROM EVENT e
|
|---|
| 155 | LEFT JOIN REVIEW r ON r.EVENTid = e.id
|
|---|
| 156 | LEFT JOIN APP_USER u ON u.id = r.APP_USERid;
|
|---|
| 157 |
|
|---|
| 158 | SELECT *
|
|---|
| 159 | FROM view_event_reviews
|
|---|
| 160 | WHERE event_id = 12345;
|
|---|
| 161 |
|
|---|
| 162 | -- Погледот ги прикажува сите рецензии и оценки за даден минат настан
|
|---|
| 163 | -- со прикажување на Anonymous за анонимни рецензии.
|
|---|
| 164 | -- Се користи на страницата на настанот по неговото завршување и
|
|---|
| 165 | -- ја имплементира бизнис логиката за систем на оценување и рецензии.
|
|---|
| 166 |
|
|---|
| 167 |
|
|---|
| 168 | ----------------------------- View 7: view_user_order_summary -----------------------------
|
|---|
| 169 | -- Преглед на историја на нарачки по корисник
|
|---|
| 170 | CREATE VIEW view_user_order_summary AS
|
|---|
| 171 | SELECT
|
|---|
| 172 | uo.id AS order_id,
|
|---|
| 173 | u.id AS user_id,
|
|---|
| 174 | u.first_name || ' ' || u.last_name AS customer_name,
|
|---|
| 175 | uo.order_date,
|
|---|
| 176 | uo.total_amount,
|
|---|
| 177 | s.status_name AS order_status,
|
|---|
| 178 | pc.code AS promo_code,
|
|---|
| 179 | pc.discount_percent,
|
|---|
| 180 | ps.paid_amount,
|
|---|
| 181 | ps.payment_status,
|
|---|
| 182 | ps.payment_method,
|
|---|
| 183 | ts.ticket_count
|
|---|
| 184 | FROM USER_ORDER uo
|
|---|
| 185 | JOIN APP_USER u ON u.id = uo.APP_USERid
|
|---|
| 186 | JOIN STATUS s ON s.id = uo.STATUSid
|
|---|
| 187 | LEFT JOIN PROMO_CODE pc ON pc.id = uo.PROMO_CODEid
|
|---|
| 188 | LEFT JOIN (
|
|---|
| 189 | SELECT user_orderid, COUNT(*) AS ticket_count
|
|---|
| 190 | FROM ticket
|
|---|
| 191 | GROUP BY user_orderid
|
|---|
| 192 | ) ts ON ts.user_orderid = uo.id
|
|---|
| 193 | LEFT JOIN (
|
|---|
| 194 | SELECT
|
|---|
| 195 | p.user_orderid,
|
|---|
| 196 | SUM(p.amount) FILTER (WHERE p.status = 'COMPLETED') AS paid_amount,
|
|---|
| 197 | MAX(p.status) AS payment_status,
|
|---|
| 198 | MAX(pm.method_name) AS payment_method
|
|---|
| 199 | FROM payment p
|
|---|
| 200 | LEFT JOIN payment_method pm ON pm.id = p.payment_methodid
|
|---|
| 201 | GROUP BY p.user_orderid
|
|---|
| 202 | ) ps ON ps.user_orderid = uo.id;
|
|---|
| 203 |
|
|---|
| 204 | SELECT * FROM view_user_order_summary WHERE user_id = 25679;
|
|---|
| 205 |
|
|---|
| 206 |
|
|---|
| 207 | -- Оригиналната верзија на погледот користеше subqueries кои ги
|
|---|
| 208 | -- агрегираа сите редови од табелите TICKET и PAYMENT пред да ги филтрираат,
|
|---|
| 209 | -- што резултираше со бавно извршување. Поради тоа прашалникот беше преуреден.
|
|---|
| 210 |
|
|---|
| 211 | ----------------------------- Преуреден View 7 -----------------------------
|
|---|
| 212 | CREATE OR REPLACE VIEW view_user_order_summary AS
|
|---|
| 213 | SELECT
|
|---|
| 214 | uo.id AS order_id,
|
|---|
| 215 | u.id AS user_id,
|
|---|
| 216 | u.first_name || ' ' || u.last_name AS customer_name,
|
|---|
| 217 | uo.order_date,
|
|---|
| 218 | uo.total_amount,
|
|---|
| 219 | s.status_name AS order_status,
|
|---|
| 220 | pc.code AS promo_code,
|
|---|
| 221 | pc.discount_percent,
|
|---|
| 222 | SUM(p.amount) FILTER (WHERE p.status = 'COMPLETED') AS paid_amount,
|
|---|
| 223 | MAX(p.status) AS payment_status,
|
|---|
| 224 | MAX(pm.method_name) AS payment_method,
|
|---|
| 225 | COUNT(DISTINCT t.id) AS ticket_count
|
|---|
| 226 | FROM USER_ORDER uo
|
|---|
| 227 | JOIN APP_USER u ON u.id = uo.APP_USERid
|
|---|
| 228 | JOIN STATUS s ON s.id = uo.STATUSid
|
|---|
| 229 | LEFT JOIN PROMO_CODE pc ON pc.id = uo.PROMO_CODEid
|
|---|
| 230 | LEFT JOIN PAYMENT p ON p.user_orderid = uo.id
|
|---|
| 231 | LEFT JOIN PAYMENT_METHOD pm ON pm.id = p.payment_methodid
|
|---|
| 232 | LEFT JOIN TICKET t ON t.user_orderid = uo.id
|
|---|
| 233 | GROUP BY uo.id, u.id, u.first_name, u.last_name,
|
|---|
| 234 | uo.order_date, uo.total_amount, s.status_name,
|
|---|
| 235 | pc.code, pc.discount_percent;
|
|---|
| 236 |
|
|---|
| 237 | SELECT * FROM view_user_order_summary WHERE user_id = 25679;
|
|---|
| 238 |
|
|---|
| 239 | -- Погледот ја прикажува целосната историја на нарачки за даден корисник — нарачки,
|
|---|
| 240 | -- плаќања, тикети и промо кодови. Се користи на страницата на профилот на корисникот и
|
|---|
| 241 | -- ја имплементира бизнис логиката за преглед на историја на купувања.
|
|---|
| 242 |
|
|---|
| 243 |
|
|---|
| 244 | ----------------------------- View 8: view_user_subscriptions_feed -----------------------------
|
|---|
| 245 | -- Приказ на настани само категориите на кои е претплатен корисникот
|
|---|
| 246 | CREATE VIEW view_user_subscriptions_feed AS
|
|---|
| 247 | SELECT
|
|---|
| 248 | u.id AS user_id,
|
|---|
| 249 | u.email,
|
|---|
| 250 | e.id AS event_id,
|
|---|
| 251 | e.title AS event_title,
|
|---|
| 252 | e.start_date,
|
|---|
| 253 | c.category_name AS category,
|
|---|
| 254 | sub.subcategory_name AS subcategory,
|
|---|
| 255 | 'CATEGORY' AS subscription_type
|
|---|
| 256 | FROM APP_USER u
|
|---|
| 257 | JOIN USER_CATEGORY_SUBSCRIPTION ucs ON ucs.APP_USERid = u.id
|
|---|
| 258 | JOIN CATEGORIZATION c ON c.id = ucs.CATEGORIZATIONid
|
|---|
| 259 | JOIN EVENT e ON e.CATEGORIZATIONid = c.id
|
|---|
| 260 | LEFT JOIN SUBCATEGORY sub ON sub.id = e.SUBCATEGORYid
|
|---|
| 261 | WHERE e.start_date >= CURRENT_DATE
|
|---|
| 262 |
|
|---|
| 263 | UNION
|
|---|
| 264 |
|
|---|
| 265 | SELECT
|
|---|
| 266 | u.id AS user_id,
|
|---|
| 267 | u.email,
|
|---|
| 268 | e.id AS event_id,
|
|---|
| 269 | e.title AS event_title,
|
|---|
| 270 | e.start_date,
|
|---|
| 271 | c.category_name AS category,
|
|---|
| 272 | sub.subcategory_name AS subcategory,
|
|---|
| 273 | 'SUBCATEGORY' AS subscription_type
|
|---|
| 274 | FROM APP_USER u
|
|---|
| 275 | JOIN USER_SUBCATEGORY_SUBSCRIPTION uss ON uss.APP_USERid = u.id
|
|---|
| 276 | JOIN SUBCATEGORY sub ON sub.id = uss.SUBCATEGORYid
|
|---|
| 277 | JOIN CATEGORIZATION c ON c.id = sub.CATEGORIZATIONid
|
|---|
| 278 | JOIN EVENT e ON e.SUBCATEGORYid = sub.id
|
|---|
| 279 | WHERE e.start_date >= CURRENT_DATE;
|
|---|
| 280 |
|
|---|
| 281 | SELECT *
|
|---|
| 282 | FROM view_user_subscriptions_feed
|
|---|
| 283 | WHERE user_id=24589;
|
|---|
| 284 |
|
|---|
| 285 | -- Погледот ги прикажува само идните настани од категориите и подкатегориите
|
|---|
| 286 | -- на кои е претплатен корисникот, комбинирајќи ги двата типа на претплати преку UNION.
|
|---|
| 287 | -- Се користи на персонализираниот feed на корисникот и
|
|---|
| 288 | -- ја имплементира бизнис логиката за приказ на релевантни настани според интересите на корисникот.
|
|---|
| 289 |
|
|---|
| 290 |
|
|---|
| 291 | ----------------------------- View 9: view_event_sales_report -----------------------------
|
|---|
| 292 | -- Финансиски извештај по настан (приходи, рефундации, пополнетост)
|
|---|
| 293 | CREATE VIEW view_event_sales_report AS
|
|---|
| 294 | SELECT
|
|---|
| 295 | e.id AS event_id,
|
|---|
| 296 | e.title,
|
|---|
| 297 | e.start_date,
|
|---|
| 298 | c.category_name AS category,
|
|---|
| 299 | COUNT(t.id) FILTER (WHERE t.status = 'ACTIVE') AS active_tickets,
|
|---|
| 300 | COUNT(t.id) FILTER (WHERE t.status = 'CANCELLED') AS cancelled_tickets,
|
|---|
| 301 | SUM(p.amount) FILTER (WHERE p.status = 'COMPLETED') AS total_revenue,
|
|---|
| 302 | SUM(rf.amount) FILTER (WHERE rf.status = 'APPROVED') AS total_refunded,
|
|---|
| 303 | SUM(p.amount) FILTER (WHERE p.status = 'COMPLETED') -
|
|---|
| 304 | SUM(rf.amount) FILTER (WHERE rf.status = 'APPROVED') AS net_revenue,
|
|---|
| 305 | SUM(h.capacity) AS total_capacity,
|
|---|
| 306 | ROUND(COUNT(t.id) FILTER (WHERE t.status = 'ACTIVE') * 100.0 /
|
|---|
| 307 | NULLIF(SUM(h.capacity), 0), 2) AS occupancy_percent
|
|---|
| 308 | FROM EVENT e
|
|---|
| 309 | LEFT JOIN CATEGORIZATION c ON c.id = e.CATEGORIZATIONid
|
|---|
| 310 | LEFT JOIN TICKET t ON t.EVENTid = e.id
|
|---|
| 311 | LEFT JOIN USER_ORDER uo ON uo.id = t.USER_ORDERid
|
|---|
| 312 | LEFT JOIN PAYMENT p ON p.USER_ORDERid = uo.id
|
|---|
| 313 | LEFT JOIN REFUND rf ON rf.PAYMENTid = p.id
|
|---|
| 314 | LEFT JOIN EVENT_HALL eh ON eh.EVENTid = e.id
|
|---|
| 315 | LEFT JOIN HALL h ON h.id = eh.HALLid
|
|---|
| 316 | GROUP BY e.id, e.title, e.start_date, c.category_name;
|
|---|
| 317 |
|
|---|
| 318 | SELECT *
|
|---|
| 319 | FROM view_event_sales_report
|
|---|
| 320 | WHERE event_id = 12455;
|
|---|
| 321 |
|
|---|
| 322 | -- Погледот прикажува комплетен финансиски извештај за даден настан — активни
|
|---|
| 323 | -- и откажани тикети, вкупен приход, рефундации, нето приход и процент на пополнетост.
|
|---|
| 324 | -- Се користи од страна на организаторите и администраторите за анализа на успешноста на настанот и
|
|---|
| 325 | -- ја имплементира бизнис логиката за финансиско известување. |
|---|