59 lines
2.7 KiB
SQL
59 lines
2.7 KiB
SQL
-- 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');
|