Changes between Initial Version and Version 1 of AdvancedDatabaseDevelopment2


Ignore:
Timestamp:
09/24/26 02:13:14 (7 days ago)
Author:
201178
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedDatabaseDevelopment2

    v1 v1  
     1= Складирани процедури и функции =
     2
     3== Пресметка на вкупен приход за период ==
     4
     5=== Опис ===
     6
     7Функцијата го пресметува вкупниот приход за даден период.
     8
     9=== Имплементација ===
     10
     11{{{
     12CREATE OR REPLACE FUNCTION get_total_revenue(
     13    p_start_date DATE,
     14    p_end_date DATE
     15)
     16RETURNS NUMERIC AS $$
     17DECLARE
     18    total NUMERIC;
     19BEGIN
     20    SELECT COALESCE(SUM(p.amount), 0) INTO total
     21    FROM project.payment p
     22    JOIN project.orders o ON o.order_id = p.order_id
     23    WHERE o.status = 'ПЛАТЕНА'
     24      AND DATE(p.payment_date) BETWEEN p_start_date AND p_end_date;
     25   
     26    RETURN total;
     27END;
     28$$ LANGUAGE plpgsql;
     29
     30-- Употреба:
     31-- SELECT get_total_revenue('2026-07-01', '2026-07-31');
     32}}}
     33
     34== Пресметка на дневен буџет за набавка ==
     35
     36=== Опис ===
     37
     38Функцијата го пресметува препорачаниот дневен буџет за набавка на производи под минималното ниво.
     39
     40=== Имплементација ===
     41
     42{{{
     43CREATE OR REPLACE FUNCTION get_daily_procurement_budget()
     44RETURNS NUMERIC AS $$
     45DECLARE
     46    total_cost NUMERIC := 0;
     47    rec RECORD;
     48BEGIN
     49    FOR rec IN
     50        SELECT p.product_id, p.name, p.min_stock,
     51               COALESCE(SUM(i.quantity_change), 0) AS current_stock,
     52               p.min_stock - COALESCE(SUM(i.quantity_change), 0) AS shortage
     53        FROM project.product p
     54        LEFT JOIN project.inventory i ON i.product_id = p.product_id
     55        WHERE p.active = TRUE
     56        GROUP BY p.product_id, p.name, p.min_stock
     57        HAVING COALESCE(SUM(i.quantity_change), 0) < p.min_stock
     58    LOOP
     59        total_cost := total_cost + (rec.shortage * 10);
     60    END LOOP;
     61   
     62    RETURN total_cost;
     63END;
     64$$ LANGUAGE plpgsql;
     65
     66-- Употреба:
     67-- SELECT get_daily_procurement_budget();
     68}}}
     69
     70== Затворање на смена со автоматска пресметка ==
     71
     72=== Опис ===
     73
     74Процедурата ја затвора активната смена и ги пресметува вкупниот приход и бројот на нарачки.
     75
     76=== Имплементација ===
     77
     78{{{
     79CREATE OR REPLACE PROCEDURE close_current_shift(
     80    p_closed_by INT
     81)
     82LANGUAGE plpgsql
     83AS $$
     84DECLARE
     85    v_shift_id INT;
     86    v_start_time TIMESTAMP;
     87    v_total NUMERIC;
     88    v_order_count INT;
     89BEGIN
     90    SELECT shift_id, start_time INTO v_shift_id, v_start_time
     91    FROM project.shift
     92    WHERE end_time IS NULL
     93    LIMIT 1;
     94   
     95    IF v_shift_id IS NULL THEN
     96        RAISE EXCEPTION 'Нема активна смена.';
     97    END IF;
     98   
     99    SELECT COUNT(*), COALESCE(SUM(p.amount), 0)
     100    INTO v_order_count, v_total
     101    FROM project.orders o
     102    JOIN project.payment p ON p.order_id = o.order_id
     103    WHERE o.status = 'ПЛАТЕНА'
     104      AND o.created_at >= v_start_time;
     105   
     106    INSERT INTO project.shift_close (closed_by, total, order_count)
     107    VALUES (p_closed_by, v_total, v_order_count);
     108   
     109    UPDATE project.shift
     110    SET end_time = NOW()
     111    WHERE shift_id = v_shift_id;
     112END;
     113$$;
     114
     115-- Употреба:
     116-- CALL close_current_shift(1);
     117}}}
     118
     119== Препорака за набавка на производи под минимум ==
     120
     121=== Опис ===
     122
     123Функцијата враќа листа на производи под минималното ниво со препорачана количина за набавка.
     124
     125=== Имплементација ===
     126
     127{{{
     128CREATE OR REPLACE FUNCTION get_procurement_recommendations()
     129RETURNS TABLE (
     130    product_id INT,
     131    product_name TEXT,
     132    category_name TEXT,
     133    current_stock NUMERIC,
     134    min_stock INT,
     135    recommended_order NUMERIC
     136) AS $$
     137BEGIN
     138    RETURN QUERY
     139    SELECT
     140        p.product_id,
     141        p.name::TEXT AS product_name,
     142        c.name::TEXT AS category_name,
     143        COALESCE(SUM(i.quantity_change), 0) AS current_stock,
     144        p.min_stock,
     145        (p.min_stock * 2 - COALESCE(SUM(i.quantity_change), 0)) AS recommended_order
     146    FROM project.product p
     147    JOIN project.category c ON c.category_id = p.category_id
     148    LEFT JOIN project.inventory i ON i.product_id = p.product_id
     149    WHERE p.active = TRUE
     150    GROUP BY p.product_id, p.name, c.name, p.min_stock
     151    HAVING COALESCE(SUM(i.quantity_change), 0) < p.min_stock
     152    ORDER BY recommended_order DESC;
     153END;
     154$$ LANGUAGE plpgsql;
     155
     156-- Употреба:
     157-- SELECT * FROM get_procurement_recommendations();
     158}}}