-- Migración 017: tabla areas + area_id en processes + RLS + bulk-assign org -- Completamente aditiva — no elimina columnas, tablas ni políticas existentes. -- ── Paso 1: Crear tabla areas ───────────────────────────────────────────────── -- Nueva tabla areas: reemplazará process_groups como agrupador normalizado por org CREATE TABLE IF NOT EXISTS public.areas ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), org_id uuid NOT NULL REFERENCES public.organizations(id) ON DELETE CASCADE, name text NOT NULL, description text, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now() ); ALTER TABLE public.areas ENABLE ROW LEVEL SECURITY; -- ── Paso 2: Agregar area_id a processes ─────────────────────────────────────── -- area_id reemplazará group_id como agrupador normalizado dentro de una org. -- Nullable: procesos sin área asignada son válidos ("Sin área"). ALTER TABLE public.processes ADD COLUMN IF NOT EXISTS area_id uuid REFERENCES public.areas(id) ON DELETE SET NULL; -- ── Paso 3: RLS para areas ──────────────────────────────────────────────────── -- SELECT: InQuality ve todas las áreas; cliente ve solo las de su org CREATE POLICY "areas_select" ON public.areas FOR SELECT USING ( public.is_inquality() OR org_id = public.current_org() ); -- INSERT / UPDATE / DELETE: solo platform_admin CREATE POLICY "areas_insert" ON public.areas FOR INSERT WITH CHECK ( public.current_platform_role() = 'platform_admin' ); CREATE POLICY "areas_update" ON public.areas FOR UPDATE USING ( public.current_platform_role() = 'platform_admin' ); CREATE POLICY "areas_delete" ON public.areas FOR DELETE USING ( public.current_platform_role() = 'platform_admin' ); -- ── Paso 4: Migración de datos — asignar procesos sin org a InQuality ───────── -- Procesos sin org_id son datos de prueba de InQuality. -- Asignarlos a la org de InQuality (is_provider = true) para limpiar los NULLs. UPDATE public.processes SET org_id = ( SELECT id FROM public.organizations WHERE is_provider = true LIMIT 1 ) WHERE org_id IS NULL;