feat: create procedure for retrieving products
This commit is contained in:
224
i18n/migrations/20260319163200_procedures.sql
Normal file
224
i18n/migrations/20260319163200_procedures.sql
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user