DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`moving_clean`()
BEGIN
/**
 * Elimina movimientos por inactividad
 */
	DECLARE vExpeditionFk INT;
	DECLARE vBufferFromFk INT;
	DECLARE vStateOutFk INT
		DEFAULT (SELECT id FROM expeditionState WHERE `description` = 'OUT');
	DECLARE vDone BOOL;
	DECLARE vSorter CURSOR FOR
		SELECT m.expeditionFk, m.bufferFromFk
			FROM moving m
				JOIN (
					SELECT bufferFk, SUM(isActive) hasBox
						FROM photocell
						GROUP BY bufferFk
				) sub ON sub.bufferFk = m.bufferFromFk
			WHERE m.created < (util.VN_NOW() - INTERVAL (SELECT movingMaxLife FROM config) MINUTE)
				AND NOT sub.hasBox;

	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;

	DECLARE EXIT HANDLER FOR SQLEXCEPTION
	BEGIN
		ROLLBACK;
		RESIGNAL;
	END;

	OPEN vSorter;
	l: LOOP
		SET vDone = FALSE;
		FETCH vSorter INTO vExpeditionFk, vBufferFromFk;

		IF vDone THEN
			LEAVE l;
		END IF;

		START TRANSACTION;

		SELECT id
			FROM moving
			WHERE expeditionFk = vExpeditionFk
			FOR UPDATE;

		DELETE FROM moving
			WHERE expeditionFk = vExpeditionFk;

		SELECT id
			FROM expedition
			WHERE id = vExpeditionFk
				OR (bufferFk = vBufferFromFk AND `position` > 0)
			FOR UPDATE;

		UPDATE expedition
			SET bufferFk = NULL,
				`position` = NULL,
				stateFk = vStateOutFk
			WHERE id = vExpeditionFk;

		UPDATE expedition
				SET `position` = `position` - 1
			WHERE bufferFk = vBufferFromFk
				AND `position` > 0;

		COMMIT;
	END LOOP l;
	CLOSE vSorter;
END$$
DELIMITER ;