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

123 lines
2.4 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyLot_refresh`(
`vTable` ENUM('buy', 'entry', 'travel'),
`vId` INT)
BEGIN
START TRANSACTION;
-- Update cache
CREATE OR REPLACE TEMPORARY TABLE tLotOld
ENGINE = MEMORY
SELECT lotFk
FROM buyLot
WHERE
(vTable = 'buy' AND lotFk = vId)
OR (vTable = 'entry' AND entryFk = vId)
OR (vTable = 'travel' AND travelFk = vId);
CREATE OR REPLACE TEMPORARY TABLE tLotNew
ENGINE = MEMORY
SELECT
t.id travelFk,
t.landed,
t.landingHour,
t.warehouseInFk,
t.isReceived,
t.isRaid,
e.id entryFk,
b.lotFk,
b.itemFk,
b.life,
b.quantity
FROM vn.buy b
JOIN vn.entry e ON e.id = b.entryFk
JOIN vn.travel t ON t.id = e.travelFk
JOIN vn.item i ON i.id = b.itemFk
WHERE b.quantity > 0
AND b.isAlive
AND (
(vTable = 'buy' AND b.lotFk = vId)
OR (vTable = 'entry' AND e.id = vId)
OR (vTable = 'travel' AND t.id = vId)
);
DELETE FROM buyLot
WHERE lotFk IN (
SELECT lotFk FROM tLotOld
EXCEPT
SELECT lotFk FROM tLotNew
);
INSERT INTO buyLot (
lotFk,
entryFk,
travelFk,
isSync,
isPicked,
warehouseFk,
itemFk,
dated,
expired,
quantity,
available
)
SELECT
lotFk,
entryFk,
travelFk,
FALSE,
isReceived,
warehouseInFk,
itemFk,
@dated := ADDTIME(landed, IFNULL(landingHour, '00:00:00')),
@dated + INTERVAL life DAY,
quantity,
NULL
FROM tLotNew
ON DUPLICATE KEY UPDATE
entryFk = VALUES(entryFk),
travelFk = VALUES(travelFk),
isSync = VALUES(isSync),
isPicked = VALUES(isPicked),
warehouseFk = VALUES(warehouseFk),
itemFk = VALUES(itemFk),
dated = VALUES(dated),
expired = VALUES(expired),
quantity = VALUES(quantity),
available = VALUES(available);
-- Remove picks from updated and removed lots
CREATE OR REPLACE TEMPORARY TABLE tLotPrune
ENGINE = MEMORY
SELECT lotFk FROM tLotNew
UNION
SELECT o.lotFk FROM tLotOld o
LEFT JOIN vn.buy b ON b.id = o.lotFk
WHERE b.lotFk IS NULL;
UPDATE buyOut o
JOIN buyPick p
ON p.outFk = o.outFk
JOIN tLotPrune pl
ON pl.lotFk = p.lotFk
SET o.isSync = FALSE,
o.lack = o.lack + p.quantity;
DELETE p FROM buyPick p
JOIN tLotPrune pl USING(lotFk);
DROP TEMPORARY TABLE
tLotOld,
tLotNew,
tLotPrune;
COMMIT;
-- Refresh outs
CALL buyOut_refreshBuy(vTable, vId);
END$$
DELIMITER ;