From dd806bbb1ecb153347239b2224ef7e34ad8b4e59 Mon Sep 17 00:00:00 2001 From: Wiktor Date: Thu, 19 Mar 2026 15:44:42 +0100 Subject: [PATCH] feat: create procedure for retrieving products --- i18n/migrations/20260319163200_procedures.sql | 224 ++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 i18n/migrations/20260319163200_procedures.sql diff --git a/i18n/migrations/20260319163200_procedures.sql b/i18n/migrations/20260319163200_procedures.sql new file mode 100644 index 0000000..b10e54d --- /dev/null +++ b/i18n/migrations/20260319163200_procedures.sql @@ -0,0 +1,224 @@ +-- +goose Up +DELIMITER // + +DROP PROCEDURE IF EXISTS get_full_product // + +CREATE PROCEDURE get_full_product( + IN p_id_product INT UNSIGNED, + IN p_id_shop INT UNSIGNED, + IN p_id_lang INT UNSIGNED, + IN p_id_customer INT UNSIGNED, + IN p_id_group INT UNSIGNED, + IN p_id_currency INT UNSIGNED, + IN p_id_country INT UNSIGNED, + IN p_quantity INT UNSIGNED +) +BEGIN + + DECLARE v_tax_rate DECIMAL(10,4) DEFAULT 0; + + SELECT COALESCE(t.rate, 0.0000) INTO v_tax_rate +FROM ps_tax_rule tr +INNER JOIN ps_tax t + ON t.id_tax = tr.id_tax +WHERE tr.id_tax_rules_group = ( + SELECT ps.id_tax_rules_group + FROM ps_product_shop ps + WHERE ps.id_product = p_id_product + AND ps.id_shop = p_id_shop + LIMIT 1 +) + AND tr.id_country = p_id_country +ORDER BY + tr.id_state DESC, + tr.zipcode_from != '' DESC, + tr.id_tax_rule DESC +LIMIT 1; + + /* FINAL JSON */ + SELECT JSON_OBJECT( + + /* ================= PRODUCT ================= */ + 'id_product', p.id_product, + 'reference', p.reference, + 'name', pl.name, + 'description', pl.description, + 'short_description', pl.description_short, + + /* ================= PRICE ================= */ + 'price', JSON_OBJECT( + 'base', COALESCE(ps.price, p.price), + + 'final_tax_excl', + ( + COALESCE(ps.price, p.price) + - IFNULL( + CASE + WHEN sp.reduction_type = 'amount' THEN sp.reduction + WHEN sp.reduction_type = 'percentage' THEN COALESCE(ps.price, p.price) * sp.reduction + ELSE 0 + END, 0 + ) + ), + + 'final_tax_incl', + ( + ( + COALESCE(ps.price, p.price) + - IFNULL( + CASE + WHEN sp.reduction_type = 'amount' THEN sp.reduction + WHEN sp.reduction_type = 'percentage' THEN COALESCE(ps.price, p.price) * sp.reduction + ELSE 0 + END, 0 + ) + ) * (1 + v_tax_rate / 100) + ) + ), + + /* ================= META ================= */ + 'active', COALESCE(ps.active, p.active), + 'visibility', COALESCE(ps.visibility, p.visibility), + 'manufacturer', m.name, + 'category', cl.name, + + /* ================= IMAGE ================= */ + 'cover_image', JSON_OBJECT( + 'id', i.id_image, + 'legend', il.legend + ), + + /* ================= FEATURES ================= */ + 'features', ( + SELECT JSON_ARRAYAGG( + JSON_OBJECT( + 'name', fl.name, + 'value', fvl.value + ) + ) + FROM ps_feature_product fp + JOIN ps_feature_lang fl + ON fl.id_feature = fp.id_feature AND fl.id_lang = p_id_lang + JOIN ps_feature_value_lang fvl + ON fvl.id_feature_value = fp.id_feature_value AND fvl.id_lang = p_id_lang + WHERE fp.id_product = p.id_product + ), + + /* ================= COMBINATIONS ================= */ + 'combinations', ( + SELECT JSON_ARRAYAGG( + JSON_OBJECT( + 'id_product_attribute', pa.id_product_attribute, + 'reference', pa.reference, + + 'price', JSON_OBJECT( + 'impact', COALESCE(pas.price, pa.price), + + 'final_tax_excl', + ( + COALESCE(ps.price, p.price) + + COALESCE(pas.price, pa.price) + ), + + 'final_tax_incl', + ( + ( + COALESCE(ps.price, p.price) + + COALESCE(pas.price, pa.price) + ) * (1 + v_tax_rate / 100) + ) + ), + + 'stock', IFNULL(sa.quantity, 0), + + 'default_on', pas.default_on, + + /* ATTRIBUTES JSON */ + 'attributes', ( + SELECT JSON_ARRAYAGG( + JSON_OBJECT( + 'group', agl.name, + 'attribute', al.name + ) + ) + FROM ps_product_attribute_combination pac + JOIN ps_attribute a ON a.id_attribute = pac.id_attribute + JOIN ps_attribute_lang al + ON al.id_attribute = a.id_attribute AND al.id_lang = p_id_lang + JOIN ps_attribute_group_lang agl + ON agl.id_attribute_group = a.id_attribute_group AND agl.id_lang = p_id_lang + WHERE pac.id_product_attribute = pa.id_product_attribute + ), + + /* IMAGES */ + 'images', ( + SELECT JSON_ARRAYAGG(img.id_image) + FROM ps_product_attribute_image pai + JOIN ps_image img ON img.id_image = pai.id_image + WHERE pai.id_product_attribute = pa.id_product_attribute + ) + + ) + ) + FROM ps_product_attribute pa + JOIN ps_product_attribute_shop pas + ON pas.id_product_attribute = pa.id_product_attribute + AND pas.id_shop = p_id_shop + LEFT JOIN ps_stock_available sa + ON sa.id_product = pa.id_product + AND sa.id_product_attribute = pa.id_product_attribute + AND sa.id_shop = p_id_shop + WHERE pa.id_product = p.id_product + ) + + ) AS product_json + + FROM ps_product p + + LEFT JOIN ps_product_shop ps + ON ps.id_product = p.id_product AND ps.id_shop = p_id_shop + + LEFT JOIN ps_product_lang pl + ON pl.id_product = p.id_product + AND pl.id_lang = p_id_lang + AND pl.id_shop = p_id_shop + + LEFT JOIN ps_category_lang cl + ON cl.id_category = COALESCE(ps.id_category_default, p.id_category_default) + AND cl.id_lang = p_id_lang + AND cl.id_shop = p_id_shop + + LEFT JOIN ps_manufacturer m + ON m.id_manufacturer = p.id_manufacturer + + LEFT JOIN ps_image i + ON i.id_product = p.id_product AND i.cover = 1 + + LEFT JOIN ps_image_lang il + ON il.id_image = i.id_image AND il.id_lang = p_id_lang + + /* SPECIFIC PRICE */ + LEFT JOIN ( + SELECT sp1.* + FROM ps_specific_price sp1 + WHERE sp1.id_product = p_id_product + AND (sp1.id_customer = 0 OR sp1.id_customer = p_id_customer) + AND (sp1.id_group = 0 OR sp1.id_group = p_id_group) + AND (sp1.id_currency = 0 OR sp1.id_currency = p_id_currency) + AND sp1.from_quantity <= p_quantity + ORDER BY + sp1.id_customer DESC, + sp1.id_group DESC, + sp1.from_quantity DESC, + sp1.id_specific_price DESC + LIMIT 1 + ) sp ON sp.id_product = p.id_product + + WHERE p.id_product = p_id_product + + LIMIT 1; + +END // + +DELIMITER ; +-- +goose Down