32 lines
1.1 KiB
SQL
32 lines
1.1 KiB
SQL
-- Existing Stripe invoices predate object watermarks. Force the first later
|
|
-- event to reconcile against Stripe instead of treating it as authoritative.
|
|
INSERT INTO provider_object_event_watermarks (
|
|
provider, object_type, provider_object_id,
|
|
last_event_created, last_event_rank, last_event_id,
|
|
is_deleted, requires_reconciliation, reconciliation_reason,
|
|
updated_at
|
|
)
|
|
SELECT
|
|
'stripe', 'invoice', provider_invoice_id,
|
|
0, 0, 'reconcile:migration:020',
|
|
false, true, 'migration_020_existing_invoice',
|
|
NOW()
|
|
FROM invoices
|
|
WHERE provider = 'stripe'
|
|
AND provider_invoice_id IS NOT NULL
|
|
ON CONFLICT (provider, object_type, provider_object_id) DO NOTHING;
|
|
|
|
-- A non-paid invoice must never retain the timestamp from an older paid
|
|
-- payload. Clean historical contradictions before enforcing the invariant.
|
|
UPDATE invoices
|
|
SET paid_at = NULL
|
|
WHERE status <> 'paid'
|
|
AND paid_at IS NOT NULL;
|
|
|
|
ALTER TABLE invoices
|
|
ADD CONSTRAINT invoices_paid_at_status_check
|
|
CHECK (paid_at IS NULL OR status = 'paid') NOT VALID;
|
|
|
|
ALTER TABLE invoices
|
|
VALIDATE CONSTRAINT invoices_paid_at_status_check;
|