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);