DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`inbound_sync`(vSelf INT) BEGIN /** * Associates a inbound with their possible outbounds, updating it's available. * * @param vSelf The inbound identifier */ DECLARE vDated DATETIME; DECLARE vExpired DATETIME; DECLARE vItem INT; DECLARE vWarehouse INT; DECLARE vQuantity INT; DECLARE vAvailable INT; DECLARE vSupplied INT; DECLARE vSuppliedFromRequest INT; DECLARE vOutboundFk INT; DECLARE vLack INT; DECLARE vHasPicks BOOL; DECLARE vDone BOOL; DECLARE vOutbounds CURSOR FOR SELECT id, lack, lack < quantity FROM outbound WHERE warehouseFk = vWarehouse AND itemFk = vItem AND dated >= vDated AND (vExpired IS NULL OR dated < vExpired) ORDER BY dated, created; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; SELECT warehouseFk, itemFk, available, quantity, expired, dated INTO vWarehouse, vItem, vAvailable, vQuantity, vExpired, vDated FROM inbound WHERE id = vSelf; IF vAvailable IS NULL THEN SET vAvailable = vQuantity; END IF; OPEN vOutbounds; myLoop: LOOP SET vDone = FALSE; FETCH vOutbounds INTO vOutboundFk, vLack, vHasPicks; IF vDone THEN LEAVE myLoop; END IF; SET vSupplied = LEAST(vAvailable, vLack); IF vSupplied > 0 THEN SET vAvailable = vAvailable - vSupplied; UPDATE outbound SET lack = lack - vSupplied WHERE id = vOutboundFk; END IF; IF vHasPicks AND vAvailable > 0 THEN CALL outbound_requestQuantity(vOutboundFk, vAvailable, vDated, vSuppliedFromRequest); SET vSupplied = vSupplied + vSuppliedFromRequest; SET vAvailable = vAvailable - vSuppliedFromRequest; END IF; IF vSupplied > 0 THEN CALL inbound_addPick(vSelf, vOutboundFk, vSupplied); END IF; IF vAvailable <= 0 THEN LEAVE myLoop; END IF; END LOOP; CLOSE vOutbounds; UPDATE inbound SET isSync = TRUE, available = vAvailable WHERE id = vSelf; END$$ DELIMITER ;