85 lines
1.9 KiB
MySQL
85 lines
1.9 KiB
MySQL
|
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 ;
|