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

85 lines
1.9 KiB
MySQL
Raw Normal View History

DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyLot_sync`(vSelf INT)
BEGIN
/**
2025-02-18 14:58:38 +00:00
* Associates a lot with their possible buyOuts, updating it's available.
*
2025-02-18 14:58:38 +00:00
* @param vSelf The lot id
*/
DECLARE vDated DATETIME;
DECLARE vExpired DATETIME;
DECLARE vItem INT;
DECLARE vWarehouse INT;
DECLARE vQuantity INT;
DECLARE vAvailable INT;
DECLARE vSupplied INT;
DECLARE vSuppliedFromRequest INT;
2025-02-18 14:58:38 +00:00
DECLARE vOutFk INT;
DECLARE vLack INT;
DECLARE vHasPicks BOOL;
DECLARE vDone BOOL;
2025-02-18 14:58:38 +00:00
DECLARE vOuts CURSOR FOR
2025-02-18 18:34:38 +00:00
SELECT outFk, lack, lack < quantity
FROM buyOut
WHERE warehouseFk = vWarehouse
AND itemFk = vItem
AND dated >= vDated
AND (vExpired IS NULL OR dated < vExpired)
ORDER BY dated, created, outFk;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SELECT warehouseFk, itemFk, available, quantity, expired, dated
INTO vWarehouse, vItem, vAvailable, vQuantity, vExpired, vDated
2025-02-18 14:58:38 +00:00
FROM buyLot
WHERE buyFk = vSelf;
IF vAvailable IS NULL THEN
SET vAvailable = vQuantity;
END IF;
2025-02-18 14:58:38 +00:00
OPEN vOuts;
myLoop: LOOP
SET vDone = FALSE;
2025-02-18 14:58:38 +00:00
FETCH vOuts INTO vOutFk, vLack, vHasPicks;
IF vDone THEN
LEAVE myLoop;
END IF;
SET vSupplied = LEAST(vAvailable, vLack);
IF vSupplied > 0 THEN
SET vAvailable = vAvailable - vSupplied;
UPDATE buyOut
SET lack = lack - vSupplied
2025-02-18 18:34:38 +00:00
WHERE outFk = vOutFk;
END IF;
IF vHasPicks AND vAvailable > 0 THEN
CALL buyOut_requestQuantity(vOutFk, vAvailable, vDated, vSelf, vSuppliedFromRequest);
SET vSupplied = vSupplied + vSuppliedFromRequest;
SET vAvailable = vAvailable - vSuppliedFromRequest;
END IF;
IF vSupplied > 0 THEN
2025-02-18 14:58:38 +00:00
CALL buyLot_addPick(vSelf, vOutFk, vSupplied);
END IF;
IF vAvailable <= 0 THEN
LEAVE myLoop;
END IF;
END LOOP;
2025-02-18 14:58:38 +00:00
CLOSE vOuts;
2025-02-18 14:58:38 +00:00
UPDATE buyLot
SET isSync = TRUE,
available = vAvailable
2025-02-18 14:58:38 +00:00
WHERE buyFk = vSelf;
END$$
DELIMITER ;