Changes between Version 16 and Version 17 of DatabaseProgramming


Ignore:
Timestamp:
06/14/26 16:41:23 (3 days ago)
Author:
231072
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v16 v17  
    568568$$;
    569569}}}
     570
     571
     572== Тригери
     573
     574= trg_notify_payment_success
     575
     576Цел: автоматски после успешно плаќање, генерира нотификација до корисникот дека плаќањето е успешно завршено.
     577
     578{{{CREATE OR REPLACE FUNCTION fn_notify_payment_success()
     579RETURNS TRIGGER LANGUAGE plpgsql AS $$
     580BEGIN
     581    INSERT INTO notifications (user_id, type, title, message, order_id)
     582    VALUES (
     583        NEW.user_id,
     584        'PAYMENT',
     585        'Uspeshno plakjanje',
     586        'Vashata narachka #' || NEW.order_id || ' e uspeshno platena.',
     587        NEW.order_id
     588    );
     589    RETURN NEW;
     590END;
     591$$;
     592
     593CREATE TRIGGER trg_notify_payment_success
     594AFTER INSERT ON payment
     595FOR EACH ROW
     596EXECUTE FUNCTION fn_notify_payment_success();
     597}}}
     598
     599
     600=  trg_notify_order_status
     601
     602Цел: известување на купувачот кога ќе се промени статусот на нарачката.
     603
     604{{{
     605CREATE OR REPLACE FUNCTION fn_notify_order_status_change()
     606RETURNS TRIGGER LANGUAGE plpgsql AS $$
     607BEGIN
     608    IF OLD.status IS NOT DISTINCT FROM NEW.status THEN
     609        RETURN NEW;
     610    END IF;
     611
     612    INSERT INTO notifications (user_id, type, title, message, order_id)
     613    VALUES (
     614        NEW.buyer_id,
     615        'ORDER_STATUS',
     616        'Promena na status',
     617        'Narachkata #' || NEW.order_id || ' e sega: ' || NEW.status || '.',
     618        NEW.order_id
     619    );
     620
     621    RETURN NEW;
     622END;
     623$$;
     624
     625CREATE TRIGGER trg_notify_order_status
     626AFTER UPDATE OF status ON "order"
     627FOR EACH ROW
     628EXECUTE FUNCTION fn_notify_order_status_change();
     629
     630}}}
     631
     632
     633
     634
     635
     636= trg_prevent_over_selling
     637
     638Цел: спречување на продажба на производи за кои нема доволно залиха(двојна нарачка).
     639
     640{{{
     641CREATE OR REPLACE FUNCTION trg_prevent_over_selling()
     642RETURNS TRIGGER
     643LANGUAGE plpgsql
     644AS $$
     645DECLARE
     646    v_stock INT;
     647BEGIN
     648
     649    -- земи тековна залиха
     650    SELECT quantity
     651    INTO v_stock
     652    FROM product
     653    WHERE product_id = NEW.product_id;
     654
     655    -- ако нема продукт
     656    IF NOT FOUND THEN
     657        RAISE EXCEPTION 'Product % does not exist', NEW.product_id;
     658    END IF;
     659
     660    -- ако нема доволно залиха
     661    IF v_stock < NEW.quantity THEN
     662        RAISE EXCEPTION
     663        'Not enough stock for product %. Available: %, Requested: %',
     664        NEW.product_id, v_stock, NEW.quantity;
     665    END IF;
     666
     667    RETURN NEW;
     668END;
     669$$;
     670}}}