-- ================================================================
-- GEOSTARK NOMINA - OPCIONAL V8.5 ANULAR CORRIDAS SUPERADAS
-- Usar solo en PRUEBAS si quieres limpiar corridas calculadas antiguas.
-- No toca la ultima corrida no anulada de cada periodo.
-- No borra detalle ni movimientos; solo marca estado ANULADA y bloqueada.
-- ================================================================

SET @CONFIRMAR_ANULAR_SUPERADAS := 'NO';

SELECT 'Corridas que serian marcadas como ANULADA' AS revision,
       p.codigo AS periodo,
       nc.id AS corrida_id,
       nc.estado,
       nc.fecha_calculo,
       ult.latest_id AS corrida_vigente
FROM nomina_corridas nc
JOIN periodos_nomina p ON p.id = nc.periodo_id
JOIN (
    SELECT periodo_id, MAX(id) AS latest_id
    FROM nomina_corridas
    WHERE estado <> 'ANULADA'
    GROUP BY periodo_id
) ult ON ult.periodo_id = nc.periodo_id
WHERE nc.estado IN ('BORRADOR','CALCULADA')
  AND nc.id < ult.latest_id
ORDER BY p.fecha_desde DESC, nc.id DESC;

UPDATE nomina_corridas nc
JOIN (
    SELECT periodo_id, MAX(id) AS latest_id
    FROM nomina_corridas
    WHERE estado <> 'ANULADA'
    GROUP BY periodo_id
) ult ON ult.periodo_id = nc.periodo_id
SET nc.estado = 'ANULADA',
    nc.bloqueada = 1,
    nc.notas = CONCAT(COALESCE(nc.notas,''), ' | Anulada por v8.5: corrida superada por #', ult.latest_id)
WHERE @CONFIRMAR_ANULAR_SUPERADAS = 'SI'
  AND nc.estado IN ('BORRADOR','CALCULADA')
  AND nc.id < ult.latest_id;

SELECT 'Registros actualizados' AS revision, ROW_COUNT() AS total;
