salix/db/routines/stock/procedures/buyLot_requestQuantity.sql

62 lines
1.4 KiB
MySQL
Raw Normal View History

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`buyLot_requestQuantity`(
vSelf INT,
vRequested INT,
vDated DATETIME,
OUT vSupplied INT)
BEGIN
/**
* Disassociates lot picks after the given date until the demanded quantity is
* satisfied.
*
* @param vSelf The buyLot reference
* @param vRequested The requested quantity
* @param vDate The starting date for the associated buyOuts
* @param vSupplied The supplied quantity
*/
DECLARE vBuyOutFk INT;
DECLARE vPickQuantity INT;
DECLARE vPickGranted INT;
DECLARE vDone BOOL;
DECLARE vPicks CURSOR FOR
SELECT p.buyOutFk, p.quantity
FROM buyLot p
JOIN buyOut o ON o.id = p.buyOutFk
WHERE p.buyLotFk = vSelf
AND o.dated > vDated
ORDER BY o.dated DESC, o.created DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SET vSupplied = 0;
OPEN vPicks;
myLoop: LOOP
SET vDone = FALSE;
FETCH vPicks INTO vBuyOutFk, vPickQuantity;
IF vDone THEN
LEAVE myLoop;
END IF;
SET vPickGranted = LEAST(vRequested - vSupplied, vPickQuantity);
SET vSupplied = vSupplied + vPickGranted;
CALL buyLot_removePick(vSelf, vBuyOutFk, vPickGranted, vPickQuantity);
UPDATE buyOut
SET isSync = FALSE,
lack = lack + vPickGranted
WHERE id = vBuyOutFk;
IF vSupplied >= vRequested THEN
LEAVE myLoop;
END IF;
END LOOP;
CLOSE vPicks;
END$$
DELIMITER ;