/* 05_tenant_compat_bootstrap.sql
   Ejecutar DESPUÉS de:
   01_tables_core.sql
   02_relations_fk.sql
   03_indexes_triggers.sql
   04_seed_min.sql
   y DESPUÉS de crear el usuario admin del tenant.

   Importante:
   - El search_path del tenant ya debe estar seteado por el caller.
   - NO insertar manualmente IDs en tablas core del tenant.
*/

/* =========================================================
   1) TABLAS LEGACY / COMPATIBILIDAD CON ESQUEMA DEMO
   ========================================================= */

CREATE TABLE IF NOT EXISTS config_empresa (
  id BIGSERIAL PRIMARY KEY,
  razon_social VARCHAR(200) NOT NULL,
  nombre_comercial VARCHAR(200),
  ruc VARCHAR(11),
  ticket_size VARCHAR(20) NOT NULL DEFAULT '80mm',
  pie_impresion TEXT,
  updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE IF NOT EXISTS establecimiento (
  id BIGSERIAL PRIMARY KEY,
  codigo VARCHAR(20),
  descripcion VARCHAR(120) NOT NULL,
  direccion VARCHAR(250),
  activo BOOLEAN NOT NULL DEFAULT TRUE,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE IF NOT EXISTS establecimiento_serie (
  id BIGSERIAL PRIMARY KEY,
  establecimiento_id BIGINT NOT NULL,
  serie VARCHAR(10) NOT NULL,
  activo BOOLEAN NOT NULL DEFAULT TRUE,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE UNIQUE INDEX IF NOT EXISTS ux_establecimiento_codigo
  ON establecimiento (codigo);

CREATE UNIQUE INDEX IF NOT EXISTS ux_establecimiento_serie_unique
  ON establecimiento_serie (establecimiento_id, serie);

DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1
    FROM pg_constraint
    WHERE conname = 'fk_establecimiento_serie_establecimiento'
      AND conrelid = 'establecimiento_serie'::regclass
  ) THEN
    ALTER TABLE establecimiento_serie
      ADD CONSTRAINT fk_establecimiento_serie_establecimiento
      FOREIGN KEY (establecimiento_id)
      REFERENCES establecimiento(id)
      ON DELETE CASCADE;
  END IF;
END $$;


/* =========================================================
   2) CATÁLOGOS EXTRA ÚTILES PARA DEJAR EL TENANT OPERATIVO
   ========================================================= */

INSERT INTO unidad_medida(codigo, nombre) VALUES
  ('NIU', 'Unidad')
ON CONFLICT (codigo) DO NOTHING;

INSERT INTO medio_pago(codigo, nombre) VALUES
  ('TARJ_CRED', 'Tarjeta de crédito'),
  ('TARJ_DEB',  'Tarjeta de débito'),
  ('DEP_CTA',   'Depósito a cuenta'),
  ('TRANSF',    'Transferencia bancaria')
ON CONFLICT (codigo) DO NOTHING;

INSERT INTO tipo_documento(codigo, nombre) VALUES
  ('GUIA',      'Guía'),
  ('N_CREDITO', 'Nota de crédito'),
  ('N_DEBITO',  'Nota de débito')
ON CONFLICT (codigo) DO NOTHING;


/* =========================================================
   3) FUNCIONES DE SINCRONIZACIÓN NUEVO MODELO -> LEGACY
   ========================================================= */

CREATE OR REPLACE FUNCTION compat_sync_empresa_to_config_empresa()
RETURNS TRIGGER AS $$
DECLARE
  v_cfg_id BIGINT;
BEGIN
  SELECT id
    INTO v_cfg_id
  FROM config_empresa
  ORDER BY id ASC
  LIMIT 1;

  IF v_cfg_id IS NULL THEN
    INSERT INTO config_empresa(
      razon_social, nombre_comercial, ruc, ticket_size, pie_impresion, updated_at
    )
    VALUES (
      NEW.razon_social,
      NEW.nombre_comercial,
      NEW.ruc,
      '80mm',
      'Gracias por su compra',
      NOW()
    );
  ELSE
    UPDATE config_empresa
       SET razon_social     = NEW.razon_social,
           nombre_comercial = NEW.nombre_comercial,
           ruc              = NEW.ruc,
           updated_at       = NOW()
     WHERE id = v_cfg_id;
  END IF;

  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION compat_ensure_establecimiento_from_sucursal(p_sucursal_id BIGINT)
RETURNS BIGINT AS $$
DECLARE
  v_codigo     VARCHAR(20);
  v_nombre     VARCHAR(120);
  v_direccion  VARCHAR(250);
  v_activo     BOOLEAN;
  v_est_id     BIGINT;
BEGIN
  SELECT s.codigo, s.nombre, s.direccion, s.activo
    INTO v_codigo, v_nombre, v_direccion, v_activo
  FROM sucursal s
  WHERE s.id = p_sucursal_id
  LIMIT 1;

  IF NOT FOUND THEN
    RETURN NULL;
  END IF;

  IF v_codigo IS NULL OR btrim(v_codigo) = '' THEN
    RETURN NULL;
  END IF;

  INSERT INTO establecimiento(codigo, descripcion, direccion, activo, created_at)
  VALUES (
    v_codigo,
    v_nombre,
    v_direccion,
    COALESCE(v_activo, TRUE),
    NOW()
  )
  ON CONFLICT (codigo) DO UPDATE
     SET descripcion = EXCLUDED.descripcion,
         direccion   = EXCLUDED.direccion,
         activo      = EXCLUDED.activo;

  SELECT id
    INTO v_est_id
  FROM establecimiento
  WHERE codigo = v_codigo
  ORDER BY id ASC
  LIMIT 1;

  RETURN v_est_id;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION compat_sync_sucursal_to_establecimiento()
RETURNS TRIGGER AS $$
BEGIN
  PERFORM compat_ensure_establecimiento_from_sucursal(NEW.id);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION compat_delete_establecimiento_from_sucursal()
RETURNS TRIGGER AS $$
BEGIN
  IF OLD.codigo IS NOT NULL THEN
    DELETE FROM establecimiento
    WHERE codigo = OLD.codigo;
  END IF;
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION compat_sync_serie_to_establecimiento_serie()
RETURNS TRIGGER AS $$
DECLARE
  v_new_est_id BIGINT;
  v_old_est_id BIGINT;
BEGIN
  IF TG_OP = 'UPDATE' THEN
    IF OLD.sucursal_id IS DISTINCT FROM NEW.sucursal_id
       OR OLD.serie IS DISTINCT FROM NEW.serie THEN

      v_old_est_id := compat_ensure_establecimiento_from_sucursal(OLD.sucursal_id);

      IF v_old_est_id IS NOT NULL THEN
        DELETE FROM establecimiento_serie
        WHERE establecimiento_id = v_old_est_id
          AND serie = OLD.serie;
      END IF;
    END IF;
  END IF;

  v_new_est_id := compat_ensure_establecimiento_from_sucursal(NEW.sucursal_id);

  IF v_new_est_id IS NULL THEN
    RETURN NEW;
  END IF;

  INSERT INTO establecimiento_serie(
    establecimiento_id, serie, activo, created_at
  )
  VALUES (
    v_new_est_id,
    NEW.serie,
    COALESCE(NEW.activo, TRUE),
    NOW()
  )
  ON CONFLICT (establecimiento_id, serie) DO UPDATE
     SET activo = EXCLUDED.activo;

  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION compat_delete_establecimiento_serie()
RETURNS TRIGGER AS $$
DECLARE
  v_est_id BIGINT;
BEGIN
  v_est_id := compat_ensure_establecimiento_from_sucursal(OLD.sucursal_id);

  IF v_est_id IS NOT NULL THEN
    DELETE FROM establecimiento_serie
    WHERE establecimiento_id = v_est_id
      AND serie = OLD.serie;
  END IF;

  RETURN OLD;
END;
$$ LANGUAGE plpgsql;


/* =========================================================
   4) TRIGGERS DE COMPATIBILIDAD
   ========================================================= */

DROP TRIGGER IF EXISTS trg_compat_empresa_to_config_empresa ON empresa;
CREATE TRIGGER trg_compat_empresa_to_config_empresa
AFTER INSERT OR UPDATE ON empresa
FOR EACH ROW
EXECUTE FUNCTION compat_sync_empresa_to_config_empresa();

DROP TRIGGER IF EXISTS trg_compat_sucursal_to_establecimiento ON sucursal;
CREATE TRIGGER trg_compat_sucursal_to_establecimiento
AFTER INSERT OR UPDATE ON sucursal
FOR EACH ROW
EXECUTE FUNCTION compat_sync_sucursal_to_establecimiento();

DROP TRIGGER IF EXISTS trg_compat_sucursal_delete_establecimiento ON sucursal;
CREATE TRIGGER trg_compat_sucursal_delete_establecimiento
AFTER DELETE ON sucursal
FOR EACH ROW
EXECUTE FUNCTION compat_delete_establecimiento_from_sucursal();

DROP TRIGGER IF EXISTS trg_compat_serie_to_establecimiento_serie ON serie_documento;
CREATE TRIGGER trg_compat_serie_to_establecimiento_serie
AFTER INSERT OR UPDATE ON serie_documento
FOR EACH ROW
EXECUTE FUNCTION compat_sync_serie_to_establecimiento_serie();

DROP TRIGGER IF EXISTS trg_compat_serie_delete_establecimiento_serie ON serie_documento;
CREATE TRIGGER trg_compat_serie_delete_establecimiento_serie
AFTER DELETE ON serie_documento
FOR EACH ROW
EXECUTE FUNCTION compat_delete_establecimiento_serie();


/* =========================================================
   5) BOOTSTRAP MÍNIMO DEL TENANT (SIN INSERTAR IDs MANUALES)
   ========================================================= */

DO $$
DECLARE
  v_empresa_id BIGINT;
BEGIN
  IF NOT EXISTS (SELECT 1 FROM empresa) THEN
    INSERT INTO empresa(
      razon_social,
      nombre_comercial,
      ruc,
      direccion,
      telefono,
      email,
      moneda,
      timezone,
      activo,
      created_at,
      updated_at
    )
    VALUES (
      'EMPRESA DEMO',
      'EMPRESA DEMO',
      NULL,
      NULL,
      NULL,
      NULL,
      'PEN',
      'America/Lima',
      TRUE,
      NOW(),
      NOW()
    );
  END IF;

  SELECT id
    INTO v_empresa_id
  FROM empresa
  ORDER BY id ASC
  LIMIT 1;

  IF v_empresa_id IS NOT NULL THEN
    INSERT INTO empresa_config(
      empresa_id,
      permitir_stock_negativo,
      single_session,
      requerir_datos_controlados,
      created_at
    )
    SELECT
      v_empresa_id,
      TRUE,
      FALSE,
      TRUE,
      NOW()
    WHERE NOT EXISTS (
      SELECT 1
      FROM empresa_config ec
      WHERE ec.empresa_id = v_empresa_id
    );
  END IF;
END $$;

DO $$
DECLARE
  v_empresa_id BIGINT;
BEGIN
  SELECT id
    INTO v_empresa_id
  FROM empresa
  ORDER BY id ASC
  LIMIT 1;

  IF v_empresa_id IS NULL THEN
    RETURN;
  END IF;

  IF NOT EXISTS (
    SELECT 1 FROM categoria_producto
    WHERE empresa_id = v_empresa_id AND nombre = 'FARMACIA - VARIOS'
  ) THEN
    INSERT INTO categoria_producto(empresa_id, nombre, activo)
    VALUES (v_empresa_id, 'FARMACIA - VARIOS', TRUE);
  END IF;

  IF NOT EXISTS (
    SELECT 1 FROM categoria_producto
    WHERE empresa_id = v_empresa_id AND nombre = 'MARKOS'
  ) THEN
    INSERT INTO categoria_producto(empresa_id, nombre, activo)
    VALUES (v_empresa_id, 'MARKOS', TRUE);
  END IF;

  IF NOT EXISTS (
    SELECT 1 FROM categoria_producto
    WHERE empresa_id = v_empresa_id AND nombre = 'SERVICIOS'
  ) THEN
    INSERT INTO categoria_producto(empresa_id, nombre, activo)
    VALUES (v_empresa_id, 'SERVICIOS', TRUE);
  END IF;
END $$;

DO $$
DECLARE
  v_empresa_id BIGINT;
  v_user_id    BIGINT;
BEGIN
  SELECT e.id
    INTO v_empresa_id
  FROM empresa e
  ORDER BY e.id ASC
  LIMIT 1;

  SELECT u.id
    INTO v_user_id
  FROM usuario u
  JOIN rol r ON r.id = u.rol_id
  WHERE u.activo = TRUE
    AND UPPER(r.nombre) = 'ADMIN'
  ORDER BY u.id ASC
  LIMIT 1;

  IF v_user_id IS NULL THEN
    SELECT u.id
      INTO v_user_id
    FROM usuario u
    WHERE u.activo = TRUE
    ORDER BY u.id ASC
    LIMIT 1;
  END IF;

  IF v_empresa_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sucursal) THEN
    INSERT INTO sucursal(
      empresa_id,
      codigo,
      nombre,
      direccion,
      telefono,
      responsable_usuario_id,
      activo,
      created_at,
      updated_at
    )
    VALUES (
      v_empresa_id,
      'S01',
      'OFICINA PRINCIPAL',
      NULL,
      NULL,
      v_user_id,
      TRUE,
      NOW(),
      NOW()
    );
  END IF;

  IF v_user_id IS NOT NULL THEN
    UPDATE sucursal
       SET responsable_usuario_id = COALESCE(responsable_usuario_id, v_user_id),
           updated_at = NOW()
     WHERE id = (
       SELECT id FROM sucursal ORDER BY id ASC LIMIT 1
     );
  END IF;
END $$;

DO $$
DECLARE
  v_sucursal_id BIGINT;
  v_admin_id    BIGINT;
BEGIN
  SELECT s.id
    INTO v_sucursal_id
  FROM sucursal s
  ORDER BY s.id ASC
  LIMIT 1;

  IF v_sucursal_id IS NULL THEN
    RETURN;
  END IF;

  SELECT u.id
    INTO v_admin_id
  FROM usuario u
  JOIN rol r ON r.id = u.rol_id
  WHERE u.activo = TRUE
    AND UPPER(r.nombre) = 'ADMIN'
  ORDER BY u.id ASC
  LIMIT 1;

  IF v_admin_id IS NULL THEN
    SELECT u.id
      INTO v_admin_id
    FROM usuario u
    WHERE u.activo = TRUE
    ORDER BY u.id ASC
    LIMIT 1;
  END IF;

  IF v_admin_id IS NOT NULL THEN
    UPDATE usuario_sucursal
       SET es_principal = FALSE
     WHERE usuario_id = v_admin_id;

    INSERT INTO usuario_sucursal(usuario_id, sucursal_id, es_principal)
    VALUES (v_admin_id, v_sucursal_id, TRUE)
    ON CONFLICT (usuario_id, sucursal_id) DO UPDATE
       SET es_principal = EXCLUDED.es_principal;
  END IF;
END $$;

DO $$
DECLARE
  v_empresa_id BIGINT;
  v_sucursal_id BIGINT;
BEGIN
  SELECT e.id
    INTO v_empresa_id
  FROM empresa e
  ORDER BY e.id ASC
  LIMIT 1;

  SELECT s.id
    INTO v_sucursal_id
  FROM sucursal s
  ORDER BY s.id ASC
  LIMIT 1;

  IF v_empresa_id IS NULL OR v_sucursal_id IS NULL THEN
    RETURN;
  END IF;

  INSERT INTO lista_precio(empresa_id, nombre, moneda, activo)
  VALUES (v_empresa_id, 'GENERAL', 'PEN', TRUE)
  ON CONFLICT (empresa_id, nombre) DO NOTHING;

  INSERT INTO sucursal_lista_precio(sucursal_id, lista_id, es_default)
  SELECT
    v_sucursal_id,
    lp.id,
    TRUE
  FROM lista_precio lp
  WHERE lp.empresa_id = v_empresa_id
    AND lp.nombre = 'GENERAL'
  ON CONFLICT (sucursal_id, lista_id) DO UPDATE
     SET es_default = EXCLUDED.es_default;
END $$;

DO $$
DECLARE
  v_empresa_id BIGINT;
BEGIN
  SELECT e.id
    INTO v_empresa_id
  FROM empresa e
  ORDER BY e.id ASC
  LIMIT 1;

  IF v_empresa_id IS NULL THEN
    RETURN;
  END IF;

  INSERT INTO cliente(
    empresa_id,
    tipo_doc,
    nro_doc,
    nombres,
    direccion,
    telefono,
    email,
    activo,
    created_at
  )
  SELECT
    v_empresa_id,
    'DNI',
    '00000000',
    'CLIENTES VARIOS',
    '-',
    NULL,
    NULL,
    TRUE,
    NOW()
  WHERE NOT EXISTS (
    SELECT 1
    FROM cliente c
    WHERE c.empresa_id = v_empresa_id
      AND c.tipo_doc = 'DNI'
      AND c.nro_doc = '00000000'
  );
END $$;

DO $$
DECLARE
  v_empresa_id BIGINT;
BEGIN
  SELECT e.id
    INTO v_empresa_id
  FROM empresa e
  ORDER BY e.id ASC
  LIMIT 1;

  IF v_empresa_id IS NULL THEN
    RETURN;
  END IF;

  INSERT INTO puntos_regla(
    empresa_id,
    activo,
    soles_por_punto,
    created_at
  )
  SELECT
    v_empresa_id,
    TRUE,
    1,
    NOW()
  WHERE NOT EXISTS (
    SELECT 1
    FROM puntos_regla pr
    WHERE pr.empresa_id = v_empresa_id
  );
END $$;

DO $$
DECLARE
  v_empresa_id  BIGINT;
  v_sucursal_id BIGINT;
BEGIN
  SELECT e.id
    INTO v_empresa_id
  FROM empresa e
  ORDER BY e.id ASC
  LIMIT 1;

  SELECT s.id
    INTO v_sucursal_id
  FROM sucursal s
  ORDER BY s.id ASC
  LIMIT 1;

  IF v_empresa_id IS NULL OR v_sucursal_id IS NULL THEN
    RETURN;
  END IF;

  INSERT INTO printer_profile(
    empresa_id, nombre, tipo, driver, parametros, activo
  )
  VALUES
    (v_empresa_id, 'TICKET 58', 'TICKET_58', NULL, '{}'::jsonb, TRUE),
    (v_empresa_id, 'TICKET 80', 'TICKET_80', NULL, '{}'::jsonb, TRUE),
    (v_empresa_id, 'A4',        'A4',        NULL, '{}'::jsonb, TRUE),
    (v_empresa_id, 'A5',        'A5',        NULL, '{}'::jsonb, TRUE)
  ON CONFLICT (empresa_id, nombre) DO NOTHING;

  INSERT INTO sucursal_printer(sucursal_id, tipo_documento_id, printer_profile_id)
  SELECT
    v_sucursal_id,
    td.id,
    pp.id
  FROM tipo_documento td
  JOIN printer_profile pp
    ON pp.empresa_id = v_empresa_id
   AND pp.nombre = CASE
                     WHEN td.codigo IN ('TICKET','BOLETA') THEN 'TICKET 80'
                     WHEN td.codigo = 'FACTURA' THEN 'A4'
                     ELSE 'TICKET 80'
                   END
  WHERE td.codigo IN ('TICKET','BOLETA','FACTURA')
  ON CONFLICT (sucursal_id, tipo_documento_id) DO UPDATE
     SET printer_profile_id = EXCLUDED.printer_profile_id;
END $$;

DO $$
DECLARE
  v_sucursal_id BIGINT;
BEGIN
  SELECT s.id
    INTO v_sucursal_id
  FROM sucursal s
  ORDER BY s.id ASC
  LIMIT 1;

  IF v_sucursal_id IS NULL THEN
    RETURN;
  END IF;

  INSERT INTO caja(sucursal_id, nombre, activo)
  VALUES (v_sucursal_id, 'CAJA PRINCIPAL', TRUE)
  ON CONFLICT (sucursal_id, nombre) DO NOTHING;
END $$;

DO $$
DECLARE
  v_sucursal_id BIGINT;
BEGIN
  SELECT s.id
    INTO v_sucursal_id
  FROM sucursal s
  ORDER BY s.id ASC
  LIMIT 1;

  IF v_sucursal_id IS NULL THEN
    RETURN;
  END IF;

  INSERT INTO ubicacion(sucursal_id, codigo, tipo, descripcion, activo)
  VALUES
    (v_sucursal_id, 'ALM01', 'ALMACEN',  'Almacén principal', TRUE),
    (v_sucursal_id, 'VIT01', 'VITRINA',  'Vitrina principal', TRUE),
    (v_sucursal_id, 'DSP01', 'DESPENSA', 'Despensa principal', TRUE)
  ON CONFLICT (sucursal_id, codigo) DO NOTHING;
END $$;

DO $$
DECLARE
  v_sucursal_id BIGINT;
  v_ticket_id   BIGINT;
  v_boleta_id   BIGINT;
  v_factura_id  BIGINT;
BEGIN
  SELECT s.id
    INTO v_sucursal_id
  FROM sucursal s
  ORDER BY s.id ASC
  LIMIT 1;

  IF v_sucursal_id IS NULL THEN
    RETURN;
  END IF;

  SELECT id INTO v_ticket_id
  FROM tipo_documento
  WHERE codigo = 'TICKET'
  LIMIT 1;

  SELECT id INTO v_boleta_id
  FROM tipo_documento
  WHERE codigo = 'BOLETA'
  LIMIT 1;

  SELECT id INTO v_factura_id
  FROM tipo_documento
  WHERE codigo = 'FACTURA'
  LIMIT 1;

  IF v_ticket_id IS NOT NULL THEN
    INSERT INTO serie_documento(
      sucursal_id, tipo_documento_id, serie, prefijo, correlativo, activo
    )
    VALUES (
      v_sucursal_id, v_ticket_id, 'NV01', 'NV', 1, TRUE
    )
    ON CONFLICT (sucursal_id, tipo_documento_id, serie) DO NOTHING;
  END IF;

  IF v_boleta_id IS NOT NULL THEN
    INSERT INTO serie_documento(
      sucursal_id, tipo_documento_id, serie, prefijo, correlativo, activo
    )
    VALUES (
      v_sucursal_id, v_boleta_id, 'B001', 'B', 1, TRUE
    )
    ON CONFLICT (sucursal_id, tipo_documento_id, serie) DO NOTHING;
  END IF;

  IF v_factura_id IS NOT NULL THEN
    INSERT INTO serie_documento(
      sucursal_id, tipo_documento_id, serie, prefijo, correlativo, activo
    )
    VALUES (
      v_sucursal_id, v_factura_id, 'F001', 'F', 1, TRUE
    )
    ON CONFLICT (sucursal_id, tipo_documento_id, serie) DO NOTHING;
  END IF;
END $$;


/* =========================================================
   6) BACKFILL INICIAL PARA LEGACY SI EL TENANT YA TENÍA DATOS
   ========================================================= */

DO $$
DECLARE
  v_cfg_id BIGINT;
  v_rs     VARCHAR(200);
  v_nc     VARCHAR(200);
  v_ruc    VARCHAR(11);
BEGIN
  SELECT e.razon_social, e.nombre_comercial, e.ruc
    INTO v_rs, v_nc, v_ruc
  FROM empresa e
  ORDER BY e.id ASC
  LIMIT 1;

  IF v_rs IS NULL THEN
    RETURN;
  END IF;

  SELECT id
    INTO v_cfg_id
  FROM config_empresa
  ORDER BY id ASC
  LIMIT 1;

  IF v_cfg_id IS NULL THEN
    INSERT INTO config_empresa(
      razon_social, nombre_comercial, ruc, ticket_size, pie_impresion, updated_at
    )
    VALUES (
      v_rs,
      v_nc,
      v_ruc,
      '80mm',
      'Gracias por su compra',
      NOW()
    );
  ELSE
    UPDATE config_empresa
       SET razon_social     = v_rs,
           nombre_comercial = v_nc,
           ruc              = v_ruc,
           updated_at       = NOW()
     WHERE id = v_cfg_id;
  END IF;
END $$;

DO $$
DECLARE
  r RECORD;
BEGIN
  FOR r IN
    SELECT id
    FROM sucursal
    ORDER BY id ASC
  LOOP
    PERFORM compat_ensure_establecimiento_from_sucursal(r.id);
  END LOOP;
END $$;

DO $$
BEGIN
  INSERT INTO establecimiento_serie(
    establecimiento_id, serie, activo, created_at
  )
  SELECT
    e.id,
    sd.serie,
    sd.activo,
    NOW()
  FROM serie_documento sd
  JOIN sucursal s
    ON s.id = sd.sucursal_id
  JOIN establecimiento e
    ON e.codigo = s.codigo
  ON CONFLICT (establecimiento_id, serie) DO UPDATE
     SET activo = EXCLUDED.activo;
END $$;