DELIMITER $$
CREATE OR REPLACE DEFINER=`vn-admin`@`localhost` PROCEDURE `vn`.`entry_getTransfer`(
	vSelf INT
)
BEGIN
/**
 * Retorna los artículos trasladables a partir de una entrada.
 * 
 * @param vSelf Id de entrada
 */
	DECLARE vDateShipped DATE;
	DECLARE vDateLanded DATE;
	DECLARE vWarehouseIn INT;
	DECLARE vWarehouseOut INT;
	DECLARE vCalcVisible INT;
	DECLARE vInventoryDate DATE DEFAULT getInventoryDate();

	SELECT shipped, landed, warehouseInFk, warehouseOutFk
			INTO vDateShipped, vDateLanded, vWarehouseIn, vWarehouseOut
		FROM travel t
			JOIN entry e ON e.travelFk = t.id
		WHERE e.id = vSelf;

	CALL rate_getPrices(vDateShipped, vWarehouseIn);

	-- Traslado en almacen origen
	CREATE OR REPLACE TEMPORARY TABLE tBuy
		(PRIMARY KEY (itemFk), INDEX(buyFk))
		ENGINE = MEMORY
		SELECT *
			FROM (
				SELECT b.itemFk, b.id buyFk
					FROM buy b
						JOIN entry e ON e.id = b.entryFk
						JOIN travel t ON t.id = e.travelFk
					WHERE t.landed BETWEEN vInventoryDate AND vDateShipped
						AND NOT b.isIgnored
						AND b.price2 >= 0
					ORDER BY (vWarehouseOut = t.warehouseInFk) DESC, t.landed DESC
					LIMIT 10000000000000000000
			) sub
			GROUP BY itemFk;

	IF vDateShipped >= util.VN_CURDATE() THEN
		CALL `cache`.visible_refresh(vCalcVisible, TRUE, vWarehouseOut);

		CREATE OR REPLACE TEMPORARY TABLE tItem (
			`itemFk` int(10) unsigned NOT NULL,
			`visible` int(11) NOT NULL DEFAULT 0,
			`available` int(11) NOT NULL DEFAULT 0,
			`visibleLanding` int(11) NOT NULL DEFAULT 0,
			`availableLanding` int(11) NOT NULL DEFAULT 0,
		UNIQUE INDEX i USING HASH (itemFk)
		) ENGINE = MEMORY;

		INSERT INTO tItem(itemFk, visible)
			SELECT item_id itemFk, visible
				FROM `cache`.visible
				WHERE calc_id = vCalcVisible
					AND visible;

		CALL `cache`.visible_refresh(vCalcVisible, TRUE, vWarehouseIn);

		INSERT INTO tItem(itemFk, visibleLanding)
			SELECT item_id, `visible`
				FROM `cache`.`visible` v
				WHERE v.calc_id = vCalcVisible
					AND v.`visible`
			ON DUPLICATE KEY UPDATE visibleLanding = v.`visible`;

		CALL available_traslate(vWarehouseOut, vDateShipped, NULL);

		INSERT INTO tItem(itemFk, available)
			SELECT a.item_id, a.available
				FROM tmp.availableTraslate a
				WHERE a.available
			ON DUPLICATE KEY UPDATE available = a.available;

		CALL available_traslate(vWarehouseIn, vDateLanded, vWarehouseOut);

		INSERT INTO tItem(itemFk, availableLanding)
			SELECT a.item_id, a.available
				FROM tmp.availableTraslate a
				WHERE a.available
			ON DUPLICATE KEY UPDATE availableLanding = a.available;
	ELSE
		CALL item_getStock(vWarehouseOut, vDateShipped, NULL);

		CREATE OR REPLACE TEMPORARY TABLE tItem
			(UNIQUE INDEX i USING HASH (itemFk))
			ENGINE = MEMORY
			SELECT itemFk,
					`visible`,
					available,
					0 visibleLanding,
					0 availableLanding
				FROM tmp.itemList;
	END IF;

	CALL buyUltimateFromInterval(vWarehouseIn,vInventoryDate, vDateLanded);

	CREATE OR REPLACE TEMPORARY TABLE tTransfer
		ENGINE = MEMORY
		SELECT it.code `type`,
				it.categoryFk,
				i.typeFk,
				i.id itemFk,
				i.name item,
				i.`size`,
				i.category,
				i.inkFk,
				o.code originCode,
				b2.quantity,
				i.stems,
				CAST(ti.visible AS DECIMAL(10,0)) vis1,
				CAST(ti.available AS DECIMAL(10,0)) ava1,
				CAST(ti.visibleLanding AS DECIMAL(10,0)) vis2,
				CAST(ti.availableLanding AS DECIMAL(10,0)) ava2,
				COALESCE(b2.`grouping`, b.`grouping`) `grouping`,
				COALESCE(b2.packing, b.packing) packing,
				COALESCE(b3.groupingMode, b2.groupingMode, b.groupingMode) package,
				IFNULL(p.name, s.nickname) productor,
				TRUE tinta,
				b.packagingFk,
				b2.id buyFk,
				b2.stickers,
				b.ektFk,
				it.workerFk,
				pa.volume,
				IFNULL(pa.width, 0) width,
				IFNULL(pa.`depth`, 0) `depth`,
				IFNULL(pa.height, 0) height,
				IFNULL(b.buyingValue, 0) buyingValue,
				IFNULL(b.comissionValue, 0) comissionValue,
				IFNULL(b.freightValue, 0) freightValue,
				am.m3,
				e.commission,
				pa.isPackageReturnable,
				IFNULL(pa2.value, pa.value) `value`,
				r.rate3 r3,
				r.rate2 r2,
				it.promo,
				b.`grouping` groupingOrigin,
				b.packing packingOrigin,
				b.id buyFkOrigin,
				pa.returnCost,
				b.weight
			FROM item i
				JOIN tItem ti ON ti.itemFk = i.id
				LEFT JOIN producer p ON p.id = i.producerFk
				LEFT JOIN itemType it ON it.id = i.typeFk
				JOIN itemCategory ic ON ic.id = it.categoryFk
				LEFT JOIN origin o ON o.id = i.originFk
				LEFT JOIN tBuy lb ON lb.itemFk = i.id
				LEFT JOIN buy b ON b.id = lb.buyFk
				LEFT JOIN packaging pa ON pa.id = b.packagingFk
				LEFT JOIN entry e2 ON e2.id = b.entryFk
				LEFT JOIN supplier s ON s.id = e2.supplierFk
				LEFT JOIN entry e ON e.id = vSelf
				LEFT JOIN travel tr ON tr.id = e.travelFk
				LEFT JOIN agencyMode am ON am.id = tr.agencyModeFk
				LEFT JOIN buy b2 ON b2.itemFk = i.id
					AND b2.entryFk = vSelf
				LEFT JOIN packaging pa2 ON pa2.id = b.packagingFk
				LEFT JOIN tmp.rate r ON TRUE
				LEFT JOIN tmp.buyUltimateFromInterval bufi ON bufi.itemFk = i.id
				LEFT JOIN buy b3 ON b3.id = bufi.buyFk
		WHERE ic.display
			AND NOT e.isRaid
			AND (ti.visible OR ti.available)
			ORDER BY i.typeFk, i.name, i.id, i.size, i.category, o.name;

	CREATE INDEX tIndex USING HASH ON tTransfer (itemFk);

	SELECT *,
			quantity - MOD(quantity , `grouping`) subQuantity,
			MOD(quantity, `grouping`) soll,
			ROUND((IF(volume > 0,volume, width * `depth` *
				IF(height = 0, `size` + 10, height))) /
				packing, 0) cm3,
			buyingValue + comissionValue + freightValue cost,
			@carriage := ROUND((IF(volume > 0, volume, width * `depth` *
				IF(height = 0, `size` + 10, height))) *
				m3 / 1000000 / Packing, 3) carriage,
			@comission := ROUND((buyingValue + comissionValue + freightValue) *
				commission / 100, 3) commission,
			ROUND(@packaging := (returnCost + IF(isPackageReturnable, 0, value))
				/ packing, 3) packaging,
			@cost := IFNULL((buyingValue + comissionValue + freightValue), 0) +
				IFNULL(@packaging, 0) +
				IFNULL(@carriage, 0) +
				IFNULL(@comission, 0) expense,
			@rate3 := ROUND(@cost / ( (100 - r3 - promo) / 100), 2) rate3,
			ROUND(@rate3 * (1 + ((r2 - r3)/100)), 2) rate2,
			FALSE selected
		FROM tTransfer;

	DROP TEMPORARY TABLE IF EXISTS
		tTransfer,
		tItem,
		tBuy,
		tmp.buyUltimateFromInterval,
		tmp.rate,
		tmp.itemList;
END$$
DELIMITER ;
