Changes between Initial Version and Version 1 of AdvancedDatabaseDevelopment1


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

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedDatabaseDevelopment1

    v1 v1  
     1= Тригери =
     2
     3== Автоматско ажурирање на статус на маса при креирање на нарачка ==
     4
     5=== Опис ===
     6
     7Кога келнерот креира нова нарачка за одредена маса, статусот на масата автоматски се менува во „ЗАФАТЕНА". Ова спречува две нарачки да бидат креирани за иста маса во исто време.
     8
     9=== Имплементација ===
     10
     11{{{
     12CREATE OR REPLACE FUNCTION trg_order_insert_update_table()
     13RETURNS TRIGGER AS $$
     14BEGIN
     15    UPDATE project.restaurant_table
     16    SET status = 'ЗАФАТЕНА'
     17    WHERE table_id = NEW.table_id
     18      AND status = 'СЛОБОДНА';
     19   
     20    IF NOT FOUND THEN
     21        RAISE EXCEPTION 'Масата % е веќе зафатена или неактивна', NEW.table_id;
     22    END IF;
     23   
     24    RETURN NEW;
     25END;
     26$$ LANGUAGE plpgsql;
     27
     28CREATE TRIGGER trg_order_insert
     29AFTER INSERT ON project.orders
     30FOR EACH ROW
     31EXECUTE FUNCTION trg_order_insert_update_table();
     32}}}
     33
     34== Автоматско ослободување на маса при плаќање ==
     35
     36=== Опис ===
     37
     38Кога нарачката ќе биде платена, статусот на масата автоматски се враќа во „СЛОБОДНА".
     39
     40=== Имплементација ===
     41
     42{{{
     43CREATE OR REPLACE FUNCTION trg_payment_release_table()
     44RETURNS TRIGGER AS $$
     45BEGIN
     46    UPDATE project.restaurant_table
     47    SET status = 'СЛОБОДНА'
     48    WHERE table_id = (
     49        SELECT table_id FROM project.orders WHERE order_id = NEW.order_id
     50    );
     51   
     52    UPDATE project.orders
     53    SET status = 'ПЛАТЕНА'
     54    WHERE order_id = NEW.order_id;
     55   
     56    RETURN NEW;
     57END;
     58$$ LANGUAGE plpgsql;
     59
     60CREATE TRIGGER trg_payment_insert
     61AFTER INSERT ON project.payment
     62FOR EACH ROW
     63EXECUTE FUNCTION trg_payment_release_table();
     64}}}
     65
     66== Автоматско намалување на залиха при продажба ==
     67
     68=== Опис ===
     69
     70При додавање на ставка во нарачка, залихата на производот автоматски се намалува. Ако залихата е недоволна, трансакцијата се отфрла.
     71
     72=== Имплементација ===
     73
     74{{{
     75CREATE OR REPLACE FUNCTION trg_order_item_update_inventory()
     76RETURNS TRIGGER AS $$
     77DECLARE
     78    current_stock INTEGER;
     79BEGIN
     80    SELECT COALESCE(SUM(quantity_change), 0) INTO current_stock
     81    FROM project.inventory
     82    WHERE product_id = NEW.product_id;
     83   
     84    IF current_stock < NEW.quantity THEN
     85        RAISE EXCEPTION 'Недоволна залиха за производ %. Достапно: %, Побарувано: %',
     86            NEW.product_id, current_stock, NEW.quantity;
     87    END IF;
     88   
     89    INSERT INTO project.inventory (product_id, quantity_change, operation_type)
     90    VALUES (NEW.product_id, -NEW.quantity, 'ПРОДАЖБА');
     91   
     92    RETURN NEW;
     93END;
     94$$ LANGUAGE plpgsql;
     95
     96CREATE TRIGGER trg_order_item_inventory
     97AFTER INSERT ON project.order_item
     98FOR EACH ROW
     99EXECUTE FUNCTION trg_order_item_update_inventory();
     100}}}
     101
     102== Контрола на залиха со дозволен минимум ==
     103
     104=== Опис ===
     105
     106При секое движење на залиха, системот проверува дали залихата е под минималното ниво. Ако е под минимум, се евидентира предупредување во `audit_log`.
     107
     108=== Имплементација ===
     109
     110{{{
     111CREATE OR REPLACE FUNCTION trg_inventory_check_min_stock()
     112RETURNS TRIGGER AS $$
     113DECLARE
     114    current_stock INTEGER;
     115    min_stock_level INTEGER;
     116    product_name TEXT;
     117BEGIN
     118    SELECT COALESCE(SUM(quantity_change), 0) INTO current_stock
     119    FROM project.inventory
     120    WHERE product_id = NEW.product_id;
     121   
     122    SELECT p.min_stock, p.name INTO min_stock_level, product_name
     123    FROM project.product p
     124    WHERE p.product_id = NEW.product_id;
     125   
     126    IF current_stock < min_stock_level THEN
     127        INSERT INTO project.audit_log (user_id, action, entity_name)
     128        VALUES (
     129            1,
     130            'LOW_STOCK: ' || product_name || ' (' || current_stock || '/' || min_stock_level || ')',
     131            'PRODUCT'
     132        );
     133    END IF;
     134   
     135    RETURN NEW;
     136END;
     137$$ LANGUAGE plpgsql;
     138
     139CREATE TRIGGER trg_inventory_min_stock
     140AFTER INSERT ON project.inventory
     141FOR EACH ROW
     142EXECUTE FUNCTION trg_inventory_check_min_stock();
     143}}}
     144
     145== Автоматско затворање на смена при плаќање ==
     146
     147=== Опис ===
     148
     149При затворање на смена, системот автоматски ги пресметува вкупниот приход и бројот на нарачки.
     150
     151=== Имплементација ===
     152
     153{{{
     154CREATE OR REPLACE FUNCTION trg_shift_close_calculate()
     155RETURNS TRIGGER AS $$
     156DECLARE
     157    total_amount NUMERIC;
     158    order_count_val INTEGER;
     159    shift_start TIMESTAMP;
     160BEGIN
     161    SELECT start_time INTO shift_start
     162    FROM project.shift
     163    WHERE end_time IS NULL
     164    LIMIT 1;
     165   
     166    SELECT COUNT(*), COALESCE(SUM(p.amount), 0)
     167    INTO order_count_val, total_amount
     168    FROM project.orders o
     169    JOIN project.payment p ON p.order_id = o.order_id
     170    WHERE o.status = 'ПЛАТЕНА'
     171      AND o.created_at >= shift_start;
     172   
     173    NEW.total := total_amount;
     174    NEW.order_count := order_count_val;
     175    NEW.closed_at := NOW();
     176   
     177    RETURN NEW;
     178END;
     179$$ LANGUAGE plpgsql;
     180
     181CREATE TRIGGER trg_shift_close
     182BEFORE INSERT ON project.shift_close
     183FOR EACH ROW
     184EXECUTE FUNCTION trg_shift_close_calculate();
     185}}}
     186
     187== Превенција на бришење на нарачки со историја на плаќање ==
     188
     189=== Опис ===
     190
     191Спречува бришење на нарачки кои имаат поврзани плаќања.
     192
     193=== Имплементација ===
     194
     195{{{
     196CREATE OR REPLACE FUNCTION trg_prevent_order_delete()
     197RETURNS TRIGGER AS $$
     198BEGIN
     199    IF EXISTS (SELECT 1 FROM project.payment WHERE order_id = OLD.order_id) THEN
     200        RAISE EXCEPTION 'Не може да се избрише нарачка % бидејќи има поврзано плаќање.', OLD.order_id;
     201    END IF;
     202   
     203    RETURN OLD;
     204END;
     205$$ LANGUAGE plpgsql;
     206
     207CREATE TRIGGER trg_prevent_order_delete
     208BEFORE DELETE ON project.orders
     209FOR EACH ROW
     210EXECUTE FUNCTION trg_prevent_order_delete();
     211}}}
     212
     213== Автоматско логирање на промени во audit_log ==
     214
     215=== Опис ===
     216
     217При секое креирање, измена или бришење на нарачка, системот автоматски додава запис во `audit_log`.
     218
     219=== Имплементација ===
     220
     221{{{
     222CREATE OR REPLACE FUNCTION trg_audit_log_changes()
     223RETURNS TRIGGER AS $$
     224BEGIN
     225    IF TG_OP = 'INSERT' THEN
     226        INSERT INTO project.audit_log (user_id, action, entity_name)
     227        VALUES (NEW.user_id, 'CREATE_ORDER', 'ORDERS');
     228    ELSIF TG_OP = 'UPDATE' THEN
     229        INSERT INTO project.audit_log (user_id, action, entity_name)
     230        VALUES (NEW.user_id, 'UPDATE_ORDER', 'ORDERS');
     231    ELSIF TG_OP = 'DELETE' THEN
     232        INSERT INTO project.audit_log (user_id, action, entity_name)
     233        VALUES (OLD.user_id, 'DELETE_ORDER', 'ORDERS');
     234    END IF;
     235   
     236    RETURN COALESCE(NEW, OLD);
     237END;
     238$$ LANGUAGE plpgsql;
     239
     240CREATE TRIGGER trg_audit_orders
     241AFTER INSERT OR UPDATE OR DELETE ON project.orders
     242FOR EACH ROW
     243EXECUTE FUNCTION trg_audit_log_changes();
     244}}}