Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot]
2026-04-26 08:08:11 +00:00
co-authored by renee-png
parent bfdd4c655e
commit 5520ba109e
2 changed files with 117 additions and 3 deletions
@@ -0,0 +1,88 @@
-- Allow payment_plans to be attached to a case directly
ALTER TABLE public.payment_plans
ADD COLUMN IF NOT EXISTS case_id UUID REFERENCES public.cases(id) ON DELETE CASCADE;
ALTER TABLE public.payment_plans
ALTER COLUMN collection_id DROP NOT NULL;
ALTER TABLE public.payment_plans
DROP CONSTRAINT IF EXISTS pp_case_or_collection;
ALTER TABLE public.payment_plans
ADD CONSTRAINT pp_case_or_collection CHECK (case_id IS NOT NULL OR collection_id IS NOT NULL);
CREATE INDEX IF NOT EXISTS idx_payment_plans_case ON public.payment_plans(case_id);
-- Installment fields for online + manual payments
ALTER TABLE public.payment_plan_installments
ADD COLUMN IF NOT EXISTS payment_request_id UUID REFERENCES public.payment_requests(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS paid_method TEXT,
ADD COLUMN IF NOT EXISTS paid_reference TEXT;
-- Update RLS to also allow case-based access
DROP POLICY IF EXISTS pp_select ON public.payment_plans;
DROP POLICY IF EXISTS pp_insert ON public.payment_plans;
DROP POLICY IF EXISTS pp_update ON public.payment_plans;
DROP POLICY IF EXISTS pp_delete ON public.payment_plans;
CREATE POLICY pp_select ON public.payment_plans FOR SELECT TO authenticated USING (
(case_id IS NOT NULL AND public.can_access_case(case_id, auth.uid()))
OR (collection_id IS NOT NULL AND EXISTS (SELECT 1 FROM public.collections c WHERE c.id = collection_id AND public.can_access_case(c.case_id, auth.uid())))
);
CREATE POLICY pp_insert ON public.payment_plans FOR INSERT TO authenticated WITH CHECK (
(case_id IS NOT NULL AND public.can_access_case(case_id, auth.uid()))
OR (collection_id IS NOT NULL AND EXISTS (SELECT 1 FROM public.collections c WHERE c.id = collection_id AND public.can_access_case(c.case_id, auth.uid())))
);
CREATE POLICY pp_update ON public.payment_plans FOR UPDATE TO authenticated USING (
(case_id IS NOT NULL AND public.can_access_case(case_id, auth.uid()))
OR (collection_id IS NOT NULL AND EXISTS (SELECT 1 FROM public.collections c WHERE c.id = collection_id AND public.can_access_case(c.case_id, auth.uid())))
);
CREATE POLICY pp_delete ON public.payment_plans FOR DELETE TO authenticated USING (
(case_id IS NOT NULL AND public.can_access_case(case_id, auth.uid()))
OR (collection_id IS NOT NULL AND EXISTS (SELECT 1 FROM public.collections c WHERE c.id = collection_id AND public.can_access_case(c.case_id, auth.uid())))
);
DROP POLICY IF EXISTS ppi_select ON public.payment_plan_installments;
DROP POLICY IF EXISTS ppi_insert ON public.payment_plan_installments;
DROP POLICY IF EXISTS ppi_update ON public.payment_plan_installments;
DROP POLICY IF EXISTS ppi_delete ON public.payment_plan_installments;
CREATE POLICY ppi_select ON public.payment_plan_installments FOR SELECT TO authenticated USING (
EXISTS (
SELECT 1 FROM public.payment_plans p
LEFT JOIN public.collections c ON c.id = p.collection_id
WHERE p.id = plan_id AND (
(p.case_id IS NOT NULL AND public.can_access_case(p.case_id, auth.uid()))
OR (c.id IS NOT NULL AND public.can_access_case(c.case_id, auth.uid()))
)
)
);
CREATE POLICY ppi_insert ON public.payment_plan_installments FOR INSERT TO authenticated WITH CHECK (
EXISTS (
SELECT 1 FROM public.payment_plans p
LEFT JOIN public.collections c ON c.id = p.collection_id
WHERE p.id = plan_id AND (
(p.case_id IS NOT NULL AND public.can_access_case(p.case_id, auth.uid()))
OR (c.id IS NOT NULL AND public.can_access_case(c.case_id, auth.uid()))
)
)
);
CREATE POLICY ppi_update ON public.payment_plan_installments FOR UPDATE TO authenticated USING (
EXISTS (
SELECT 1 FROM public.payment_plans p
LEFT JOIN public.collections c ON c.id = p.collection_id
WHERE p.id = plan_id AND (
(p.case_id IS NOT NULL AND public.can_access_case(p.case_id, auth.uid()))
OR (c.id IS NOT NULL AND public.can_access_case(c.case_id, auth.uid()))
)
)
);
CREATE POLICY ppi_delete ON public.payment_plan_installments FOR DELETE TO authenticated USING (
EXISTS (
SELECT 1 FROM public.payment_plans p
LEFT JOIN public.collections c ON c.id = p.collection_id
WHERE p.id = plan_id AND (
(p.case_id IS NOT NULL AND public.can_access_case(p.case_id, auth.uid()))
OR (c.id IS NOT NULL AND public.can_access_case(c.case_id, auth.uid()))
)
)
);