Skip to content
This repository was archived by the owner on Jan 1, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions database/functions/customization_options/get_values.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
CREATE OR REPLACE FUNCTION get_customization_option_values(
p_customization_option_id INTEGER,
p_language_iso CHAR(2) DEFAULT 'en'
) RETURNS TABLE (
value_id INTEGER,
customization_option_id INTEGER,
value_name TEXT,
price_modifier NUMERIC(10, 2),
is_default BOOLEAN,
display_order INTEGER,
is_enabled BOOLEAN
) AS $$
BEGIN
RETURN QUERY
SELECT
cov.option_value_id as value_id,
cov.customization_option_id,
COALESCE(covt.value_name, cov.value_name) as value_name,
cov.price_modifier,
cov.is_default,
cov.display_order,
cov.is_enabled
FROM customization_option_values cov
LEFT JOIN customization_option_value_translations covt
ON cov.option_value_id = covt.option_value_id
AND covt.language_id = (SELECT language_id FROM languages WHERE iso_code = p_language_iso)
WHERE cov.customization_option_id = p_customization_option_id
AND cov.is_enabled = TRUE
ORDER BY cov.display_order, cov.value_name;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
64 changes: 64 additions & 0 deletions database/functions/product_customizations/add_option.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
CREATE OR REPLACE FUNCTION add_product_customization_option(
p_product_id INTEGER,
p_customization_option_id INTEGER,
p_is_required BOOLEAN DEFAULT FALSE,
p_display_order INTEGER DEFAULT 0
) RETURNS BOOLEAN AS $$
DECLARE
v_product_type PRODUCT_TYPE;
v_option_exists BOOLEAN;
BEGIN
-- Validate product exists and is configurable
SELECT product_type INTO v_product_type
FROM products
WHERE product_id = p_product_id
AND is_enabled = TRUE;

IF v_product_type IS NULL THEN
RAISE EXCEPTION 'Product ID % not found or is disabled', p_product_id
USING ERRCODE = 'C0001';
END IF;

IF v_product_type != 'configurable' THEN
RAISE EXCEPTION 'Can only add customization options to configurable products'
USING ERRCODE = 'C0002',
HINT = 'Product type is: ' || v_product_type;
END IF;

-- Validate customization option exists
SELECT EXISTS (
SELECT 1 FROM customization_options
WHERE customization_option_id = p_customization_option_id
AND is_enabled = TRUE
) INTO v_option_exists;

IF NOT v_option_exists THEN
RAISE EXCEPTION 'Customization option ID % not found or is disabled', p_customization_option_id
USING ERRCODE = 'C0003';
END IF;

-- Insert the association
INSERT INTO product_customization_options (
product_id,
customization_option_id,
is_required,
display_order
) VALUES (
p_product_id,
p_customization_option_id,
p_is_required,
p_display_order
) ON CONFLICT (product_id, customization_option_id) DO UPDATE SET
is_required = EXCLUDED.is_required,
display_order = EXCLUDED.display_order;

RAISE NOTICE 'Added customization option % to product %', p_customization_option_id, p_product_id;

RETURN TRUE;

EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Error adding customization option: % - %', SQLSTATE, SQLERRM;
RAISE;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
34 changes: 34 additions & 0 deletions database/functions/product_customizations/get_options.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
CREATE OR REPLACE FUNCTION get_product_customization_options(
p_product_id INTEGER,
p_language_iso CHAR(2) DEFAULT 'en'
) RETURNS TABLE (
option_id INTEGER,
product_id INTEGER,
option_name TEXT,
option_type TEXT,
is_required BOOLEAN,
display_order INTEGER,
created_at TIMESTAMPTZ
) AS $$
BEGIN
RETURN QUERY
SELECT
co.customization_option_id as option_id,
pco.product_id,
COALESCE(cot.option_name, co.option_name) as option_name,
co.option_type,
COALESCE(pco.is_required, co.is_required) as is_required,
COALESCE(pco.display_order, co.display_order) as display_order,
pco.created_at
FROM product_customization_options pco
JOIN customization_options co ON pco.customization_option_id = co.customization_option_id
LEFT JOIN customization_option_translations cot
ON co.customization_option_id = cot.customization_option_id
AND cot.language_id = (SELECT language_id FROM languages WHERE iso_code = p_language_iso)
JOIN products p ON pco.product_id = p.product_id
WHERE pco.product_id = p_product_id
AND co.is_enabled = TRUE
AND p.is_enabled = TRUE
ORDER BY COALESCE(pco.display_order, co.display_order), co.option_name;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
35 changes: 35 additions & 0 deletions database/functions/product_variants/get_all.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
CREATE OR REPLACE FUNCTION get_product_variants(
p_product_id INTEGER
) RETURNS TABLE (
variant_id INTEGER,
product_id INTEGER,
variant_name TEXT,
size TEXT,
quantity INTEGER,
serving_size TEXT,
price_override NUMERIC(10, 2),
final_price NUMERIC(10, 2),
is_default BOOLEAN,
display_order INTEGER
) AS $$
BEGIN
RETURN QUERY
SELECT
pv.product_variant_id as variant_id,
pv.product_id,
pv.variant_name,
pv.size,
pv.quantity,
pv.serving_size,
pv.price_override,
COALESCE(pv.price_override, p.price) as final_price,
pv.is_default,
pv.display_order
FROM product_variants pv
JOIN products p ON pv.product_id = p.product_id
WHERE pv.product_id = p_product_id
AND pv.is_test = FALSE
AND p.is_enabled = TRUE
ORDER BY pv.display_order, pv.product_variant_id;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
Loading