- Fixed 'relation session_kb_associations does not exist' error in core consolidated migration. - Renamed migration directories from timestamp-based to version-based (6.0.x, 6.1.x, 6.2.x). - Reorganized migrations into dedicated feature folders (products, dashboards, learn, video). - Updated migration execution order in core/shared/utils.rs. - Moves legacy migrations to 6.0.x/6.1.x and workflow to 6.2.0.
139 lines
5.2 KiB
SQL
139 lines
5.2 KiB
SQL
CREATE TABLE products (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
org_id UUID NOT NULL,
|
|
bot_id UUID NOT NULL,
|
|
sku VARCHAR(100),
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
category VARCHAR(100),
|
|
product_type VARCHAR(50) NOT NULL DEFAULT 'physical',
|
|
price DECIMAL(15,2) NOT NULL DEFAULT 0,
|
|
cost DECIMAL(15,2),
|
|
currency VARCHAR(3) NOT NULL DEFAULT 'USD',
|
|
tax_rate DECIMAL(5,2) NOT NULL DEFAULT 0,
|
|
unit VARCHAR(50) NOT NULL DEFAULT 'unit',
|
|
stock_quantity INTEGER NOT NULL DEFAULT 0,
|
|
low_stock_threshold INTEGER NOT NULL DEFAULT 10,
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
images JSONB NOT NULL DEFAULT '[]',
|
|
attributes JSONB NOT NULL DEFAULT '{}',
|
|
weight DECIMAL(10,2),
|
|
dimensions JSONB,
|
|
barcode VARCHAR(100),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE services (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
org_id UUID NOT NULL,
|
|
bot_id UUID NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
category VARCHAR(100),
|
|
service_type VARCHAR(50) NOT NULL DEFAULT 'hourly',
|
|
hourly_rate DECIMAL(15,2),
|
|
fixed_price DECIMAL(15,2),
|
|
currency VARCHAR(3) NOT NULL DEFAULT 'USD',
|
|
duration_minutes INTEGER,
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
attributes JSONB NOT NULL DEFAULT '{}',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE product_categories (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
org_id UUID NOT NULL,
|
|
bot_id UUID NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
parent_id UUID REFERENCES product_categories(id) ON DELETE SET NULL,
|
|
slug VARCHAR(255),
|
|
image_url TEXT,
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE price_lists (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
org_id UUID NOT NULL,
|
|
bot_id UUID NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
currency VARCHAR(3) NOT NULL DEFAULT 'USD',
|
|
is_default BOOLEAN NOT NULL DEFAULT FALSE,
|
|
valid_from DATE,
|
|
valid_until DATE,
|
|
customer_group VARCHAR(100),
|
|
discount_percent DECIMAL(5,2) 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 TABLE price_list_items (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
price_list_id UUID NOT NULL REFERENCES price_lists(id) ON DELETE CASCADE,
|
|
product_id UUID REFERENCES products(id) ON DELETE CASCADE,
|
|
service_id UUID REFERENCES services(id) ON DELETE CASCADE,
|
|
price DECIMAL(15,2) NOT NULL,
|
|
min_quantity INTEGER NOT NULL DEFAULT 1,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE inventory_movements (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
org_id UUID NOT NULL,
|
|
bot_id UUID NOT NULL,
|
|
product_id UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE,
|
|
movement_type VARCHAR(50) NOT NULL,
|
|
quantity INTEGER NOT NULL,
|
|
reference_type VARCHAR(50),
|
|
reference_id UUID,
|
|
notes TEXT,
|
|
created_by UUID,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE product_variants (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
product_id UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE,
|
|
sku VARCHAR(100),
|
|
name VARCHAR(255) NOT NULL,
|
|
price_adjustment DECIMAL(15,2) NOT NULL DEFAULT 0,
|
|
stock_quantity INTEGER NOT NULL DEFAULT 0,
|
|
attributes JSONB NOT NULL DEFAULT '{}',
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_products_org_bot ON products(org_id, bot_id);
|
|
CREATE INDEX idx_products_category ON products(category);
|
|
CREATE INDEX idx_products_active ON products(is_active);
|
|
CREATE INDEX idx_products_sku ON products(sku);
|
|
CREATE UNIQUE INDEX idx_products_org_sku ON products(org_id, sku) WHERE sku IS NOT NULL;
|
|
|
|
CREATE INDEX idx_services_org_bot ON services(org_id, bot_id);
|
|
CREATE INDEX idx_services_category ON services(category);
|
|
CREATE INDEX idx_services_active ON services(is_active);
|
|
|
|
CREATE INDEX idx_product_categories_org_bot ON product_categories(org_id, bot_id);
|
|
CREATE INDEX idx_product_categories_parent ON product_categories(parent_id);
|
|
CREATE INDEX idx_product_categories_slug ON product_categories(slug);
|
|
|
|
CREATE INDEX idx_price_lists_org_bot ON price_lists(org_id, bot_id);
|
|
CREATE INDEX idx_price_lists_active ON price_lists(is_active);
|
|
CREATE INDEX idx_price_lists_default ON price_lists(is_default);
|
|
|
|
CREATE INDEX idx_price_list_items_list ON price_list_items(price_list_id);
|
|
CREATE INDEX idx_price_list_items_product ON price_list_items(product_id);
|
|
CREATE INDEX idx_price_list_items_service ON price_list_items(service_id);
|
|
|
|
CREATE INDEX idx_inventory_movements_org_bot ON inventory_movements(org_id, bot_id);
|
|
CREATE INDEX idx_inventory_movements_product ON inventory_movements(product_id);
|
|
CREATE INDEX idx_inventory_movements_created ON inventory_movements(created_at DESC);
|
|
|
|
CREATE INDEX idx_product_variants_product ON product_variants(product_id);
|
|
CREATE INDEX idx_product_variants_sku ON product_variants(sku);
|