DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(vOriginalEntry INT, OUT vNewEntry INT)
BEGIN
/**
* Adelanta a mañana la mercancia de una entrada a partir de lo que hay ubicado en el almacén
* 
* @param vOriginalEntry entrada que se quiera adelantar
*/

	DECLARE vNewEntryFk INT;
	DECLARE vTravelFk INT;
	DECLARE vWarehouseFk INT;

	DECLARE EXIT HANDLER FOR SQLEXCEPTION
	BEGIN
		ROLLBACK;
		RESIGNAL;
	END;
	
	START TRANSACTION;
	-- Clonar la entrada
	CALL entry_clone(vOriginalEntry,vNewEntryFk);

	-- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel.
	INSERT INTO travel(
				shipped,
				landed,
				warehouseInFk,
				warehouseOutFk,
				`ref`,
				isReceived,
				agencyModeFk)
			SELECT util.VN_CURDATE(),
					util.VN_CURDATE() + INTERVAL 1 DAY,
					t.warehouseInFk,
					t.warehouseInFk,
					t.`ref`,
					t.isReceived,
					t.agencyModeFk
				FROM travel t
					JOIN entry e ON e.travelFk = t.id
				WHERE e.id  = vOriginalEntry;

	SET vTravelFk = LAST_INSERT_ID();

	UPDATE entry
		SET travelFk = vTravelFk
		WHERE id = vNewEntryFk;

	-- Poner a 0 las cantidades
	UPDATE buy b
		SET b.quantity = 0, b.stickers = 0
		WHERE b.entryFk = vNewEntryFk;

	-- Eliminar duplicados
	DELETE b.*
		FROM buy b
			LEFT JOIN (SELECT b.id, b.itemFk 
							FROM buy b 
							WHERE b.entryFk = vNewEntryFk
							GROUP BY b.itemFk) tBuy ON tBuy.id = b.id
		WHERE b.entryFk = vNewEntryFk
			AND tBuy.id IS NULL;
	
	SELECT t.warehouseInFk INTO vWarehouseFk
		FROM travel t
			JOIN entry e ON e.travelFk = t.id
		WHERE e.id = vOriginalEntry;

	-- Actualizar la nueva entrada con lo que no está ubicado HOY, descontando lo vendido HOY de esas ubicaciones
	UPDATE buy b
		JOIN (
			SELECT tBuy.itemFk, IFNULL(iss.visible,0) visible, tBuy.totalQuantity, IFNULL(sales.sold,0) sold
				FROM (SELECT b.itemFk, SUM(b.quantity) totalQuantity
							FROM buy b
							WHERE b.entryFk = vOriginalEntry
							GROUP BY b.itemFk
						) tBuy 
					LEFT JOIN (
						SELECT ish.itemFk, SUM(visible) visible
							FROM itemShelving ish
								JOIN shelving sh ON sh.code = ish.shelvingFk
								JOIN parking p ON p.id = sh.parkingFk
								JOIN sector s ON s.id = p.sectorFk
							WHERE s.warehouseFk = vWarehouseFk
								AND sh.parked = util.VN_CURDATE()
							GROUP BY ish.itemFk) iss ON tBuy.itemFk = iss.itemFk
					LEFT JOIN (
						SELECT s.itemFk, SUM(s.quantity) sold
							FROM ticket t
								JOIN sale s ON s.ticketFk = t.id
								JOIN itemShelvingSale iss ON iss.saleFk = s.id
								JOIN itemShelving is2 ON is2.id = iss.itemShelvingFk
								JOIN shelving s2 ON s2.code = is2.shelvingFk
							WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE())
								AND s2.parked = util.VN_CURDATE()
							GROUP BY s.itemFk) sales ON sales.itemFk = tBuy.itemFk
				WHERE visible = tBuy.totalQuantity 
					OR iss.itemFk IS NULL
			) sub ON sub.itemFk = b.itemFk
		SET b.quantity = sub.totalQuantity - sub.visible - sub.sold
		WHERE b.entryFk = vNewEntryFk;
	
	-- Limpia la nueva entrada
	DELETE b.*
		FROM buy b
		WHERE b.entryFk = vNewEntryFk
			AND b.quantity = 0;

	SET vNewEntry = vNewEntryFk;

	CALL cache.visible_refresh(@c,TRUE,7);
	CALL cache.available_refresh(@c, TRUE, 7, util.VN_CURDATE());
	COMMIT;
END$$
DELIMITER ;
