Files
mymoney/database/migrations/001_subscription_lifecycle.sql
2026-06-02 04:02:59 +02:00

105 lines
2.9 KiB
PL/PgSQL

BEGIN;
ALTER TABLE subscriptions
ADD COLUMN IF NOT EXISTS activation_date text,
ADD COLUMN IF NOT EXISTS first_payment_date text,
ADD COLUMN IF NOT EXISTS end_date text,
ADD COLUMN IF NOT EXISTS occurrence_count integer,
ADD COLUMN IF NOT EXISTS custom_interval_days integer;
DO $$
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_name = 'subscriptions' AND column_name = 'renewal_date'
) THEN
UPDATE subscriptions
SET
activation_date = COALESCE(activation_date, renewal_date),
first_payment_date = COALESCE(first_payment_date, renewal_date),
subscription_status = CASE
WHEN subscription_status = 'disabled' THEN 'terminated'
ELSE subscription_status
END;
ELSE
UPDATE subscriptions
SET subscription_status = 'terminated'
WHERE subscription_status = 'disabled';
END IF;
END $$;
ALTER TABLE subscriptions
ALTER COLUMN activation_date SET NOT NULL,
ALTER COLUMN first_payment_date SET NOT NULL;
ALTER TABLE subscriptions
DROP COLUMN IF EXISTS renewal_date,
DROP COLUMN IF EXISTS auto_renew;
DROP INDEX IF EXISTS subscriptions_renewal_date_idx;
CREATE INDEX IF NOT EXISTS subscriptions_first_payment_date_idx
ON subscriptions(first_payment_date);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'subscriptions_occurrence_count_positive'
) THEN
ALTER TABLE subscriptions
ADD CONSTRAINT subscriptions_occurrence_count_positive
CHECK (occurrence_count > 0);
END IF;
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'subscriptions_custom_interval_days_positive'
) THEN
ALTER TABLE subscriptions
ADD CONSTRAINT subscriptions_custom_interval_days_positive
CHECK (custom_interval_days > 0);
END IF;
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'subscriptions_amount_positive'
) THEN
ALTER TABLE subscriptions
ADD CONSTRAINT subscriptions_amount_positive CHECK (amount > 0);
END IF;
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'subscriptions_billing_cycle_valid'
) THEN
ALTER TABLE subscriptions
ADD CONSTRAINT subscriptions_billing_cycle_valid
CHECK (billing_cycle IN ('weekly', 'monthly', 'yearly', 'custom'));
END IF;
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'subscriptions_status_valid'
) THEN
ALTER TABLE subscriptions
ADD CONSTRAINT subscriptions_status_valid
CHECK (subscription_status IN ('active', 'suspended', 'terminated'));
END IF;
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'subscriptions_dates_valid'
) THEN
ALTER TABLE subscriptions
ADD CONSTRAINT subscriptions_dates_valid
CHECK (
activation_date <= first_payment_date
AND (end_date IS NULL OR end_date >= first_payment_date)
);
END IF;
END $$;
COMMIT;