-- Subscription Plans table CREATE TABLE subscription_plans ( id BIGSERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, description TEXT, duration_value INT NOT NULL, duration_unit VARCHAR(10) NOT NULL CHECK (duration_unit IN ('DAY', 'WEEK', 'MONTH', 'YEAR')), price DECIMAL(10, 2) NOT NULL, currency VARCHAR(3) NOT NULL DEFAULT 'ETB', is_active BOOLEAN NOT NULL DEFAULT TRUE, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ ); CREATE INDEX idx_subscription_plans_active ON subscription_plans(is_active); -- User Subscriptions table CREATE TABLE user_subscriptions ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, plan_id BIGINT NOT NULL REFERENCES subscription_plans(id) ON DELETE RESTRICT, starts_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMPTZ NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' CHECK (status IN ('PENDING', 'ACTIVE', 'EXPIRED', 'CANCELLED')), payment_reference VARCHAR(255), payment_method VARCHAR(50), auto_renew BOOLEAN NOT NULL DEFAULT FALSE, cancelled_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ ); CREATE INDEX idx_user_subscriptions_user_id ON user_subscriptions(user_id); CREATE INDEX idx_user_subscriptions_status ON user_subscriptions(status); CREATE INDEX idx_user_subscriptions_expires_at ON user_subscriptions(expires_at); CREATE INDEX idx_user_subscriptions_user_status ON user_subscriptions(user_id, status);