Changes between Version 13 and Version 14 of RelationalDesign


Ignore:
Timestamp:
09/13/26 22:54:15 (2 weeks ago)
Author:
223235
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • RelationalDesign

    v13 v14  
    6363Потребно е да се направат три погледи (views) по член, така што тие подоцна реално ќе бидат користени од апликацијата.
    6464
    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----
     73CREATE OR REPLACE VIEW kbnteam.v_menu_meal AS
     74WITH 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),
     87meal_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)
     101SELECT
     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
     113FROM kbnteam.meal m
     114JOIN kbnteam.category c ON c.cat_id = m.cat_id
     115JOIN kbnteam.restaurant r ON r.rest_id = m.rest_id
     116LEFT JOIN meal_ingredients mi ON mi.meal_id = m.meal_id
     117LEFT JOIN meal_allergens ma ON ma.meal_id = m.meal_id;
     118----
     119
     120=== View 2
     121
     122_Целосен преглед на нарачките_
     123
     124[source,sql]
     125----
     126CREATE OR REPLACE VIEW kbnteam.v_orders_full AS
     127WITH 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),
     140order_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)
     153SELECT
     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
     175FROM kbnteam.customer_order o
     176JOIN kbnteam.order_status os ON os.o_status_id = o.o_status_id
     177JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id
     178JOIN kbnteam.api_user au ON au.user_id = cu.user_id
     179JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id
     180JOIN kbnteam.company cmp ON cmp.company_id = co.company_id
     181LEFT JOIN kbnteam.delivery d ON d.delivery_id = co.delivery_id
     182LEFT JOIN kbnteam.delivery_status ds ON ds.d_status_id = d.d_status_id
     183LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id
     184LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id
     185LEFT JOIN order_meals om ON om.order_id = o.order_id
     186LEFT JOIN order_drinks od ON od.order_id = o.order_id;
     187----
     188
     189=== View 3
     190
     191_Преглед на рецензиите_
     192
     193[source,sql]
     194----
     195CREATE OR REPLACE VIEW kbnteam.v_reviews_full AS
     196SELECT
     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
     216FROM kbnteam.review r
     217JOIN kbnteam.order_review orv ON orv.review_id = r.review_id
     218JOIN kbnteam.customer_order o ON o.order_id = orv.order_id
     219JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id
     220JOIN kbnteam.api_user au ON au.user_id = cu.user_id
     221JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id
     222JOIN kbnteam.company cmp ON cmp.company_id = co.company_id
     223
     224UNION ALL
     225
     226SELECT
     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
     246FROM kbnteam.review r
     247JOIN kbnteam.delivery_review drvrev ON drvrev.review_id = r.review_id
     248JOIN kbnteam.delivery d ON d.delivery_id = drvrev.delivery_id
     249LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id
     250LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id
     251LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id
     252LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id;
     253----
     254
     255=== View 4
     256
     257_Мени со пијалоци_
     258
     259[source,sql]
     260----
     261CREATE OR REPLACE VIEW kbnteam.v_menu_drink AS
     262SELECT
     263    d.drink_id,
     264    d.drink_name,
     265    d.drink_milliliters,
     266    d.drink_price,
     267    r.rest_id,
     268    r.rest_name
     269FROM kbnteam.drink d
     270JOIN kbnteam.restaurant r ON r.rest_id = d.rest_id;
     271----
     272
     273=== View 5
     274
     275_Преглед на фактурирањето на компаниите_
     276
     277[source,sql]
     278----
     279CREATE OR REPLACE VIEW kbnteam.v_company_billing_overview AS
     280WITH 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),
     287invoice_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)
     300SELECT
     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
     310FROM invoice_totals it
     311JOIN kbnteam.company cmp ON cmp.company_id = it.company_id
     312LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id;
     313----
     314
     315=== View 6
     316
     317_Приходи според договорите_
     318
     319[source,sql]
     320----
     321CREATE OR REPLACE VIEW kbnteam.v_contracts_revenue AS
     322WITH 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),
     337contract_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)
     349SELECT
     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
     361FROM kbnteam.contract ct
     362JOIN kbnteam.company cmp ON cmp.company_id = ct.company_id
     363JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id
     364JOIN kbnteam.contract_status cs ON cs.contract_status_id = ct.contract_status_id
     365LEFT 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----
     376CREATE OR REPLACE VIEW kbnteam.v_customer_loyalty_full_v2 AS
     377WITH 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)
     386SELECT
     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
     407FROM kbnteam.customer_loyalty cl
     408JOIN kbnteam.customer cu
     409    ON cu.user_id = cl.user_id
     410JOIN kbnteam.company cmp
     411    ON cmp.company_id = cu.company_id
     412JOIN kbnteam.api_user au
     413    ON au.user_id = cl.user_id
     414JOIN kbnteam.customer_loyalty_status cls
     415    ON cls.cus_loyalty_status_id = cl.cus_loyalty_status_id
     416JOIN kbnteam.loyalty_tier lt
     417    ON lt.tier_id = cl.tier_id
     418LEFT 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----
     428CREATE OR REPLACE VIEW kbnteam.v_driver_deliveries AS
     429WITH 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),
     442order_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)
     455SELECT
     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
     478FROM kbnteam.delivery d
     479JOIN kbnteam.delivery_status ds ON ds.d_status_id = d.d_status_id
     480LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id
     481LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id
     482LEFT JOIN kbnteam.restaurant r ON r.rest_id = drv.rest_id
     483LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id
     484LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id
     485LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id
     486LEFT JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id
     487LEFT JOIN kbnteam.api_user au ON au.user_id = cu.user_id
     488LEFT JOIN order_meals om ON om.order_id = o.order_id
     489LEFT JOIN order_drinks od ON od.order_id = o.order_id;
     490----
     491
     492=== View 9
     493
     494_Термини за ручек на доставувачите_
     495
     496[source,sql]
     497----
     498CREATE OR REPLACE VIEW kbnteam.v_driver_lunch_timers AS
     499SELECT
     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
     515FROM kbnteam.lunch_time lt
     516JOIN kbnteam.contract ct ON ct.contract_id = lt.contract_id
     517JOIN kbnteam.company cmp ON cmp.company_id = ct.company_id
     518JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id
     519JOIN kbnteam.driver drv ON drv.rest_id = r.rest_id
     520JOIN kbnteam.api_user au ON au.user_id = drv.user_id;
     521----
     522