| | 1 | = Складирани процедури и функции = |
| | 2 | |
| | 3 | == Пресметка на вкупен приход за период == |
| | 4 | |
| | 5 | === Опис === |
| | 6 | |
| | 7 | Функцијата го пресметува вкупниот приход за даден период. |
| | 8 | |
| | 9 | === Имплементација === |
| | 10 | |
| | 11 | {{{ |
| | 12 | CREATE OR REPLACE FUNCTION get_total_revenue( |
| | 13 | p_start_date DATE, |
| | 14 | p_end_date DATE |
| | 15 | ) |
| | 16 | RETURNS NUMERIC AS $$ |
| | 17 | DECLARE |
| | 18 | total NUMERIC; |
| | 19 | BEGIN |
| | 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; |
| | 27 | END; |
| | 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 | {{{ |
| | 43 | CREATE OR REPLACE FUNCTION get_daily_procurement_budget() |
| | 44 | RETURNS NUMERIC AS $$ |
| | 45 | DECLARE |
| | 46 | total_cost NUMERIC := 0; |
| | 47 | rec RECORD; |
| | 48 | BEGIN |
| | 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; |
| | 63 | END; |
| | 64 | $$ LANGUAGE plpgsql; |
| | 65 | |
| | 66 | -- Употреба: |
| | 67 | -- SELECT get_daily_procurement_budget(); |
| | 68 | }}} |
| | 69 | |
| | 70 | == Затворање на смена со автоматска пресметка == |
| | 71 | |
| | 72 | === Опис === |
| | 73 | |
| | 74 | Процедурата ја затвора активната смена и ги пресметува вкупниот приход и бројот на нарачки. |
| | 75 | |
| | 76 | === Имплементација === |
| | 77 | |
| | 78 | {{{ |
| | 79 | CREATE OR REPLACE PROCEDURE close_current_shift( |
| | 80 | p_closed_by INT |
| | 81 | ) |
| | 82 | LANGUAGE plpgsql |
| | 83 | AS $$ |
| | 84 | DECLARE |
| | 85 | v_shift_id INT; |
| | 86 | v_start_time TIMESTAMP; |
| | 87 | v_total NUMERIC; |
| | 88 | v_order_count INT; |
| | 89 | BEGIN |
| | 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; |
| | 112 | END; |
| | 113 | $$; |
| | 114 | |
| | 115 | -- Употреба: |
| | 116 | -- CALL close_current_shift(1); |
| | 117 | }}} |
| | 118 | |
| | 119 | == Препорака за набавка на производи под минимум == |
| | 120 | |
| | 121 | === Опис === |
| | 122 | |
| | 123 | Функцијата враќа листа на производи под минималното ниво со препорачана количина за набавка. |
| | 124 | |
| | 125 | === Имплементација === |
| | 126 | |
| | 127 | {{{ |
| | 128 | CREATE OR REPLACE FUNCTION get_procurement_recommendations() |
| | 129 | RETURNS 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 $$ |
| | 137 | BEGIN |
| | 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; |
| | 153 | END; |
| | 154 | $$ LANGUAGE plpgsql; |
| | 155 | |
| | 156 | -- Употреба: |
| | 157 | -- SELECT * FROM get_procurement_recommendations(); |
| | 158 | }}} |