-- ============================================
-- MIGRACIÓN 006: Corrección del procedimiento cancel_fact
-- ============================================
-- Problema: Cuando se anula una boleta, la lectura asociada no se restaura
-- a estado pendiente, impidiendo generar una nueva boleta para ese cliente.
--
-- Solución: Actualizar el procedimiento para que restaure la lectura a:
-- - id_boleta = 0
-- - estado_pago = 0
-- ============================================

DELIMITER $$

DROP PROCEDURE IF EXISTS cancel_fact$$

CREATE PROCEDURE cancel_fact(IN id_bolet INT)
BEGIN
    DECLARE id_cli INT;
    DECLARE fecha_boleta DATE;
    
    -- Obtener datos de la boleta
    SELECT id_cliente, fecha_a_pagar 
    INTO id_cli, fecha_boleta
    FROM boletas 
    WHERE id_boleta = id_bolet;
    
    -- 1. Marcar la boleta como anulada
    UPDATE boletas 
    SET estado_pago = 9
    WHERE id_boleta = id_bolet;
    
    -- 2. CRÍTICO: Restaurar la lectura asociada a estado pendiente
    -- Esto permite que el cliente pueda ser facturado nuevamente
    UPDATE lecturas_clie_mensual
    SET id_boleta = 0,
        estado_pago = 0
    WHERE id_cliente = id_cli
      AND MONTH(fecha_ingreso_lectura) = MONTH(fecha_boleta)
      AND YEAR(fecha_ingreso_lectura) = YEAR(fecha_boleta)
      AND id_boleta = id_bolet;
    
    -- 3. Eliminar o marcar la deuda asociada como anulada
    DELETE FROM deudas 
    WHERE Id_boleta = id_bolet;
    
END$$

DELIMITER ;

-- ============================================
-- SCRIPT DE CORRECCIÓN PARA LECTURAS YA AFECTADAS
-- ============================================
-- Este script restaura las lecturas asociadas a boletas anuladas
-- que no fueron restauradas correctamente
-- ============================================

-- Restaurar lecturas de boletas anuladas (estado_pago = 9)
UPDATE lecturas_clie_mensual l
INNER JOIN boletas b ON l.id_boleta = b.id_boleta
SET l.id_boleta = 0,
    l.estado_pago = 0
WHERE b.estado_pago = 9  -- Boletas anuladas
  AND l.id_boleta != 0;  -- Lecturas que aún tienen referencia a la boleta

-- Verificación: Mostrar cuántas lecturas fueron restauradas
SELECT COUNT(*) as lecturas_restauradas
FROM lecturas_clie_mensual l
INNER JOIN boletas b ON l.id_cliente = b.id_cliente
WHERE b.estado_pago = 9
  AND l.id_boleta = 0
  AND l.estado_pago = 0
  AND MONTH(l.fecha_ingreso_lectura) = MONTH(b.fecha_a_pagar)
  AND YEAR(l.fecha_ingreso_lectura) = YEAR(b.fecha_a_pagar);
