diff --git a/supabase/migrations/20260418033458_e7c5d0e1-b39f-4cee-8bf0-099a35fb142d.sql b/supabase/migrations/20260418033458_e7c5d0e1-b39f-4cee-8bf0-099a35fb142d.sql new file mode 100644 index 0000000..e6277f7 --- /dev/null +++ b/supabase/migrations/20260418033458_e7c5d0e1-b39f-4cee-8bf0-099a35fb142d.sql @@ -0,0 +1,95 @@ +-- Remove clients & contacts created in the last 24 hours (the bulk-imported batch). +-- Cascading clean-up of dependent rows that don't have ON DELETE CASCADE. + +-- 1. Identify target sets +WITH del_clients AS ( + SELECT id FROM public.clients WHERE created_at >= now() - interval '24 hours' +), +del_contacts AS ( + SELECT id FROM public.contacts WHERE created_at >= now() - interval '24 hours' +), +-- Homeowners belonging to those clients +del_homeowners AS ( + SELECT id FROM public.homeowners WHERE client_id IN (SELECT id FROM del_clients) +), +-- Cases belonging to those clients +del_cases AS ( + SELECT id FROM public.cases WHERE client_id IN (SELECT id FROM del_clients) +), +-- Collections under those cases / homeowners +del_collections AS ( + SELECT id FROM public.collections + WHERE case_id IN (SELECT id FROM del_cases) + OR homeowner_id IN (SELECT id FROM del_homeowners) +), +-- Invoices belonging to those clients / cases +del_invoices AS ( + SELECT id FROM public.invoices + WHERE client_id IN (SELECT id FROM del_clients) + OR case_id IN (SELECT id FROM del_cases) +) +-- Materialise into temp tables for reuse across statements +SELECT id INTO TEMP TABLE _del_clients FROM del_clients; +WITH t AS (SELECT id FROM public.contacts WHERE created_at >= now() - interval '24 hours') +SELECT id INTO TEMP TABLE _del_contacts FROM t; +WITH t AS (SELECT id FROM public.homeowners WHERE client_id IN (SELECT id FROM _del_clients)) +SELECT id INTO TEMP TABLE _del_homeowners FROM t; +WITH t AS (SELECT id FROM public.cases WHERE client_id IN (SELECT id FROM _del_clients)) +SELECT id INTO TEMP TABLE _del_cases FROM t; +WITH t AS ( + SELECT id FROM public.collections + WHERE case_id IN (SELECT id FROM _del_cases) + OR homeowner_id IN (SELECT id FROM _del_homeowners) +) +SELECT id INTO TEMP TABLE _del_collections FROM t; +WITH t AS ( + SELECT id FROM public.invoices + WHERE client_id IN (SELECT id FROM _del_clients) + OR case_id IN (SELECT id FROM _del_cases) +) +SELECT id INTO TEMP TABLE _del_invoices FROM t; + +-- 2. Delete dependents bottom-up +-- Collections sub-data +DELETE FROM public.payment_plan_installments WHERE plan_id IN (SELECT id FROM public.payment_plans WHERE collection_id IN (SELECT id FROM _del_collections)); +DELETE FROM public.payment_plans WHERE collection_id IN (SELECT id FROM _del_collections); +DELETE FROM public.collection_payment_allocations WHERE collection_id IN (SELECT id FROM _del_collections); +DELETE FROM public.collection_ledger_entries WHERE collection_id IN (SELECT id FROM _del_collections); +DELETE FROM public.collection_tasks WHERE collection_id IN (SELECT id FROM _del_collections); +DELETE FROM public.collections WHERE id IN (SELECT id FROM _del_collections); + +-- Invoice sub-data +DELETE FROM public.invoice_payments WHERE invoice_id IN (SELECT id FROM _del_invoices); +DELETE FROM public.invoice_line_items WHERE invoice_id IN (SELECT id FROM _del_invoices); +UPDATE public.expenses SET invoice_id = NULL WHERE invoice_id IN (SELECT id FROM _del_invoices); +DELETE FROM public.invoices WHERE id IN (SELECT id FROM _del_invoices); + +-- Case sub-data +DELETE FROM public.expenses WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.call_logs WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.documents WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.document_folders WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.case_field_values WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.case_contacts WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.status_updates WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.events WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.tasks WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.comments WHERE case_id IN (SELECT id FROM _del_cases); +DELETE FROM public.cases WHERE id IN (SELECT id FROM _del_cases); + +-- Homeowner sub-data +DELETE FROM public.call_logs WHERE homeowner_id IN (SELECT id FROM _del_homeowners); +DELETE FROM public.homeowners WHERE id IN (SELECT id FROM _del_homeowners); + +-- Contact sub-data +DELETE FROM public.case_contacts WHERE contact_id IN (SELECT id FROM _del_contacts); +DELETE FROM public.client_contacts WHERE contact_id IN (SELECT id FROM _del_contacts); +DELETE FROM public.call_logs WHERE contact_id IN (SELECT id FROM _del_contacts); +DELETE FROM public.contacts WHERE id IN (SELECT id FROM _del_contacts); + +-- Client sub-data +DELETE FROM public.client_contacts WHERE client_id IN (SELECT id FROM _del_clients); +DELETE FROM public.events WHERE client_id IN (SELECT id FROM _del_clients); +DELETE FROM public.clients WHERE id IN (SELECT id FROM _del_clients); + +DROP TABLE _del_clients, _del_contacts, _del_homeowners, _del_cases, _del_collections, _del_invoices; \ No newline at end of file