diff --git a/bruno/api_v1/customer/Set is_no_vat.yml b/bruno/api_v1/customer/Set is_no_vat.yml index c159ad3..eaa70ff 100644 --- a/bruno/api_v1/customer/Set is_no_vat.yml +++ b/bruno/api_v1/customer/Set is_no_vat.yml @@ -5,7 +5,14 @@ info: http: method: PATCH - url: "{{bas_url" + url: "{{bas_url}}/restricted/customer/no-vat" + body: + type: json + data: |- + { + "customer_id":1, + "is_no_vat": false + } auth: inherit settings: diff --git a/i18n/migrations/20260319163200_procedures.sql b/i18n/migrations/20260319163200_procedures.sql index 267985a..b823a3a 100644 --- a/i18n/migrations/20260319163200_procedures.sql +++ b/i18n/migrations/20260319163200_procedures.sql @@ -16,6 +16,7 @@ READS SQL DATA BEGIN DECLARE v_tax_rate DECIMAL(10,4) DEFAULT 0; + DECLARE v_tax_group INT; DECLARE v_base_raw DECIMAL(20,6); DECLARE v_base DECIMAL(20,6); @@ -29,45 +30,54 @@ BEGIN DECLARE v_has_specific INT DEFAULT 0; - -- currency DECLARE v_target_currency BIGINT; DECLARE v_target_rate DECIMAL(13,6) DEFAULT 1; DECLARE v_specific_rate DECIMAL(13,6) DEFAULT 1; + DECLARE v_is_no_vat TINYINT DEFAULT 0; + SET p_id_product_attribute = NULLIF(p_id_product_attribute, 0); + -- ================= CUSTOMER VAT ================= + SELECT COALESCE(c.is_no_vat, 0) + INTO v_is_no_vat + FROM b2b_customers c + WHERE c.id = p_id_customer + LIMIT 1; + + -- ================= TAX GROUP ================= + SELECT ps.id_tax_rules_group + INTO v_tax_group + FROM ps_product_shop ps + WHERE ps.id_product = p_id_product + AND ps.id_shop = p_id_shop + LIMIT 1; + -- ================= TAX ================= SELECT COALESCE(t.rate, 0) INTO v_tax_rate FROM ps_tax_rule tr JOIN ps_tax t ON t.id_tax = tr.id_tax LEFT JOIN b2b_countries c ON c.id = p_id_country - 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 = c.ps_id_country + WHERE tr.id_tax_rules_group = v_tax_group + AND tr.id_country = c.ps_id_country LIMIT 1; - -- ================= TARGET CURRENCY ================= - SELECT c.b2b_id_currency - INTO v_target_currency + IF v_is_no_vat = 1 THEN + SET v_tax_rate = 0; + END IF; + + -- ================= CURRENCY ================= + SELECT c.b2b_id_currency, r.conversion_rate + INTO v_target_currency, v_target_rate FROM b2b_countries c + LEFT JOIN b2b_currency_rates r + ON r.b2b_id_currency = c.b2b_id_currency WHERE c.id = p_id_country - LIMIT 1; - - -- latest target rate - SELECT r.conversion_rate - INTO v_target_rate - FROM b2b_currency_rates r - WHERE r.b2b_id_currency = v_target_currency ORDER BY r.created_at DESC LIMIT 1; - -- ================= BASE PRICE (RAW) ================= + -- ================= BASE PRICE ================= SELECT COALESCE(ps.price, p.price) + COALESCE(pas.price, 0) INTO v_base_raw @@ -79,8 +89,8 @@ BEGIN AND pas.id_shop = p_id_shop WHERE p.id_product = p_id_product; - -- convert base to target currency SET v_base = v_base_raw * v_target_rate; + SET v_excl = v_base; -- ================= RULE SELECTION ================= SELECT @@ -99,71 +109,67 @@ BEGIN FROM b2b_specific_price bsp + LEFT JOIN b2b_specific_price_product spp + ON spp.b2b_specific_price_id = bsp.id + AND spp.id_product = p_id_product + + LEFT JOIN b2b_specific_price_product_attribute spa + ON spa.b2b_specific_price_id = bsp.id + AND spa.id_product_attribute = p_id_product_attribute + + LEFT JOIN b2b_specific_price_customer spc + ON spc.b2b_specific_price_id = bsp.id + AND spc.b2b_id_customer = p_id_customer + + LEFT JOIN b2b_specific_price_country spco + ON spco.b2b_specific_price_id = bsp.id + AND spco.b2b_id_country = p_id_country + + LEFT JOIN b2b_specific_price_category spcat + ON spcat.b2b_specific_price_id = bsp.id + + LEFT JOIN ps_category_product cp + ON cp.id_category = spcat.id_category + AND cp.id_product = p_id_product + WHERE bsp.is_active = 1 AND bsp.from_quantity <= p_quantity - -- intersection rules (unchanged) - AND ( - NOT EXISTS (SELECT 1 FROM b2b_specific_price_product x WHERE x.b2b_specific_price_id = bsp.id) - OR EXISTS (SELECT 1 FROM b2b_specific_price_product x WHERE x.b2b_specific_price_id = bsp.id AND x.id_product = p_id_product) - ) + AND (spp.id_product IS NOT NULL OR NOT EXISTS ( + SELECT 1 FROM b2b_specific_price_product x WHERE x.b2b_specific_price_id = bsp.id + )) - AND ( - NOT EXISTS (SELECT 1 FROM b2b_specific_price_product_attribute x WHERE x.b2b_specific_price_id = bsp.id) - OR EXISTS (SELECT 1 FROM b2b_specific_price_product_attribute x WHERE x.b2b_specific_price_id = bsp.id AND x.id_product_attribute = p_id_product_attribute) - ) + AND (spa.id_product_attribute IS NOT NULL OR NOT EXISTS ( + SELECT 1 FROM b2b_specific_price_product_attribute x WHERE x.b2b_specific_price_id = bsp.id + )) - AND ( - NOT EXISTS (SELECT 1 FROM b2b_specific_price_category x WHERE x.b2b_specific_price_id = bsp.id) - OR EXISTS ( - SELECT 1 FROM b2b_specific_price_category x - JOIN ps_category_product cp ON cp.id_category = x.id_category - WHERE x.b2b_specific_price_id = bsp.id AND cp.id_product = p_id_product - ) - ) + AND (spc.b2b_id_customer IS NOT NULL OR NOT EXISTS ( + SELECT 1 FROM b2b_specific_price_customer x WHERE x.b2b_specific_price_id = bsp.id + )) - AND ( - NOT EXISTS (SELECT 1 FROM b2b_specific_price_customer x WHERE x.b2b_specific_price_id = bsp.id) - OR EXISTS (SELECT 1 FROM b2b_specific_price_customer x WHERE x.b2b_specific_price_id = bsp.id AND x.b2b_id_customer = p_id_customer) - ) + AND (spco.b2b_id_country IS NOT NULL OR NOT EXISTS ( + SELECT 1 FROM b2b_specific_price_country x WHERE x.b2b_specific_price_id = bsp.id + )) - AND ( - NOT EXISTS (SELECT 1 FROM b2b_specific_price_country x WHERE x.b2b_specific_price_id = bsp.id) - OR EXISTS (SELECT 1 FROM b2b_specific_price_country x WHERE x.b2b_specific_price_id = bsp.id AND x.b2b_id_country = p_id_country) - ) + AND (cp.id_product IS NOT NULL OR NOT EXISTS ( + SELECT 1 FROM b2b_specific_price_category x WHERE x.b2b_specific_price_id = bsp.id + )) ORDER BY - -- customer wins - (EXISTS (SELECT 1 FROM b2b_specific_price_customer x WHERE x.b2b_specific_price_id = bsp.id AND x.b2b_id_customer = p_id_customer)) DESC, - - -- attribute - (EXISTS (SELECT 1 FROM b2b_specific_price_product_attribute x WHERE x.b2b_specific_price_id = bsp.id AND x.id_product_attribute = p_id_product_attribute)) DESC, - - -- product - (EXISTS (SELECT 1 FROM b2b_specific_price_product x WHERE x.b2b_specific_price_id = bsp.id AND x.id_product = p_id_product)) DESC, - - -- category - (EXISTS ( - SELECT 1 FROM b2b_specific_price_category x - JOIN ps_category_product cp ON cp.id_category = x.id_category - WHERE x.b2b_specific_price_id = bsp.id AND cp.id_product = p_id_product - )) DESC, - - -- country - (EXISTS (SELECT 1 FROM b2b_specific_price_country x WHERE x.b2b_specific_price_id = bsp.id AND x.b2b_id_country = p_id_country)) DESC, - + (spc.b2b_id_customer IS NOT NULL) DESC, + (spa.id_product_attribute IS NOT NULL) DESC, + (spp.id_product IS NOT NULL) DESC, + (cp.id_product IS NOT NULL) DESC, + (spco.b2b_id_country IS NOT NULL) DESC, bsp.id DESC LIMIT 1; -- ================= APPLY ================= - SET v_excl = v_base; - IF v_has_specific = 1 THEN IF v_reduction_type = 'amount' THEN - -- convert specific price currency if needed IF v_specific_currency_id IS NOT NULL AND v_specific_currency_id != v_target_currency THEN SELECT r.conversion_rate @@ -173,7 +179,6 @@ BEGIN ORDER BY r.created_at DESC LIMIT 1; - -- normalize → then convert to target SET v_excl = (v_fixed_price / v_specific_rate) * v_target_rate; ELSE