| 65 | | ==== View 1 |
| 66 | | |
| 67 | | // Простор за првиот view |
| 68 | | |
| 69 | | ## [source,sql] |
| 70 | | |
| 71 | | ## -- SQL код за View 1 |
| 72 | | |
| 73 | | ==== View 2 |
| 74 | | |
| 75 | | // Простор за вториот view |
| 76 | | |
| 77 | | ## [source,sql] |
| 78 | | |
| 79 | | ## -- SQL код за View 2 |
| 80 | | |
| 81 | | ==== View 3 |
| 82 | | |
| 83 | | // Простор за третиот view |
| 84 | | |
| 85 | | ## [source,sql] |
| 86 | | |
| 87 | | ## -- SQL код за View 3 |
| 88 | | |
| | 65 | == Views |
| | 66 | |
| | 67 | === View 1 |
| | 68 | |
| | 69 | _Мени со јадења_ |
| | 70 | |
| | 71 | [source,sql] |
| | 72 | ---- |
| | 73 | CREATE OR REPLACE VIEW kbnteam.v_menu_meal AS |
| | 74 | WITH meal_ingredients AS ( |
| | 75 | SELECT |
| | 76 | x.meal_id, |
| | 77 | string_agg(x.ingr_name, ', ' ORDER BY x.ingr_name) AS ingredients |
| | 78 | FROM ( |
| | 79 | SELECT DISTINCT |
| | 80 | mi.meal_id, |
| | 81 | i.ingr_name |
| | 82 | FROM kbnteam.meal_ingredient mi |
| | 83 | JOIN kbnteam.ingredient i ON i.ingr_id = mi.ingr_id |
| | 84 | ) x |
| | 85 | GROUP BY x.meal_id |
| | 86 | ), |
| | 87 | meal_allergens AS ( |
| | 88 | SELECT |
| | 89 | x.meal_id, |
| | 90 | string_agg(x.alergen_name, ', ' ORDER BY x.alergen_name) AS allergens |
| | 91 | FROM ( |
| | 92 | SELECT DISTINCT |
| | 93 | mi.meal_id, |
| | 94 | a.alergen_name |
| | 95 | FROM kbnteam.meal_ingredient mi |
| | 96 | JOIN kbnteam.alergen_ingredient ai ON ai.ingr_id = mi.ingr_id |
| | 97 | JOIN kbnteam.alergen a ON a.alergen_id = ai.alergen_id |
| | 98 | ) x |
| | 99 | GROUP BY x.meal_id |
| | 100 | ) |
| | 101 | SELECT |
| | 102 | m.meal_id, |
| | 103 | m.meal_name, |
| | 104 | m.meal_description, |
| | 105 | m.meal_price, |
| | 106 | m.meal_weight, |
| | 107 | c.cat_id, |
| | 108 | c.cat_name, |
| | 109 | r.rest_id, |
| | 110 | r.rest_name, |
| | 111 | COALESCE(mi.ingredients, '') AS ingredients, |
| | 112 | COALESCE(ma.allergens, '') AS allergens |
| | 113 | FROM kbnteam.meal m |
| | 114 | JOIN kbnteam.category c ON c.cat_id = m.cat_id |
| | 115 | JOIN kbnteam.restaurant r ON r.rest_id = m.rest_id |
| | 116 | LEFT JOIN meal_ingredients mi ON mi.meal_id = m.meal_id |
| | 117 | LEFT JOIN meal_allergens ma ON ma.meal_id = m.meal_id; |
| | 118 | ---- |
| | 119 | |
| | 120 | === View 2 |
| | 121 | |
| | 122 | _Целосен преглед на нарачките_ |
| | 123 | |
| | 124 | [source,sql] |
| | 125 | ---- |
| | 126 | CREATE OR REPLACE VIEW kbnteam.v_orders_full AS |
| | 127 | WITH order_meals AS ( |
| | 128 | SELECT |
| | 129 | x.order_id, |
| | 130 | string_agg(x.meal_name, ', ' ORDER BY x.meal_name) AS meals |
| | 131 | FROM ( |
| | 132 | SELECT DISTINCT |
| | 133 | om.order_id, |
| | 134 | m.meal_name |
| | 135 | FROM kbnteam.order_meal om |
| | 136 | JOIN kbnteam.meal m ON m.meal_id = om.meal_id |
| | 137 | ) x |
| | 138 | GROUP BY x.order_id |
| | 139 | ), |
| | 140 | order_drinks AS ( |
| | 141 | SELECT |
| | 142 | x.order_id, |
| | 143 | string_agg(x.drink_name, ', ' ORDER BY x.drink_name) AS drinks |
| | 144 | FROM ( |
| | 145 | SELECT DISTINCT |
| | 146 | od.order_id, |
| | 147 | d.drink_name |
| | 148 | FROM kbnteam.order_drink od |
| | 149 | JOIN kbnteam.drink d ON d.drink_id = od.drink_id |
| | 150 | ) x |
| | 151 | GROUP BY x.order_id |
| | 152 | ) |
| | 153 | SELECT |
| | 154 | o.order_id, |
| | 155 | o.order_datetime, |
| | 156 | o.order_total, |
| | 157 | os.o_status_name, |
| | 158 | cu.user_id AS customer_user_id, |
| | 159 | cu.company_id AS customer_company_id, |
| | 160 | au.user_first_name AS customer_first_name, |
| | 161 | au.user_last_name AS customer_last_name, |
| | 162 | au.user_email AS customer_email, |
| | 163 | co.comp_order_id, |
| | 164 | co.company_id AS order_company_id, |
| | 165 | cmp.company_name, |
| | 166 | d.delivery_id, |
| | 167 | d.delivery_date, |
| | 168 | ds.d_status_name, |
| | 169 | drv.user_id AS driver_user_id, |
| | 170 | du.user_first_name AS driver_first_name, |
| | 171 | du.user_last_name AS driver_last_name, |
| | 172 | du.user_phone_no AS driver_phone, |
| | 173 | COALESCE(om.meals, '') AS meals, |
| | 174 | COALESCE(od.drinks, '') AS drinks |
| | 175 | FROM kbnteam.customer_order o |
| | 176 | JOIN kbnteam.order_status os ON os.o_status_id = o.o_status_id |
| | 177 | JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id |
| | 178 | JOIN kbnteam.api_user au ON au.user_id = cu.user_id |
| | 179 | JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id |
| | 180 | JOIN kbnteam.company cmp ON cmp.company_id = co.company_id |
| | 181 | LEFT JOIN kbnteam.delivery d ON d.delivery_id = co.delivery_id |
| | 182 | LEFT JOIN kbnteam.delivery_status ds ON ds.d_status_id = d.d_status_id |
| | 183 | LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id |
| | 184 | LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id |
| | 185 | LEFT JOIN order_meals om ON om.order_id = o.order_id |
| | 186 | LEFT JOIN order_drinks od ON od.order_id = o.order_id; |
| | 187 | ---- |
| | 188 | |
| | 189 | === View 3 |
| | 190 | |
| | 191 | _Преглед на рецензиите_ |
| | 192 | |
| | 193 | [source,sql] |
| | 194 | ---- |
| | 195 | CREATE OR REPLACE VIEW kbnteam.v_reviews_full AS |
| | 196 | SELECT |
| | 197 | r.review_id, |
| | 198 | 'order'::text AS review_type, |
| | 199 | r.review_created_at, |
| | 200 | r.review_rating, |
| | 201 | r.review_comment, |
| | 202 | orv.order_id, |
| | 203 | NULL::integer AS delivery_id, |
| | 204 | co.company_id, |
| | 205 | cmp.company_name, |
| | 206 | au.user_id AS customer_user_id, |
| | 207 | au.user_first_name AS customer_first_name, |
| | 208 | au.user_last_name AS customer_last_name, |
| | 209 | NULL::integer AS driver_user_id, |
| | 210 | NULL::varchar(255) AS driver_first_name, |
| | 211 | NULL::varchar(255) AS driver_last_name, |
| | 212 | orv.order_review_food_rating, |
| | 213 | orv.order_review_res_rating, |
| | 214 | NULL::integer AS del_review_courier_rating, |
| | 215 | NULL::integer AS del_review_speed_rating |
| | 216 | FROM kbnteam.review r |
| | 217 | JOIN kbnteam.order_review orv ON orv.review_id = r.review_id |
| | 218 | JOIN kbnteam.customer_order o ON o.order_id = orv.order_id |
| | 219 | JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id |
| | 220 | JOIN kbnteam.api_user au ON au.user_id = cu.user_id |
| | 221 | JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id |
| | 222 | JOIN kbnteam.company cmp ON cmp.company_id = co.company_id |
| | 223 | |
| | 224 | UNION ALL |
| | 225 | |
| | 226 | SELECT |
| | 227 | r.review_id, |
| | 228 | 'delivery'::text AS review_type, |
| | 229 | r.review_created_at, |
| | 230 | r.review_rating, |
| | 231 | r.review_comment, |
| | 232 | NULL::integer AS order_id, |
| | 233 | drvrev.delivery_id, |
| | 234 | co.company_id, |
| | 235 | cmp.company_name, |
| | 236 | NULL::integer AS customer_user_id, |
| | 237 | NULL::varchar(255) AS customer_first_name, |
| | 238 | NULL::varchar(255) AS customer_last_name, |
| | 239 | du.user_id AS driver_user_id, |
| | 240 | du.user_first_name AS driver_first_name, |
| | 241 | du.user_last_name AS driver_last_name, |
| | 242 | NULL::integer AS order_review_food_rating, |
| | 243 | NULL::integer AS order_review_res_rating, |
| | 244 | drvrev.del_review_courier_rating, |
| | 245 | drvrev.del_review_speed_rating |
| | 246 | FROM kbnteam.review r |
| | 247 | JOIN kbnteam.delivery_review drvrev ON drvrev.review_id = r.review_id |
| | 248 | JOIN kbnteam.delivery d ON d.delivery_id = drvrev.delivery_id |
| | 249 | LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id |
| | 250 | LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id |
| | 251 | LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id |
| | 252 | LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id; |
| | 253 | ---- |
| | 254 | |
| | 255 | === View 4 |
| | 256 | |
| | 257 | _Мени со пијалоци_ |
| | 258 | |
| | 259 | [source,sql] |
| | 260 | ---- |
| | 261 | CREATE OR REPLACE VIEW kbnteam.v_menu_drink AS |
| | 262 | SELECT |
| | 263 | d.drink_id, |
| | 264 | d.drink_name, |
| | 265 | d.drink_milliliters, |
| | 266 | d.drink_price, |
| | 267 | r.rest_id, |
| | 268 | r.rest_name |
| | 269 | FROM kbnteam.drink d |
| | 270 | JOIN kbnteam.restaurant r ON r.rest_id = d.rest_id; |
| | 271 | ---- |
| | 272 | |
| | 273 | === View 5 |
| | 274 | |
| | 275 | _Преглед на фактурирањето на компаниите_ |
| | 276 | |
| | 277 | [source,sql] |
| | 278 | ---- |
| | 279 | CREATE OR REPLACE VIEW kbnteam.v_company_billing_overview AS |
| | 280 | WITH company_contracts AS ( |
| | 281 | SELECT |
| | 282 | ct.company_id, |
| | 283 | COUNT(*) AS contract_count |
| | 284 | FROM kbnteam.contract ct |
| | 285 | GROUP BY ct.company_id |
| | 286 | ), |
| | 287 | invoice_totals AS ( |
| | 288 | SELECT |
| | 289 | i.invoice_id, |
| | 290 | i.comp_order_id, |
| | 291 | co.company_id, |
| | 292 | co.delivery_id, |
| | 293 | COUNT(o.order_id) AS customer_order_count, |
| | 294 | COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS invoice_amount |
| | 295 | FROM kbnteam.invoice i |
| | 296 | JOIN kbnteam.company_order co ON co.comp_order_id = i.comp_order_id |
| | 297 | LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id |
| | 298 | GROUP BY i.invoice_id, i.comp_order_id, co.company_id, co.delivery_id |
| | 299 | ) |
| | 300 | SELECT |
| | 301 | it.invoice_id, |
| | 302 | it.comp_order_id, |
| | 303 | cmp.company_id, |
| | 304 | cmp.company_name, |
| | 305 | cmp.company_address, |
| | 306 | it.delivery_id, |
| | 307 | it.customer_order_count, |
| | 308 | it.invoice_amount, |
| | 309 | COALESCE(cc.contract_count, 0) AS contract_count |
| | 310 | FROM invoice_totals it |
| | 311 | JOIN kbnteam.company cmp ON cmp.company_id = it.company_id |
| | 312 | LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id; |
| | 313 | ---- |
| | 314 | |
| | 315 | === View 6 |
| | 316 | |
| | 317 | _Приходи според договорите_ |
| | 318 | |
| | 319 | [source,sql] |
| | 320 | ---- |
| | 321 | CREATE OR REPLACE VIEW kbnteam.v_contracts_revenue AS |
| | 322 | WITH order_restaurants AS ( |
| | 323 | SELECT DISTINCT |
| | 324 | om.order_id, |
| | 325 | m.rest_id |
| | 326 | FROM kbnteam.order_meal om |
| | 327 | JOIN kbnteam.meal m ON m.meal_id = om.meal_id |
| | 328 | |
| | 329 | UNION |
| | 330 | |
| | 331 | SELECT DISTINCT |
| | 332 | od.order_id, |
| | 333 | d.rest_id |
| | 334 | FROM kbnteam.order_drink od |
| | 335 | JOIN kbnteam.drink d ON d.drink_id = od.drink_id |
| | 336 | ), |
| | 337 | contract_metrics AS ( |
| | 338 | SELECT |
| | 339 | co.company_id, |
| | 340 | orr.rest_id, |
| | 341 | COUNT(DISTINCT co.comp_order_id) AS company_order_count, |
| | 342 | COUNT(DISTINCT o.order_id) AS customer_order_count, |
| | 343 | COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS total_revenue |
| | 344 | FROM kbnteam.customer_order o |
| | 345 | JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id |
| | 346 | JOIN order_restaurants orr ON orr.order_id = o.order_id |
| | 347 | GROUP BY co.company_id, orr.rest_id |
| | 348 | ) |
| | 349 | SELECT |
| | 350 | ct.contract_id, |
| | 351 | cmp.company_id, |
| | 352 | cmp.company_name, |
| | 353 | r.rest_id, |
| | 354 | r.rest_name, |
| | 355 | cs.contract_status_name, |
| | 356 | ct.contract_start_date, |
| | 357 | ct.contract_end_date, |
| | 358 | COALESCE(cm.company_order_count, 0) AS company_order_count, |
| | 359 | COALESCE(cm.customer_order_count, 0) AS customer_order_count, |
| | 360 | COALESCE(cm.total_revenue, 0)::numeric(14,2) AS total_revenue |
| | 361 | FROM kbnteam.contract ct |
| | 362 | JOIN kbnteam.company cmp ON cmp.company_id = ct.company_id |
| | 363 | JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id |
| | 364 | JOIN kbnteam.contract_status cs ON cs.contract_status_id = ct.contract_status_id |
| | 365 | LEFT JOIN contract_metrics cm |
| | 366 | ON cm.company_id = ct.company_id |
| | 367 | AND cm.rest_id = ct.rest_id; |
| | 368 | ---- |
| | 369 | |
| | 370 | === View 7 |
| | 371 | |
| | 372 | _Преглед на лојалноста на клиентите_ |
| | 373 | |
| | 374 | [source,sql] |
| | 375 | ---- |
| | 376 | CREATE OR REPLACE VIEW kbnteam.v_customer_loyalty_full_v2 AS |
| | 377 | WITH order_stats AS ( |
| | 378 | SELECT |
| | 379 | o.customer_user_id, |
| | 380 | COUNT(*) AS order_count, |
| | 381 | COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS total_spent, |
| | 382 | MAX(o.order_datetime) AS last_order_at |
| | 383 | FROM kbnteam.customer_order o |
| | 384 | GROUP BY o.customer_user_id |
| | 385 | ) |
| | 386 | SELECT |
| | 387 | cl.cus_loyalty_id, |
| | 388 | cl.user_id AS customer_user_id, |
| | 389 | cu.company_id, |
| | 390 | cmp.company_name, |
| | 391 | au.user_first_name, |
| | 392 | au.user_last_name, |
| | 393 | au.user_email, |
| | 394 | au.user_phone_no, |
| | 395 | cl.cus_loyalty_curr_points, |
| | 396 | cl.cus_loyalty_joined_at, |
| | 397 | cls.cus_loyalty_status_id, |
| | 398 | cls.cus_loyalty_status_name, |
| | 399 | lt.tier_id, |
| | 400 | lt.tier_name, |
| | 401 | lt.tier_discount_percentage, |
| | 402 | lt.tier_free_delivery_eligibility, |
| | 403 | lt.tier_priority_support, |
| | 404 | COALESCE(os.order_count, 0) AS order_count, |
| | 405 | COALESCE(os.total_spent, 0)::numeric(14,2) AS total_spent, |
| | 406 | os.last_order_at |
| | 407 | FROM kbnteam.customer_loyalty cl |
| | 408 | JOIN kbnteam.customer cu |
| | 409 | ON cu.user_id = cl.user_id |
| | 410 | JOIN kbnteam.company cmp |
| | 411 | ON cmp.company_id = cu.company_id |
| | 412 | JOIN kbnteam.api_user au |
| | 413 | ON au.user_id = cl.user_id |
| | 414 | JOIN kbnteam.customer_loyalty_status cls |
| | 415 | ON cls.cus_loyalty_status_id = cl.cus_loyalty_status_id |
| | 416 | JOIN kbnteam.loyalty_tier lt |
| | 417 | ON lt.tier_id = cl.tier_id |
| | 418 | LEFT JOIN order_stats os |
| | 419 | ON os.customer_user_id = cl.user_id; |
| | 420 | ---- |
| | 421 | |
| | 422 | === View 8 |
| | 423 | |
| | 424 | _Преглед на доставите на доставувачите_ |
| | 425 | |
| | 426 | [source,sql] |
| | 427 | ---- |
| | 428 | CREATE OR REPLACE VIEW kbnteam.v_driver_deliveries AS |
| | 429 | WITH order_meals AS ( |
| | 430 | SELECT |
| | 431 | x.order_id, |
| | 432 | string_agg(x.meal_name, ', ' ORDER BY x.meal_name) AS meals |
| | 433 | FROM ( |
| | 434 | SELECT DISTINCT |
| | 435 | om.order_id, |
| | 436 | m.meal_name |
| | 437 | FROM kbnteam.order_meal om |
| | 438 | JOIN kbnteam.meal m ON m.meal_id = om.meal_id |
| | 439 | ) x |
| | 440 | GROUP BY x.order_id |
| | 441 | ), |
| | 442 | order_drinks AS ( |
| | 443 | SELECT |
| | 444 | x.order_id, |
| | 445 | string_agg(x.drink_name, ', ' ORDER BY x.drink_name) AS drinks |
| | 446 | FROM ( |
| | 447 | SELECT DISTINCT |
| | 448 | od.order_id, |
| | 449 | d.drink_name |
| | 450 | FROM kbnteam.order_drink od |
| | 451 | JOIN kbnteam.drink d ON d.drink_id = od.drink_id |
| | 452 | ) x |
| | 453 | GROUP BY x.order_id |
| | 454 | ) |
| | 455 | SELECT |
| | 456 | d.delivery_id, |
| | 457 | d.delivery_date, |
| | 458 | d.delivery_notes, |
| | 459 | ds.d_status_name, |
| | 460 | drv.user_id AS driver_user_id, |
| | 461 | du.user_first_name AS driver_first_name, |
| | 462 | du.user_last_name AS driver_last_name, |
| | 463 | du.user_phone_no AS driver_phone, |
| | 464 | r.rest_id, |
| | 465 | r.rest_name, |
| | 466 | co.comp_order_id, |
| | 467 | cmp.company_id, |
| | 468 | cmp.company_name, |
| | 469 | o.order_id, |
| | 470 | o.order_datetime, |
| | 471 | o.order_total, |
| | 472 | cu.user_id AS customer_user_id, |
| | 473 | au.user_first_name AS customer_first_name, |
| | 474 | au.user_last_name AS customer_last_name, |
| | 475 | au.user_email AS customer_email, |
| | 476 | COALESCE(om.meals, '') AS meals, |
| | 477 | COALESCE(od.drinks, '') AS drinks |
| | 478 | FROM kbnteam.delivery d |
| | 479 | JOIN kbnteam.delivery_status ds ON ds.d_status_id = d.d_status_id |
| | 480 | LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id |
| | 481 | LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id |
| | 482 | LEFT JOIN kbnteam.restaurant r ON r.rest_id = drv.rest_id |
| | 483 | LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id |
| | 484 | LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id |
| | 485 | LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id |
| | 486 | LEFT JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id |
| | 487 | LEFT JOIN kbnteam.api_user au ON au.user_id = cu.user_id |
| | 488 | LEFT JOIN order_meals om ON om.order_id = o.order_id |
| | 489 | LEFT JOIN order_drinks od ON od.order_id = o.order_id; |
| | 490 | ---- |
| | 491 | |
| | 492 | === View 9 |
| | 493 | |
| | 494 | _Термини за ручек на доставувачите_ |
| | 495 | |
| | 496 | [source,sql] |
| | 497 | ---- |
| | 498 | CREATE OR REPLACE VIEW kbnteam.v_driver_lunch_timers AS |
| | 499 | SELECT |
| | 500 | lt.lunch_time_id, |
| | 501 | lt.lunch_weekday, |
| | 502 | lt.lunch_start, |
| | 503 | lt.lunch_end, |
| | 504 | lt.lunch_preorder_offset, |
| | 505 | lt.comp_order_id, |
| | 506 | ct.contract_id, |
| | 507 | cmp.company_id, |
| | 508 | cmp.company_name, |
| | 509 | r.rest_id, |
| | 510 | r.rest_name, |
| | 511 | drv.user_id AS driver_user_id, |
| | 512 | au.user_first_name AS driver_first_name, |
| | 513 | au.user_last_name AS driver_last_name, |
| | 514 | au.user_phone_no AS driver_phone |
| | 515 | FROM kbnteam.lunch_time lt |
| | 516 | JOIN kbnteam.contract ct ON ct.contract_id = lt.contract_id |
| | 517 | JOIN kbnteam.company cmp ON cmp.company_id = ct.company_id |
| | 518 | JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id |
| | 519 | JOIN kbnteam.driver drv ON drv.rest_id = r.rest_id |
| | 520 | JOIN kbnteam.api_user au ON au.user_id = drv.user_id; |
| | 521 | ---- |
| | 522 | |