Files
backend/database/migrations/100_shipping_cost_groups.sql
T
Alireza HassaniandCursor 88ef4e82a1 Add shipping cost groups and reject spam contact-form SMS.
Wire cart/checkout shipping fees with category groups and static rates, reject gibberish contact submissions, and SMS only valid Iranian mobiles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 21:52:41 +03:30

59 lines
2.5 KiB
SQL

-- Shipping cost groups (هزینه ارسال) + per-city overrides + category assignment
CREATE TABLE IF NOT EXISTS shipping_cost_groups (
id BIGSERIAL PRIMARY KEY,
business_id BIGINT NOT NULL REFERENCES businesses (id) ON DELETE CASCADE ON UPDATE NO ACTION,
name VARCHAR(255) NOT NULL,
name_en VARCHAR(255) NOT NULL,
description TEXT NULL,
methods TEXT[] NOT NULL DEFAULT '{}',
default_amount NUMERIC(12, 2) NOT NULL DEFAULT 0,
sort_order INT NOT NULL DEFAULT 0,
is_active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_shipping_cost_groups_business_id
ON shipping_cost_groups (business_id);
CREATE INDEX IF NOT EXISTS idx_shipping_cost_groups_business_sort_order
ON shipping_cost_groups (business_id, sort_order);
DROP TRIGGER IF EXISTS shipping_cost_groups_set_updated_at ON shipping_cost_groups;
CREATE TRIGGER shipping_cost_groups_set_updated_at
BEFORE UPDATE ON shipping_cost_groups
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();
CREATE TABLE IF NOT EXISTS shipping_cost_group_city_rates (
id BIGSERIAL PRIMARY KEY,
shipping_cost_group_id BIGINT NOT NULL REFERENCES shipping_cost_groups (id) ON DELETE CASCADE ON UPDATE NO ACTION,
city_id BIGINT NOT NULL REFERENCES cities (id) ON DELETE CASCADE ON UPDATE NO ACTION,
amount NUMERIC(12, 2) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT shipping_cost_group_city_rates_unique UNIQUE (shipping_cost_group_id, city_id)
);
CREATE INDEX IF NOT EXISTS idx_shipping_cost_group_city_rates_group_id
ON shipping_cost_group_city_rates (shipping_cost_group_id);
CREATE INDEX IF NOT EXISTS idx_shipping_cost_group_city_rates_city_id
ON shipping_cost_group_city_rates (city_id);
DROP TRIGGER IF EXISTS shipping_cost_group_city_rates_set_updated_at ON shipping_cost_group_city_rates;
CREATE TRIGGER shipping_cost_group_city_rates_set_updated_at
BEFORE UPDATE ON shipping_cost_group_city_rates
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();
CREATE TABLE IF NOT EXISTS shipping_cost_group_categories (
shipping_cost_group_id BIGINT NOT NULL REFERENCES shipping_cost_groups (id) ON DELETE CASCADE ON UPDATE NO ACTION,
category_id BIGINT NOT NULL REFERENCES categories (id) ON DELETE CASCADE ON UPDATE NO ACTION,
PRIMARY KEY (shipping_cost_group_id, category_id)
);
CREATE INDEX IF NOT EXISTS idx_shipping_cost_group_categories_category_id
ON shipping_cost_group_categories (category_id);