60 lines
2.4 KiB
SQL
60 lines
2.4 KiB
SQL
-- 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;
|