Files
deals24togo_be/migrations/003_payments.sql
belviskhoremk c4d836a0f9 Initial commit
2026-03-06 22:57:58 +00:00

56 lines
2.3 KiB
SQL

-- Migration 003: Payments, Subscriptions, Purchases
-- Run in Supabase SQL editor
-- Extend listings status to include 'sold'
ALTER TABLE listings
DROP CONSTRAINT IF EXISTS listings_status_check;
ALTER TABLE listings
ADD CONSTRAINT listings_status_check
CHECK (status IN ('pending', 'approved', 'rejected', 'sold'));
-- payments: one row per CinetPay transaction
CREATE TABLE payments (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
transaction_id TEXT UNIQUE NOT NULL,
type TEXT NOT NULL
CHECK (type IN ('subscription', 'purchase')),
payer_id UUID REFERENCES users(id) ON DELETE SET NULL,
amount NUMERIC(12,2) NOT NULL,
currency TEXT NOT NULL DEFAULT 'XOF',
status TEXT NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending', 'completed', 'failed', 'cancelled')),
payment_method TEXT,
operator_id TEXT,
metadata JSONB DEFAULT '{}'::JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
paid_at TIMESTAMPTZ
);
-- subscriptions: active plan per agency
CREATE TABLE subscriptions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
agency_id UUID NOT NULL REFERENCES agencies(id) ON DELETE CASCADE,
plan TEXT NOT NULL CHECK (plan IN ('monthly', 'yearly')),
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'expired')),
starts_at TIMESTAMPTZ NOT NULL,
ends_at TIMESTAMPTZ NOT NULL,
payment_id UUID REFERENCES payments(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- purchases: visitor buys a listing
CREATE TABLE purchases (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
listing_id UUID NOT NULL REFERENCES listings(id) ON DELETE CASCADE,
buyer_id UUID REFERENCES users(id) ON DELETE SET NULL,
amount NUMERIC(12,2) NOT NULL,
payment_id UUID REFERENCES payments(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_payments_transaction_id ON payments(transaction_id);
CREATE INDEX idx_payments_payer_id ON payments(payer_id);
CREATE INDEX idx_subscriptions_agency_id ON subscriptions(agency_id);
CREATE INDEX idx_subscriptions_ends_at ON subscriptions(ends_at);
CREATE INDEX idx_purchases_listing_id ON purchases(listing_id);