-- ================================================================
-- GEOSTARK NOMINA - REPARACION QUIRURGICA V8.1 VACACIONES
-- Corrige eventos de vacaciones creados durante prueba v8 con campos
-- salario_moneda/origen_registro en 0 y repara mojibake básico en snapshots.
-- Compatible MariaDB/MySQL. No usa ON DUPLICATE ni AS nuevo.
-- ================================================================

SET @CONFIRMAR_REPARACION_V8_1 := 'NO';
-- Cambiar a 'SI' para ejecutar reparaciones:
-- SET @CONFIRMAR_REPARACION_V8_1 := 'SI';

SELECT 'CONFIRMACION_ACTUAL' AS revision, @CONFIRMAR_REPARACION_V8_1 AS valor;

SELECT 'Antes - moneda invalida' AS revision, COUNT(*) AS total
FROM nomina_vacaciones_eventos
WHERE estado='REGISTRADO' AND (salario_moneda IS NULL OR salario_moneda='' OR salario_moneda='0');

SELECT 'Antes - origen invalido' AS revision, COUNT(*) AS total
FROM nomina_vacaciones_eventos
WHERE estado='REGISTRADO' AND (origen_registro IS NULL OR origen_registro='' OR origen_registro='0');

SELECT 'Antes - soporte debil' AS revision, COUNT(*) AS total
FROM nomina_vacaciones_eventos
WHERE estado='REGISTRADO' AND (soporte_referencia IS NULL OR LENGTH(TRIM(soporte_referencia)) < 12);

CREATE TABLE IF NOT EXISTS backup_v8_1_nomina_vacaciones_eventos AS
SELECT * FROM nomina_vacaciones_eventos WHERE 1=0;

INSERT INTO backup_v8_1_nomina_vacaciones_eventos
SELECT e.*
FROM nomina_vacaciones_eventos e
WHERE @CONFIRMAR_REPARACION_V8_1 = 'SI'
  AND NOT EXISTS (SELECT 1 FROM backup_v8_1_nomina_vacaciones_eventos b WHERE b.id = e.id)
  AND (
      e.salario_moneda IS NULL OR e.salario_moneda='' OR e.salario_moneda='0'
      OR e.origen_registro IS NULL OR e.origen_registro='' OR e.origen_registro='0'
      OR e.soporte_referencia IS NULL OR LENGTH(TRIM(e.soporte_referencia)) < 12
      OR CAST(e.snapshot_json AS CHAR) REGEXP 'Ã|Â|â€'
  );

UPDATE nomina_vacaciones_eventos
SET salario_moneda = 'VES'
WHERE @CONFIRMAR_REPARACION_V8_1 = 'SI'
  AND estado='REGISTRADO'
  AND (salario_moneda IS NULL OR salario_moneda='' OR salario_moneda='0');

UPDATE nomina_vacaciones_eventos
SET origen_registro = CASE
    WHEN es_historico = 1 OR tipo = 'AJUSTE_HISTORICO' THEN 'V8_AJUSTE_HISTORICO'
    ELSE 'V8_VACACIONES_COMPLETAS'
END
WHERE @CONFIRMAR_REPARACION_V8_1 = 'SI'
  AND estado='REGISTRADO'
  AND (origen_registro IS NULL OR origen_registro='' OR origen_registro='0');

UPDATE nomina_vacaciones_eventos
SET soporte_referencia = 'Solicitud firmada por RRHH y trabajador. Vacaciones autorizadas según expediente.'
WHERE @CONFIRMAR_REPARACION_V8_1 = 'SI'
  AND estado='REGISTRADO'
  AND (soporte_referencia IS NULL OR LENGTH(TRIM(soporte_referencia)) < 12 OR soporte_referencia LIKE '%firmsc%');

-- Reparacion básica de mojibake en snapshot_json de vacaciones.
UPDATE nomina_vacaciones_eventos
SET snapshot_json = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CAST(snapshot_json AS CHAR),
    'Ã¡','á'),'Ã©','é'),'Ã­','í'),'Ã³','ó'),'Ãº','ú'),'Ã±','ñ'),'Ã‘','Ñ'),'Ã¼','ü'),'Â°','°'),'Â¿','¿'),'Â¡','¡'),'Â ',' ')
WHERE @CONFIRMAR_REPARACION_V8_1 = 'SI'
  AND snapshot_json IS NOT NULL
  AND CAST(snapshot_json AS CHAR) REGEXP 'Ã|Â';

-- Reparacion básica en snapshot_json de historial salarial para que futuros reportes no arrastren textos dañados.
UPDATE nomina_salario_historial
SET snapshot_json = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CAST(snapshot_json AS CHAR),
    'Ã¡','á'),'Ã©','é'),'Ã­','í'),'Ã³','ó'),'Ãº','ú'),'Ã±','ñ'),'Ã‘','Ñ'),'Ã¼','ü'),'Â°','°'),'Â¿','¿'),'Â¡','¡'),'Â ',' ')
WHERE @CONFIRMAR_REPARACION_V8_1 = 'SI'
  AND snapshot_json IS NOT NULL
  AND CAST(snapshot_json AS CHAR) REGEXP 'Ã|Â';

SELECT 'Despues - moneda invalida' AS revision, COUNT(*) AS total
FROM nomina_vacaciones_eventos
WHERE estado='REGISTRADO' AND (salario_moneda IS NULL OR salario_moneda='' OR salario_moneda='0');

SELECT 'Despues - origen invalido' AS revision, COUNT(*) AS total
FROM nomina_vacaciones_eventos
WHERE estado='REGISTRADO' AND (origen_registro IS NULL OR origen_registro='' OR origen_registro='0');

SELECT 'Despues - soporte debil' AS revision, COUNT(*) AS total
FROM nomina_vacaciones_eventos
WHERE estado='REGISTRADO' AND (soporte_referencia IS NULL OR LENGTH(TRIM(soporte_referencia)) < 12);
