nxtgauge-backend-rust/crates/db/migrations/20260317202300_coupons_discounts.up.sql
Ashwin Kumar 9764a7acdd feat: commit remaining service files, migrations, and model updates
- gateway, companies, customers, job_seekers apps updated
- users config/mod/mail handlers
- auth middleware and jwt crate updates
- db models: user, config, mod updates
- all remaining migrations: portfolio, notifications, reviews, kb, support, coupons, onboarding states

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 22:59:47 +01:00

30 lines
1.3 KiB
SQL

-- Discount coupons for Tracecoin and package purchases
CREATE TABLE IF NOT EXISTS coupons (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
code VARCHAR(50) NOT NULL UNIQUE,
description TEXT,
discount_type VARCHAR(20) NOT NULL, -- PERCENT, FLAT
discount_value INTEGER NOT NULL, -- percent (0-100) or paise
applies_to VARCHAR(50) NOT NULL DEFAULT 'ALL', -- ALL, TRACECOIN_BUNDLE, JOB_POSTING, CONTACT_VIEWS
min_order_amount INTEGER NOT NULL DEFAULT 0, -- paise
max_uses INTEGER, -- NULL = unlimited
uses_count INTEGER NOT NULL DEFAULT 0,
per_user_limit INTEGER NOT NULL DEFAULT 1,
valid_from TIMESTAMPTZ NOT NULL DEFAULT NOW(),
valid_until TIMESTAMPTZ,
is_active BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Track which users used which coupons
CREATE TABLE IF NOT EXISTS coupon_uses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
coupon_id UUID NOT NULL REFERENCES coupons(id) ON DELETE CASCADE,
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
payment_id UUID REFERENCES payments(id),
used_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (coupon_id, user_id)
);
CREATE INDEX IF NOT EXISTS idx_coupons_code ON coupons(code);
CREATE INDEX IF NOT EXISTS idx_coupon_uses_user_id ON coupon_uses(user_id);