-- ============================================================
-- GEOSTARK NOMINA - V8.4 VALIDACION / REPARACION COPIA VACACIONES
-- Compatible MariaDB/MySQL. No usa AS nuevo ni ON DUPLICATE KEY UPDATE.
-- Primero ejecutar en NO. Si los conteos son correctos, cambiar a SI.
-- ============================================================

SET @CONFIRMAR_REPARACION_V8_4 := 'NO';

SELECT 'Eventos de vacaciones asociados a periodo' AS revision,
       COUNT(*) AS eventos,
       ROUND(SUM(IFNULL(monto_disfrute_bs,0) + IFNULL(monto_bono_bs,0)),2) AS total_eventos_bs
FROM nomina_vacaciones_eventos
WHERE IFNULL(periodo_id,0) > 0
  AND estado = 'REGISTRADO';

SELECT 'Novedades con pago vacaciones' AS revision,
       COUNT(*) AS filas,
       ROUND(SUM(IFNULL(pago_vacaciones_bs,0)),2) AS total_novedades_bs
FROM novedades_periodo
WHERE IFNULL(pago_vacaciones_bs,0) > 0;

SELECT 'Diferencias evento vs novedad' AS revision,
       v.periodo_id,
       p.codigo AS periodo,
       v.persona_id,
       CONCAT(IFNULL(pe.apellido,''), ' ', IFNULL(pe.nombre,'')) AS trabajador,
       ROUND(v.total_eventos_bs,2) AS total_eventos_bs,
       ROUND(IFNULL(n.pago_vacaciones_bs,0),2) AS pago_novedad_bs,
       ROUND(v.total_eventos_bs - IFNULL(n.pago_vacaciones_bs,0),2) AS diferencia_bs
FROM (
    SELECT periodo_id, persona_id,
           SUM(IFNULL(monto_disfrute_bs,0) + IFNULL(monto_bono_bs,0)) AS total_eventos_bs
    FROM nomina_vacaciones_eventos
    WHERE IFNULL(periodo_id,0) > 0
      AND estado = 'REGISTRADO'
    GROUP BY periodo_id, persona_id
) v
LEFT JOIN novedades_periodo n
       ON n.periodo_id = v.periodo_id
      AND n.persona_id = v.persona_id
LEFT JOIN periodos_nomina p ON p.id = v.periodo_id
LEFT JOIN personas pe ON pe.id = v.persona_id
WHERE ROUND(IFNULL(n.pago_vacaciones_bs,0),2) < ROUND(v.total_eventos_bs,2)
ORDER BY v.periodo_id, trabajador;

-- Reparación controlada: solo sube pago_vacaciones_bs cuando está por debajo
-- del total de eventos de vacaciones copiados/asociados al período.
UPDATE novedades_periodo n
JOIN (
    SELECT periodo_id, persona_id,
           ROUND(SUM(IFNULL(monto_disfrute_bs,0) + IFNULL(monto_bono_bs,0)),2) AS total_eventos_bs
    FROM nomina_vacaciones_eventos
    WHERE IFNULL(periodo_id,0) > 0
      AND estado = 'REGISTRADO'
    GROUP BY periodo_id, persona_id
) v
  ON v.periodo_id = n.periodo_id
 AND v.persona_id = n.persona_id
SET n.pago_vacaciones_bs = v.total_eventos_bs,
    n.observaciones = TRIM(CONCAT(
        IFNULL(n.observaciones,''),
        CASE WHEN IFNULL(n.observaciones,'') = '' THEN '' ELSE ' | ' END,
        'Reparación v8.4: monto de vacaciones restaurado desde evento registrado'
    ))
WHERE @CONFIRMAR_REPARACION_V8_4 = 'SI'
  AND ROUND(IFNULL(n.pago_vacaciones_bs,0),2) < ROUND(v.total_eventos_bs,2);

SELECT 'POST reparacion - diferencias restantes' AS revision,
       COUNT(*) AS diferencias_restantes
FROM (
    SELECT v.periodo_id, v.persona_id
    FROM (
        SELECT periodo_id, persona_id,
               ROUND(SUM(IFNULL(monto_disfrute_bs,0) + IFNULL(monto_bono_bs,0)),2) AS total_eventos_bs
        FROM nomina_vacaciones_eventos
        WHERE IFNULL(periodo_id,0) > 0
          AND estado = 'REGISTRADO'
        GROUP BY periodo_id, persona_id
    ) v
    LEFT JOIN novedades_periodo n
           ON n.periodo_id = v.periodo_id
          AND n.persona_id = v.persona_id
    WHERE ROUND(IFNULL(n.pago_vacaciones_bs,0),2) < ROUND(v.total_eventos_bs,2)
) d;
