DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`expedition_relocate`(vExpeditionFk INT, vBufferToFk INT)
proc:BEGIN
	
	/**
	 * Asigna buffer destino nuevo para una expedición
	 * 
	 * @param vExpeditionFk Identificacion de srt.expedition
	 *
	 * @param vBufferToFk Identificador de srt.buffer
	 * 
	 */
	
	DECLARE vBufferFromFk INT;

	START TRANSACTION;

	IF (SELECT COUNT(*) FROM srt.moving WHERE expeditionFk = vExpeditionFk) THEN
	
		LEAVE proc;
	
	END IF;

	SELECT e.bufferFk INTO vBufferFromFk
		FROM srt.expedition e 
		WHERE e.id = vExpeditionFk;

	SET vBufferToFk = IFNULL(vBufferToFk, IFNULL(srt.bufferPool_get(), `srt`.`buffer_get`(vExpeditionFk)));

	IF vBufferFromFk = vBufferToFk THEN

		LEAVE proc;
	
	END IF;

	REPLACE srt.moving (expeditionFk, 
						bufferFromFk, 
						bufferToFk, 
						stateFk)
		SELECT 	e.id, 
				e.bufferFk, 
				vBufferToFk,
				ms.id 
			FROM srt.expedition e 
				JOIN srt.movingState ms ON ms.description = 'NEW'
				LEFT JOIN srt.moving m ON m.expeditionFk 
			WHERE e.id = vExpeditionFk;
	
	UPDATE srt.expedition e
		JOIN srt.expeditionState es on es.description = 'ENTERING'
		JOIN srt.moving m ON m.expeditionFk = e.id
		SET e.stateFk = es.id
		WHERE e.id = vExpeditionFk;
	
	COMMIT;

	IF srt.buffer_isFull(vBufferToFk) THEN  
	
		CALL srt.buffer_setStateType(vBufferToFk,'FULL', NULL);
	
	END IF;

END$$
DELIMITER ;