Changes between Version 13 and Version 14 of DatabaseProgramming


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

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v13 v14  
    326326
    327327
    328 
     328== Купување на производи
     329
     330Оваа функционалност овозможува корисникот да ја претвори содржината на кошничката во нарачка.
     331
     332
     333= Функција fn_reduce_product_stock
     334
     335Ја намалува количината на залиха на продукт по успешно купување.
     336
     337
     338{{{
     339CREATE OR REPLACE FUNCTION fn_reduce_product_stock(
     340    p_product_id INT,
     341    p_quantity INT
     342)
     343RETURNS VOID
     344LANGUAGE plpgsql
     345AS $$
     346BEGIN
     347
     348    UPDATE product
     349    SET quantity = quantity - p_quantity
     350    WHERE product_id = p_product_id;
     351   --ako e 0 da go deaktivira
     352
     353END;
     354$$;
     355}}}
     356
     357
     358
     359= Процедура buy_from_cart
     360
     361Го реализира процесот на купување на сите производи кои се наоѓаат во кошничката на корисникот.
     362
     363* Намалување на залиха - за секој производ во кошничката се повикува: fn_reduce_product_stock(...)
     364* Креирање на нарачка - во табелата Order се внесува нов запис
     365* Креирање на ставки на нарачка - сите производи од кошничката(CartItems) се префрлаат во табелата OrderItems.
     366* Ажурирање на статистика - во табелата ProductStats се зголемува полето: sells_count
     367* Евидентирање на плаќање - се креира запис во табелата Payment
     368* Креирање трансакции
     369* За секој продавач кој има продадени производи во нарачката се креира запис во табелата Transactions.
     370* Reset на кошничка
     371
     372
     373{{{
     374CREATE OR REPLACE PROCEDURE buy_from_cart(
     375    p_buyer_id       INT,
     376    p_payment_method VARCHAR,
     377    OUT p_order_id   INT,
     378    OUT p_payment_id INT
     379)
     380LANGUAGE plpgsql
     381AS $$
     382DECLARE
     383    v_cart_id      INT;
     384    v_total        DECIMAL(10,2);
     385    v_item_count   INT;
     386    v_updated_rows INT;
     387BEGIN
     388    -- Najdi kosnicka
     389    SELECT cart_id INTO v_cart_id
     390    FROM cart
     391    WHERE user_id = p_buyer_id;
     392
     393    IF NOT FOUND THEN
     394        RAISE EXCEPTION 'Kosnickata ne postoi';
     395    END IF;
     396
     397    -- Dali ima stavki?
     398    SELECT COUNT(*) INTO v_item_count
     399    FROM cartitems
     400    WHERE cart_id = v_cart_id;
     401
     402    IF v_item_count = 0 THEN
     403        RAISE EXCEPTION 'Kosnickata e prazna';
     404    END IF;
     405   
     406   --ja prezemame total price
     407        select total_price INTO v_total
     408    from cart c
     409    where c.cart_id = v_cart_id;
     410   
     411
     412    -- Proverka na zaliha
     413--      PERFORM fn_validate_product_stock(
     414--    ci.product_id,
     415--    ci.quantity
     416--      )
     417--      FROM cartitems ci
     418--      WHERE ci.cart_id = v_cart_id;
     419
     420        --1. Chim ima na zaliha namali na kolichina
     421        PERFORM fn_reduce_product_stock(
     422    ci.product_id,
     423    ci.quantity
     424        )
     425        FROM cartitems ci
     426        WHERE ci.cart_id = v_cart_id;
     427
     428
     429
     430
     431    -- 2. Kreiraj narachka
     432    INSERT INTO "Order" (buyer_id, cart_id, total_price, status, created_at)
     433    VALUES (p_buyer_id, v_cart_id, v_total, 'CONFIRMED', CURRENT_TIMESTAMP)
     434    RETURNING order_id INTO p_order_id;
     435
     436    -- 3. Prefrli stavki vo OrderItems
     437    INSERT INTO orderitems (order_id, product_id, seller_id, price_at_time, quantity)
     438    SELECT
     439        p_order_id,
     440        ci.product_id,
     441        p.seller_id,
     442        ci.price_at_time,
     443        ci.quantity
     444    FROM cartitems ci
     445    JOIN product p ON p.product_id = ci.product_id
     446    WHERE ci.cart_id = v_cart_id;
     447
     448
     449    -- 4. Azuriraj sells_count
     450    UPDATE productstats ps
     451    SET sells_count = ps.sells_count + ci.quantity
     452    FROM cartitems ci
     453    WHERE ci.cart_id = v_cart_id
     454      AND ps.product_id = ci.product_id;
     455
     456    -- 5. Plakjanje
     457    INSERT INTO payment (user_id, order_id, package_id, amount, payment_method, transaction_date)
     458    VALUES (p_buyer_id, p_order_id, NULL, v_total, p_payment_method, CURRENT_DATE)
     459    RETURNING payment_id INTO p_payment_id;
     460
     461    -- 6. Transactions po prodavach
     462    INSERT INTO transactions (payment_id, seller_id, amount, status, transaction_date)
     463    SELECT
     464        p_payment_id,
     465        oi.seller_id,
     466        SUM(oi.price_at_time * oi.quantity),
     467        'COMPLETED',
     468        CURRENT_DATE
     469    FROM orderitems oi
     470    WHERE oi.order_id = p_order_id
     471    GROUP BY oi.seller_id;
     472
     473    -- 7. Isprazni kosnicka
     474    DELETE FROM cartitems
     475    WHERE cart_id = v_cart_id;
     476   
     477   UPDATE cart
     478    SET total_price = fn_calc_cart_total(p_cart_id)
     479    WHERE cart_id = v_cart_id;
     480
     481END;
     482$$;
     483}}}