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