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 ;