-- Reemplaza el UNIQUE (uuid) case-sensitive por un índice funcional
-- UNIQUE (LOWER(uuid)), como defensa en profundidad contra duplicados por
-- mismatch de case. El código fuente ya normaliza a lowercase en el insert
-- (saveCfdis y saveMetadata en sat.service.ts), pero este constraint previene
-- que cualquier insert manual o vía futuro path pueda reintroducir el bug.
--
-- Prerequisito: migración 026 ya normalizó todos los UUIDs existentes a
-- lowercase y eliminó duplicados case-insensitive. Si no se aplicó antes, el
-- CREATE UNIQUE INDEX fallará con "could not create unique index" y habrá que
-- correr 026 primero.
--
-- Idempotente: si el índice nuevo ya existe, IF NOT EXISTS lo salta.

ALTER TABLE cfdis DROP CONSTRAINT IF EXISTS cfdis_uuid_key;

CREATE UNIQUE INDEX IF NOT EXISTS cfdis_uuid_lower_key
  ON cfdis (LOWER(uuid))
  WHERE uuid IS NOT NULL;

INSERT INTO tenant_migrations (scope, version, name)
VALUES ('vertical-contable', 27, '027_cfdi_uuid_unique_case_insensitive')
ON CONFLICT (scope, version) DO NOTHING;
