CREATE TABLE IF NOT EXISTS notifications ( id VARCHAR(255) NOT NULL PRIMARY KEY, recipient_id BIGSERIAL NOT NULL, type TEXT NOT NULL CHECK ( type IN ( 'cash_out_success', 'deposit_success', 'withdraw_success', 'bet_placed', 'daily_report', 'high_loss_on_bet', 'bet_overload', 'signup_welcome', 'otp_sent', 'wallet_threshold', 'wallet_updated', 'transfer_failed', 'transfer_success', 'admin_alert', 'bet_result', 'transfer_rejected', 'approval_required', 'bonus_awarded' ) ), level TEXT NOT NULL CHECK (level IN ('info', 'error', 'warning', 'success')), error_severity TEXT CHECK ( error_severity IN ('low', 'medium', 'high', 'critical', 'fatal') ), reciever TEXT NOT NULL CHECK (reciever IN ('admin', 'customer')), is_read BOOLEAN NOT NULL DEFAULT FALSE, delivery_status TEXT NOT NULL CHECK (delivery_status IN ('pending', 'sent', 'failed')), delivery_channel TEXT CHECK ( delivery_channel IN ('email', 'sms', 'push', 'in-app') ), payload JSONB NOT NULL, priority INTEGER, version INTEGER NOT NULL DEFAULT 0, timestamp TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, metadata JSONB ); CREATE TABLE IF NOT EXISTS wallet_threshold_notifications ( company_id BIGINT NOT NULL, threshold FLOAT NOT NULL, notified_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (company_id, threshold) ); CREATE INDEX idx_wallet_threshold_notifications_company ON wallet_threshold_notifications(company_id); CREATE INDEX idx_notifications_recipient_id ON notifications (recipient_id); CREATE INDEX idx_notifications_timestamp ON notifications (timestamp); CREATE INDEX idx_notifications_type ON notifications (type);