-- Tabla de organizaciones clientes -- is_provider = true identifica a InQuality (org administradora de la plataforma) CREATE TABLE IF NOT EXISTS public.organizations ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL, is_provider boolean NOT NULL DEFAULT false, created_at timestamptz NOT NULL DEFAULT now() ); ALTER TABLE public.organizations ENABLE ROW LEVEL SECURITY; -- Constraint único en name — requerido para ON CONFLICT (name) DO NOTHING en los INSERTs -- siguientes. Debe estar ANTES de cualquier INSERT (orden crítico). ALTER TABLE public.organizations ADD CONSTRAINT organizations_name_unique UNIQUE (name); -- Insertar la organización de InQuality como proveedor -- ON CONFLICT DO NOTHING: idempotente si ya existe INSERT INTO public.organizations (name, is_provider) VALUES ('InQuality', true) ON CONFLICT DO NOTHING; -- Agregar org_id a users (nullable — usuarios InQuality existentes no tienen org de cliente) ALTER TABLE public.users ADD COLUMN IF NOT EXISTS org_id uuid REFERENCES public.organizations(id) ON DELETE SET NULL; -- Agregar org_id a processes (nullable — procesos existentes se vinculan por migración automática) ALTER TABLE public.processes ADD COLUMN IF NOT EXISTS org_id uuid REFERENCES public.organizations(id) ON DELETE SET NULL; -- Ampliar check constraint de platform_role para incluir roles de cliente -- Primero eliminar la restricción existente, luego recrear con los valores nuevos ALTER TABLE public.users DROP CONSTRAINT IF EXISTS users_platform_role_check; ALTER TABLE public.users ADD CONSTRAINT users_platform_role_check CHECK (platform_role IN ('platform_admin', 'member', 'client_editor', 'client_viewer', 'guest')); -- ── Migración automática: crear orgs desde valores únicos de processes.client ── -- Crea una organización por cada client name único y no vacío. -- ON CONFLICT (name) DO NOTHING requiere el constraint organizations_name_unique definido arriba. INSERT INTO public.organizations (name, is_provider) SELECT DISTINCT trim(client), false FROM public.processes WHERE client IS NOT NULL AND trim(client) != '' ON CONFLICT (name) DO NOTHING; -- Vincular procesos a sus orgs recién creadas UPDATE public.processes p SET org_id = o.id FROM public.organizations o WHERE trim(o.name) = trim(p.client) AND o.is_provider = false AND p.org_id IS NULL; -- Asignar org_id de InQuality a usuarios InQuality existentes -- (los que tienen platform_role = 'platform_admin' o 'member') UPDATE public.users u SET org_id = (SELECT id FROM public.organizations WHERE is_provider = true LIMIT 1) WHERE u.org_id IS NULL AND u.platform_role IN ('platform_admin', 'member');