CREATE TYPE ReferralStatus AS ENUM ('PENDING', 'COMPLETED', 'EXPIRED', 'CANCELLED'); CREATE TABLE IF NOT EXISTS referral_settings ( id BIGSERIAL PRIMARY KEY, referral_reward_amount DECIMAL(15, 2) NOT NULL DEFAULT 0.00, cashback_percentage DECIMAL(5, 2) NOT NULL DEFAULT 0.00, bet_referral_bonus_percentage NUMERIC DEFAULT 5.0, max_referrals INTEGER NOT NULL DEFAULT 0, expires_after_days INTEGER NOT NULL DEFAULT 30, updated_by VARCHAR(255) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, version INTEGER NOT NULL DEFAULT 0, CONSTRAINT referral_reward_amount_positive CHECK (referral_reward_amount >= 0), CONSTRAINT cashback_percentage_range CHECK ( cashback_percentage >= 0 AND cashback_percentage <= 100 ) ); CREATE TABLE IF NOT EXISTS referrals ( id BIGSERIAL PRIMARY KEY, referral_code VARCHAR(10) NOT NULL UNIQUE, -- referrer_id VARCHAR(255) NOT NULL, -- referred_id VARCHAR(255) UNIQUE, status ReferralStatus NOT NULL DEFAULT 'PENDING', reward_amount DECIMAL(15, 2) NOT NULL DEFAULT 0.00, cashback_amount DECIMAL(15, 2) NOT NULL DEFAULT 0.00, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMPTZ NOT NULL, -- FOREIGN KEY (referrer_id) REFERENCES users (id), -- FOREIGN KEY (referred_id) REFERENCES users (id), CONSTRAINT reward_amount_positive CHECK (reward_amount >= 0), CONSTRAINT cashback_amount_positive CHECK (cashback_amount >= 0) ); CREATE INDEX idx_referrals_referral_code ON referrals (referral_code); -- CREATE INDEX idx_referrals_referrer_id ON referrals (referrer_id); CREATE INDEX idx_referrals_status ON referrals (status); ALTER TABLE users ADD COLUMN IF NOT EXISTS referral_code VARCHAR(10) UNIQUE, ADD COLUMN IF NOT EXISTS referred_by VARCHAR(10); -- Modify wallet table to track bonus money separately ALTER TABLE wallets ADD COLUMN IF NOT EXISTS bonus_balance DECIMAL(15, 2) NOT NULL DEFAULT 0.00, ADD COLUMN IF NOT EXISTS cash_balance DECIMAL(15, 2) NOT NULL DEFAULT 0.00, ADD CONSTRAINT bonus_balance_positive CHECK (bonus_balance >= 0), ADD CONSTRAINT cash_balance_positive CHECK (cash_balance >= 0);