73 lines
2.1 KiB
SQL
73 lines
2.1 KiB
SQL
DELIMITER $$
|
||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`collection_assign`(vUserFk INT, OUT vCollectionFk INT)
|
||
proc:BEGIN
|
||
/* Comprueba si existen colecciones libres que se ajustan al perfil del usuario
|
||
* y le asigna la más antigua.
|
||
* Añade un registro al semillero de colecciones
|
||
*/
|
||
DECLARE vHasTooMuchCollections BOOL;
|
||
DECLARE vLockTime INT DEFAULT 15;
|
||
|
||
-- Si hay colecciones sin terminar, sale del proceso
|
||
CALL vn.collection_get(vUserFk);
|
||
|
||
SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0
|
||
INTO vHasTooMuchCollections
|
||
FROM tCollection
|
||
JOIN vn.productionConfig pc ;
|
||
|
||
DROP TEMPORARY TABLE tCollection;
|
||
|
||
IF vHasTooMuchCollections THEN
|
||
CALL util.throw('Hay colecciones pendientes');
|
||
LEAVE proc;
|
||
END IF;
|
||
|
||
IF NOT GET_LOCK('collection_assign',vLockTime) THEN
|
||
LEAVE proc;
|
||
END IF;
|
||
|
||
-- Se eliminan las colecciones sin asignar que estan obsoletas
|
||
INSERT INTO ticketTracking(stateFk, ticketFk)
|
||
SELECT s.id, tc.ticketFk
|
||
FROM vn.collection c
|
||
JOIN vn.ticketCollection tc ON tc.collectionFk = c.id
|
||
JOIN vn.state s ON s.code = 'PRINTED_AUTO'
|
||
JOIN vn.productionConfig pc
|
||
WHERE c.workerFk IS NULL
|
||
AND TIMEDIFF(util.VN_NOW(), c.created) > pc.maxNotAssignedCollectionLifeTime;
|
||
|
||
DELETE c.*
|
||
FROM vn.collection c
|
||
JOIN vn.productionConfig pc
|
||
WHERE c.workerFk IS NULL
|
||
AND TIMEDIFF(util.VN_NOW(), c.created) > pc.maxNotAssignedCollectionLifeTime;
|
||
|
||
-- Se a<>ade registro al semillero
|
||
INSERT INTO vn.collectionHotbed(userFk)
|
||
VALUES(vUserFk);
|
||
|
||
-- Comprueba si hay colecciones disponibles que se ajustan a su configuracion
|
||
SELECT MIN(c.id)
|
||
INTO vCollectionFk
|
||
FROM vn.collection c
|
||
JOIN vn.operator o
|
||
ON (o.itemPackingTypeFk = c.itemPackingTypeFk OR c.itemPackingTypeFk IS NULL)
|
||
AND o.numberOfWagons = c.wagons
|
||
AND o.trainFk = c.trainFk
|
||
AND o.warehouseFk = c.warehouseFk
|
||
AND c.workerFk IS NULL
|
||
WHERE o.workerFk = vUserFk;
|
||
|
||
IF vCollectionFk IS NULL THEN
|
||
CALL vn.collection_new(vUserFk, vCollectionFk);
|
||
END IF;
|
||
|
||
UPDATE vn.collection
|
||
SET workerFk = vUserFk
|
||
WHERE id = vCollectionFk;
|
||
|
||
DO RELEASE_LOCK('collection_assign');
|
||
END$$
|
||
DELIMITER ;
|