wiki:AdvancedDatabaseDevelopment3

Version 1 (modified by 201178, 7 days ago) ( diff )

--

Погледи

Целосен преглед на нарачки

Опис

Погледот прикажува целосен преглед на сите нарачки со детали за масата, келнерот, плаќањето и вкупниот износ.

Имплементација

CREATE OR REPLACE VIEW v_orders_full AS
SELECT 
    o.order_id,
    o.created_at,
    o.status AS order_status,
    rt.table_number,
    rt.capacity,
    u.first_name || ' ' || u.last_name AS waiter_name,
    r.role_name AS waiter_role,
    p.amount AS total_paid,
    p.method AS payment_method,
    p.payment_date,
    i.invoice_number,
    i.issued_at,
    COUNT(oi.item_number) AS total_items,
    SUM(oi.quantity) AS total_quantity
FROM project.orders o
JOIN project.restaurant_table rt ON rt.table_id = o.table_id
JOIN project.app_user u ON u.user_id = o.user_id
JOIN project.role r ON r.role_id = u.role_id
LEFT JOIN project.payment p ON p.order_id = o.order_id
LEFT JOIN project.invoice i ON i.payment_id = p.payment_id
LEFT JOIN project.order_item oi ON oi.order_id = o.order_id
GROUP BY o.order_id, o.created_at, o.status, rt.table_number, rt.capacity,
         u.first_name, u.last_name, r.role_name,
         p.amount, p.method, p.payment_date,
         i.invoice_number, i.issued_at
ORDER BY o.created_at DESC;

Преглед на маси со нивниот статус

Опис

Погледот прикажува сите маси со нивниот статус и активна нарачка (ако има).

Имплементација

CREATE OR REPLACE VIEW v_tables_status AS
SELECT 
    rt.table_id,
    rt.table_number,
    rt.capacity,
    rt.status,
    o.order_id AS active_order_id,
    o.created_at AS order_time,
    u.first_name || ' ' || u.last_name AS waiter_name,
    COUNT(oi.item_number) AS items_in_order
FROM project.restaurant_table rt
LEFT JOIN project.orders o ON o.table_id = rt.table_id AND o.status != 'ПЛАТЕНА'
LEFT JOIN project.app_user u ON u.user_id = o.user_id
LEFT JOIN project.order_item oi ON oi.order_id = o.order_id
GROUP BY rt.table_id, rt.table_number, rt.capacity, rt.status,
         o.order_id, o.created_at, u.first_name, u.last_name
ORDER BY rt.table_number::int;

Месечен приход по категорија

Опис

Погледот го прикажува месечниот приход групиран по категорија.

Имплементација

CREATE OR REPLACE VIEW v_monthly_revenue_by_category AS
SELECT 
    TO_CHAR(o.created_at, 'YYYY-MM') AS month,
    c.category_id,
    c.name AS category_name,
    COUNT(DISTINCT o.order_id) AS order_count,
    SUM(oi.quantity) AS items_sold,
    SUM(oi.quantity * oi.unit_price) AS total_revenue,
    ROUND(AVG(oi.quantity * oi.unit_price), 2) AS avg_item_price
FROM project.orders o
JOIN project.order_item oi ON oi.order_id = o.order_id
JOIN project.product p ON p.product_id = oi.product_id
JOIN project.category c ON c.category_id = p.category_id
WHERE o.status = 'ПЛАТЕНА'
GROUP BY TO_CHAR(o.created_at, 'YYYY-MM'), c.category_id, c.name
ORDER BY month DESC, total_revenue DESC;

Извештај за најпродавани производи

Опис

Погледот ги прикажува најпродаваните производи со вкупна количина и приход.

Имплементација

CREATE OR REPLACE VIEW v_top_products AS
SELECT 
    p.product_id,
    p.name AS product_name,
    c.name AS category_name,
    p.price AS current_price,
    COUNT(DISTINCT oi.order_id) AS order_count,
    SUM(oi.quantity) AS total_quantity,
    SUM(oi.quantity * oi.unit_price) AS total_revenue,
    ROUND(AVG(oi.unit_price), 2) AS avg_selling_price
FROM project.product p
JOIN project.category c ON c.category_id = p.category_id
LEFT JOIN project.order_item oi ON oi.product_id = p.product_id
LEFT JOIN project.orders o ON o.order_id = oi.order_id AND o.status = 'ПЛАТЕНА'
WHERE p.active = TRUE
GROUP BY p.product_id, p.name, c.name, p.price
ORDER BY total_revenue DESC NULLS LAST;

Дневен извештај за продажба

Опис

Погледот прикажува дневен извештај за продажбата со вкупен приход, број на нарачки и просечна вредност.

Имплементација

CREATE OR REPLACE VIEW v_daily_sales AS
SELECT 
    DATE(o.created_at) AS sale_date,
    TO_CHAR(o.created_at, 'Day') AS day_of_week,
    COUNT(DISTINCT o.order_id) AS order_count,
    COUNT(DISTINCT o.table_id) AS tables_used,
    COUNT(DISTINCT o.user_id) AS waiters_active,
    SUM(p.amount) AS total_revenue,
    ROUND(AVG(p.amount), 2) AS avg_order_value,
    SUM(CASE WHEN p.method = 'КЕШ' THEN p.amount ELSE 0 END) AS cash_revenue,
    SUM(CASE WHEN p.method = 'КАРТИЧКА' THEN p.amount ELSE 0 END) AS card_revenue
FROM project.orders o
JOIN project.payment p ON p.order_id = o.order_id
WHERE o.status = 'ПЛАТЕНА'
GROUP BY DATE(o.created_at), TO_CHAR(o.created_at, 'Day')
ORDER BY sale_date DESC;

Преглед на залиха по производ

Опис

Погледот прикажува моментална залиха за секој производ со статус (ОК, НИСКО, КРИТИЧНО).

Имплементација

CREATE OR REPLACE VIEW v_product_stock AS
SELECT 
    p.product_id,
    p.name AS product_name,
    c.name AS category_name,
    p.min_stock,
    COALESCE(SUM(i.quantity_change), 0) AS current_stock,
    CASE 
        WHEN COALESCE(SUM(i.quantity_change), 0) <= 0 THEN 'КРИТИЧНО'
        WHEN COALESCE(SUM(i.quantity_change), 0) < p.min_stock THEN 'НИСКО'
        ELSE 'ОК'
    END AS stock_status,
    MAX(i.created_at) AS last_movement
FROM project.product p
JOIN project.category c ON c.category_id = p.category_id
LEFT JOIN project.inventory i ON i.product_id = p.product_id
WHERE p.active = TRUE
GROUP BY p.product_id, p.name, c.name, p.min_stock
ORDER BY stock_status, current_stock ASC;
Note: See TracWiki for help on using the wiki.