119 lines
3.1 KiB
MySQL
119 lines
3.1 KiB
MySQL
|
DELIMITER $$
|
||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_setQuantity`(
|
||
|
vItemShelvingSaleFk INT(10),
|
||
|
vQuantity DECIMAL(10,0),
|
||
|
vIsItemShelvingSaleEmpty BOOLEAN
|
||
|
)
|
||
|
BEGIN
|
||
|
/**
|
||
|
* Gestiona la reserva de un itemShelvingFk, actualizando isPicked y quantity
|
||
|
* en vn.itemShelvingSale y vn.sale.isPicked en caso necesario.
|
||
|
* Si la reserva de la ubicación es fallida, se regulariza la situación
|
||
|
*
|
||
|
* @param vItemShelvingSaleFk Id itemShelvingSaleFK
|
||
|
* @param vQuantity Cantidad real que se ha cogido de la ubicación
|
||
|
* @param vIsItemShelvingSaleEmpty determina si ka ubicación itemShelvingSale se ha
|
||
|
* quedado vacio tras el movimiento
|
||
|
*/
|
||
|
DECLARE vSaleFk INT;
|
||
|
DECLARE vCursorSaleFk INT;
|
||
|
DECLARE vItemShelvingFk INT;
|
||
|
DECLARE vReservedQuantity INT;
|
||
|
DECLARE vRemainingQuantity INT;
|
||
|
DECLARE vItemFk INT;
|
||
|
DECLARE vUserFk INT;
|
||
|
DECLARE vDone BOOLEAN DEFAULT FALSE;
|
||
|
DECLARE vSales CURSOR FOR
|
||
|
SELECT iss.saleFk, iss.userFk
|
||
|
FROM itemShelvingSale iss
|
||
|
JOIN sale s ON s.id = iss.saleFk
|
||
|
WHERE iss.id = vItemShelvingSaleFk
|
||
|
AND s.itemFk = vItemFk
|
||
|
AND NOT iss.isPicked;
|
||
|
|
||
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||
|
|
||
|
IF (SELECT isPicked FROM itemShelvingSale WHERE id = vItemShelvingSaleFk) THEN
|
||
|
CALL util.throw('Booking completed');
|
||
|
END IF;
|
||
|
|
||
|
SELECT s.itemFk, iss.saleFk, iss.itemShelvingFk
|
||
|
INTO vItemFk, vSaleFk, vItemShelvingFk
|
||
|
FROM itemShelvingSale iss
|
||
|
JOIN sale s ON s.id = iss.saleFk
|
||
|
WHERE iss.id = vItemShelvingSaleFk
|
||
|
AND NOT iss.isPicked;
|
||
|
|
||
|
UPDATE itemShelvingSale
|
||
|
SET isPicked = TRUE,
|
||
|
quantity = vQuantity
|
||
|
WHERE id = vItemShelvingSaleFk;
|
||
|
|
||
|
UPDATE itemShelving
|
||
|
SET visible = IF(vIsItemShelvingSaleEmpty, 0, GREATEST(0,visible - vQuantity))
|
||
|
WHERE id = vItemShelvingFk;
|
||
|
|
||
|
IF vIsItemShelvingSaleEmpty THEN
|
||
|
OPEN vSales;
|
||
|
l: LOOP
|
||
|
SET vDone = FALSE;
|
||
|
FETCH vSales INTO vCursorSaleFk, vUserFk;
|
||
|
IF vDone THEN
|
||
|
LEAVE l;
|
||
|
END IF;
|
||
|
|
||
|
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||
|
(INDEX(saleFk, userFk))
|
||
|
ENGINE = MEMORY
|
||
|
SELECT vCursorSaleFk, vUserFk;
|
||
|
|
||
|
CALL itemShelvingSale_reserveWhitUser();
|
||
|
DROP TEMPORARY TABLE tmp.sale;
|
||
|
|
||
|
END LOOP;
|
||
|
CLOSE vSales;
|
||
|
|
||
|
DELETE iss
|
||
|
FROM itemShelvingSale iss
|
||
|
JOIN sale s ON s.id = iss.saleFk
|
||
|
WHERE iss.id = vItemShelvingSaleFk
|
||
|
AND s.itemFk = vItemFk
|
||
|
AND NOT iss.isPicked;
|
||
|
END IF;
|
||
|
|
||
|
SELECT SUM(quantity) INTO vRemainingQuantity
|
||
|
FROM itemShelvingSale
|
||
|
WHERE saleFk = vSaleFk
|
||
|
AND NOT isPicked;
|
||
|
|
||
|
IF vRemainingQuantity THEN
|
||
|
CALL itemShelvingSale_reserveBySale (vSaleFk, vRemainingQuantity, NULL);
|
||
|
|
||
|
SELECT SUM(quantity) INTO vRemainingQuantity
|
||
|
FROM itemShelvingSale
|
||
|
WHERE saleFk = vSaleFk
|
||
|
AND NOT isPicked;
|
||
|
|
||
|
IF NOT vRemainingQuantity <=> 0 THEN
|
||
|
SELECT SUM(iss.quantity)
|
||
|
INTO vReservedQuantity
|
||
|
FROM itemShelvingSale iss
|
||
|
WHERE iss.saleFk = vSaleFk;
|
||
|
|
||
|
CALL saleTracking_new(
|
||
|
vSaleFk,
|
||
|
TRUE,
|
||
|
vReservedQuantity,
|
||
|
`account`.`myUser_getId`(),
|
||
|
NULL,
|
||
|
'PREPARED',
|
||
|
TRUE);
|
||
|
|
||
|
UPDATE sale s
|
||
|
SET s.quantity = vReservedQuantity
|
||
|
WHERE s.id = vSaleFk ;
|
||
|
END IF;
|
||
|
END IF;
|
||
|
END$$
|
||
|
DELIMITER ;
|