-- Лояльность и промокоды ALTER TABLE users ADD COLUMN IF NOT EXISTS loyalty_points INTEGER NOT NULL DEFAULT 0 CHECK (loyalty_points >= 0); CREATE TABLE IF NOT EXISTS promo_codes ( id SERIAL PRIMARY KEY, code TEXT NOT NULL UNIQUE, description TEXT NOT NULL DEFAULT '', discount_type TEXT NOT NULL CHECK (discount_type IN ('percent', 'fixed')), discount_value INTEGER NOT NULL CHECK (discount_value > 0), starts_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), expires_at TIMESTAMPTZ NOT NULL, min_order_cents INTEGER NOT NULL DEFAULT 0 CHECK (min_order_cents >= 0), max_uses INTEGER CHECK (max_uses IS NULL OR max_uses > 0), use_count INTEGER NOT NULL DEFAULT 0 CHECK (use_count >= 0), active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_promo_codes_active ON promo_codes (active, expires_at); ALTER TABLE orders ADD COLUMN IF NOT EXISTS subtotal_cents INTEGER; ALTER TABLE orders ADD COLUMN IF NOT EXISTS discount_cents INTEGER NOT NULL DEFAULT 0; ALTER TABLE orders ADD COLUMN IF NOT EXISTS promo_code_id INTEGER REFERENCES promo_codes(id); ALTER TABLE orders ADD COLUMN IF NOT EXISTS loyalty_points_used INTEGER NOT NULL DEFAULT 0; ALTER TABLE orders ADD COLUMN IF NOT EXISTS loyalty_points_earned INTEGER NOT NULL DEFAULT 0; UPDATE orders SET subtotal_cents = total_cents WHERE subtotal_cents IS NULL;