225 lines
7.3 KiB
SQL
225 lines
7.3 KiB
SQL
-- +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
|