== Додавање на продукт Оваа функционалност овозможува додавање на нов продукт во системот. = Функција fn_validate_seller_package Проверува дали продавачот има право да објавува продукти. * Проверува дали корисникот постои и е активен. * Проверува дали корисникот е верифициран. * Проверува дали корисникот има активен пакет чиј период на важност не е истечен. {{{ CREATE OR REPLACE FUNCTION fn_validate_seller_package(p_seller_id INT) RETURNS VOID LANGUAGE plpgsql AS $$ begin IF NOT EXISTS ( SELECT 1 FROM appuser WHERE user_id = p_seller_id AND is_active = 1 ) THEN RAISE EXCEPTION 'Sellerot ne postoi ili ne e aktiven'; END IF; IF NOT EXISTS ( SELECT 1 FROM appuser WHERE user_id = p_seller_id AND is_verified = 1 ) THEN RAISE EXCEPTION 'Sellerot ne e verificiran'; END IF; IF NOT EXISTS ( SELECT 1 FROM userpackages WHERE seller_id = p_seller_id AND CURRENT_TIMESTAMP BETWEEN start_date AND end_date ) THEN RAISE EXCEPTION 'Sellerot nema aktiven paket (istecen ili ne postoi)'; END IF; END; $$; }}} = Функција fn_validate_product_attribute Валидира парови атрибут:вредност * Проверува дали атрибутот е дефиниран за категоријата во која припаѓа продуктот. * Проверува дали внесената вредност е една од дозволените вредности за атрибутот. {{{ CREATE OR REPLACE FUNCTION fn_validate_product_attribute( p_category_id INT, p_category_attribute_id INT, p_attribute_value VARCHAR ) RETURNS VOID LANGUAGE plpgsql AS $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM categoryattributes WHERE category_attribute_id = p_category_attribute_id AND category_id = p_category_id ) THEN RAISE EXCEPTION 'Atributot % ne pripagja na kategorijata', p_category_attribute_id; END IF; IF NOT EXISTS ( SELECT 1 FROM categoryattributesvalues WHERE category_attribute_id = p_category_attribute_id AND allowed_value = p_attribute_value ) THEN RAISE EXCEPTION 'Vrednosta % ne pripagja na atributot', p_attribute_value; END IF; END; $$; }}} = Процедура add_product Додава нов продукт во системот заедно со неговите атрибути, статистики и слики. {{{ CREATE OR REPLACE PROCEDURE add_product( p_title VARCHAR, p_description VARCHAR, p_price NUMERIC, p_location VARCHAR, p_currency VARCHAR, p_category_id INT, p_seller_id INT, p_quantity INT, p_attributes JSONB, -- ex. '[{"category_attribute_id": 11, "attribute_value": "M"}, ...]' p_images TEXT[] -- ex. ARRAY['url1.jpg', 'url2.jpg'] ) LANGUAGE plpgsql AS $$ DECLARE v_product_id INT; v_attr JSONB; v_image TEXT; begin -- Validacii IF p_price <= 0 THEN RAISE EXCEPTION 'Cenata mora da e pogolema od 0'; END IF; IF p_quantity < 0 THEN RAISE EXCEPTION 'Kolichinata ne moze da e negativna'; END IF; IF EXISTS ( SELECT 1 FROM category WHERE parent_category = p_category_id ) THEN RAISE EXCEPTION 'Kategorijata mora da e leaf kategorija'; END IF; --FUNKCIJA KORISNIK perform fn_validate_seller_package(p_seller_id); -- Insert produkt INSERT INTO product (title, description, price, "location" , category_id, seller_id, created_at, is_active, currency, quantity) VALUES ( p_title, p_description, p_price, p_location, p_category_id, p_seller_id, CURRENT_TIMESTAMP, CASE WHEN p_quantity > 0 THEN TRUE ELSE FALSE END, p_currency, p_quantity ) RETURNING product_id INTO v_product_id; -- Insert productstats (pochetni vrednosti) INSERT INTO productstats (product_id, views_count, favorites_count, sells_count) VALUES (v_product_id, 0, 0, 0); -- Insert atributi funkcija IF p_attributes IS NOT NULL then FOR v_attr IN SELECT value FROM jsonb_array_elements(p_attributes) LOOP PERFORM fn_validate_product_attribute( p_category_id, (v_attr->>'category_attribute_id')::INT, v_attr->>'attribute_value' ); INSERT INTO productattributes (product_id, category_attribute_id, attribute_value) VALUES (v_product_id, (v_attr->>'category_attribute_id')::INT, v_attr->>'attribute_value'); END LOOP; END IF; -- Insert sliki IF p_images IS NOT NULL THEN FOREACH v_image IN ARRAY p_images LOOP INSERT INTO productimages (product_id, image_url) VALUES (v_product_id, v_image); END LOOP; END IF; RAISE NOTICE 'Produktot e dodaden so ID: %', v_product_id; end; $$; }}} == Управување со кошничка Оваа функционалност овозможува додавање, бришење и ажурирање на продукти во кошничката. = Функција fn_validate_product_stock Проверува дали постои доволна количина од избраниот продукт за извршување на бараната операција. {{{ CREATE OR REPLACE FUNCTION fn_validate_product_stock( p_product_id INT, p_quantity INT ) RETURNS VOID LANGUAGE plpgsql AS $$ DECLARE all_stock INT; BEGIN SELECT quantity INTO all_stock FROM product WHERE product_id = p_product_id AND is_active = TRUE; IF NOT FOUND THEN RAISE EXCEPTION 'Produktot ne postoi ili ne e aktiven'; END IF; IF p_quantity > all_stock THEN RAISE EXCEPTION 'Nema dovolno zaliha. Barate: %, dostapno: %', p_quantity, all_stock; END IF; END; $$; }}} = Функција fn_calc_cart_total Ја пресметува вкупната вредност на кошничката. {{{ CREATE OR REPLACE FUNCTION fn_calc_cart_total(p_cart_id INT) RETURNS INT LANGUAGE plpgsql AS $$ DECLARE v_total INT; BEGIN SELECT COALESCE(SUM(quantity * price_at_time), 0) INTO v_total FROM cartitems WHERE cart_id = p_cart_id; RETURN v_total; END; $$; }}}