DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`Trabuque`(IN intIDTICKET BIGINT, IN dblINCREMENTO DOUBLE )
BEGIN



#Vamos a calcular el porcentaje a incrementar las cantidades de las lineas de movimiento para inflar / desinflar la base final

DECLARE dblBASE_INICIAL DOUBLE DEFAULT 0;
DECLARE dblBASE_FINAL DOUBLE DEFAULT 0;
DECLARE dblAUMENTO DOUBLE DEFAULT 1;


SELECT SUM(Cantidad * Preu * (100 - Descuento) / 100)
INTO dblBASE_INICIAL
FROM Movimientos
WHERE Id_Ticket = intIDTICKET;

SET dblBASE_FINAL = dblBASE_INICIAL;


#Eliminamos lineas a 0

DELETE FROM Movimientos WHERE Cantidad = 0 AND Id_Ticket = intIDTICKET;

# Vamos a ir probando incrementos paulatinos hasta que encontremos el que supera lo pedido, teniendo en cuenta el sentido del incremento

IF dblINCREMENTO < 0 THEN

  

  WHILE (dblBASE_FINAL > dblBASE_INICIAL + dblINCREMENTO) or (dblAUMENTO < 0 ) DO

  SET dblAUMENTO = dblAUMENTO - 0.01;

  SELECT SUM(IF(@cantidad:= ROUND(dblAUMENTO * Cantidad),@cantidad,1) * Preu * (100 - Descuento) / 100) 
  INTO dblBASE_FINAL
  FROM Movimientos
  WHERE Id_Ticket = intIDTICKET;

  END WHILE;

ELSE

  WHILE dblBASE_FINAL < dblBASE_INICIAL + dblINCREMENTO DO

  SET dblAUMENTO = dblAUMENTO + 0.01;

  SELECT SUM(IF(@cantidad:= ROUND(dblAUMENTO * Cantidad),@cantidad,1) * Preu * (100 - Descuento) / 100) 
   INTO dblBASE_FINAL
  FROM Movimientos
  WHERE Id_Ticket = intIDTICKET;

  END WHILE;
  
END IF;

UPDATE Movimientos
SET Cantidad = IF(@cantidad:= ROUND(dblAUMENTO * Cantidad),@cantidad,1)
WHERE Id_Ticket = intIDTICKET;

SELECT tipoiva
     , ROUND(SUM(Cantidad * Preu * (100 - Descuento) / 100),2) as Base
     , ROUND(ROUND(SUM(Cantidad * Preu * (100 - Descuento) / 100),2) * iva / 100,2) as Cuota 
FROM Movimientos M
INNER JOIN Articles A USING(Id_Article)
INNER JOIN tblIVA USING(tipoiva)
WHERE Id_Ticket = intIDTICKET
GROUP BY tipoiva;

END$$
DELIMITER ;
