DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`expedition_routeOut`(vRouteFk INT, vBufferToFk INT)
BEGIN
	
	/**
	 * Selecciona y enruta las expediciones en el sorter hacia un buffer de salida, que sean de la ruta pedida
	 *
	 * @param vRouteFk Identificador de vn.route
	 * @param vBufferToFk Identificador de srt.buffer
	 * 
	 */
		
  	DECLARE vExpListFk INT;
  
  	DECLARE vExpBufFk INT;
  
	DECLARE vDone INT DEFAULT FALSE;
	  
  	DECLARE vExpList CURSOR FOR 
  		SELECT bs.expeditionFk
  			FROM srt.bufferStock bs 
  				JOIN srt.expedition e ON e.id = bs.expeditionFk
  			WHERE bs.routeFk = vRouteFk
  				AND bs.expeditionState = 'STORED'
				AND bs.isActive
				AND bs.hasWorkerWaiting = FALSE
  				ORDER BY (vBufferToFk - e.bufferFk),
  						e.`position` ;
  
  	DECLARE vExpBuf CURSOR FOR
  		SELECT e.id
  			FROM srt.expedition e 
  				JOIN srt.expedition e2 ON e2.bufferFk = e.bufferFk 
  				JOIN srt.expeditionState es ON es.id = e.stateFk 
  			WHERE e2.id = vExpListFk
  				AND e.`position` <= e2.`position` 
  				AND es.description = 'STORED'
	  		ORDER BY e.`position`;
  			
  	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
    	
 	OPEN vExpList;
 
 	FETCH vExpList INTO vExpListFk;
 
 	WHILE NOT vDone DO
  	
  		OPEN vExpBuf;
  	
  		FETCH vExpBuf INTO vExpBufFk;
  	
  		WHILE NOT vDone DO
  		
  			IF vExpBufFk = vExpListFk THEN
  			
  				CALL srt.expedition_relocate(vExpListFk, vBufferToFk);
  			
  				SET vDone = TRUE;
  			
  			ELSE
  			
  				CALL srt.expedition_relocate(vExpBufFk, NULL);
  			
  				SET vDone = FALSE; 
  		
  				FETCH vExpBuf INTO vExpBufFk;
  			
  			END IF;
  		
  		END WHILE;
    
  		CLOSE vExpBuf;
  	
  		SET vDone = FALSE; 
   
  		FETCH vExpList INTO vExpListFk;
  		
  	END WHILE;

	CLOSE vExpList;

END$$
DELIMITER ;