DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`travelVolume`(vTravelFk INT)
BEGIN
	
	SELECT 	w1.name AS ORI, 
			w2.name AS DES, 
			tr.shipped shipment,
			tr.landed landing,
			a.name Agencia, 
			s.name Proveedor,
			e.id Id_Entrada,
			e.invoiceNumber Referencia,
			CAST(ROUND(SUM(GREATEST(b.stickers ,b.quantity /b.packing ) *
			 vn.item_getVolume(b.itemFk ,b.packagingFk)) / vc.trolleyM3 / 1000000 ,1) AS DECIMAL(10,2)) AS CC,
			CAST(ROUND(SUM(GREATEST(b.stickers ,b.quantity /b.packing ) *
			 vn.item_getVolume(b.itemFk ,b.packagingFk)) / vc.palletM3 / 1000000,1) AS DECIMAL(10,2)) AS espais
	FROM vn.buy b 
		JOIN vn.entry e ON e.id = b.entryFk 
		JOIN vn.supplier s ON s.id = e.supplierFk 
		JOIN vn.travel tr ON tr.id = e.travelFk 
		JOIN vn.agencyMode a ON a.id = tr.agencyModeFk
		JOIN vn.warehouse w1 ON w1.id = tr.warehouseInFk 
		JOIN vn.warehouse w2 ON w2.id = tr.warehouseOutFk 
		JOIN vn.volumeConfig vc 
		JOIN vn.item i ON i.id = b.itemFk 
		JOIN vn.itemType it ON it.id = i.typeFk
		WHERE tr.id = vTravelFk;
	
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`travelVolume_get`(vFromDated DATE, vToDated DATE, vWarehouseFk INT)
BEGIN
	SELECT 	tr.landed Fecha,
			a.name Agencia,
			count(DISTINCT e.id) numEntradas,
			FLOOR(sum(item_getVolume(b.itemFk, b.packagingFk) * b.stickers / 1000000 )) AS m3
		FROM vn.travel tr
			JOIN vn.agencyMode a ON a.id = tr.agencyModeFk
			JOIN vn.entry e ON e.travelFk = tr.id
			JOIN vn.buy b ON b.entryFk = e.id
		WHERE tr.landed BETWEEN vFromDated AND vToDated
			AND e.isRaid = FALSE
			AND tr.warehouseInFk = vWarehouseFk
		GROUP BY tr.landed , a.name ;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`travel_getEntriesMissingPackage`(vSelf INT)
BEGIN
	DECLARE vpackageOrPackingNull INT;
	DECLARE vTravelFk INT;

	SELECT travelfk INTO vTravelFk
		FROM entry
		WHERE id = vSelf;

	SELECT e.id entryFk
		FROM travel t 
			JOIN entry e ON e.travelFk = t.id 
			JOIN buy b ON b.entryFk = e.id 
		WHERE t.id = vTravelFk 
			AND (b.packing IS NULL OR b.packagingFk IS NULL);
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticketBoxesView`(IN vTicketFk INT)
BEGIN
  	
	SELECT  s.id, 
			s.itemFk, 
            s.concept, 
            floor(s.quantity / b.packing) as Cajas, 
            b.packing, 
            s.isPicked, 
            i.size
		FROM ticket t 
			JOIN sale s ON s.ticketFk = t.id
			JOIN item i ON i.id = s.itemFk
			JOIN cache.last_buy lb on lb.warehouse_id = t.warehouseFk AND lb.item_id = s.itemFk
			JOIN buy b on b.id = lb.buy_id
			JOIN packaging p on p.id = b.packagingFk
		WHERE s.quantity >= b.packing
			AND t.id = vTicketFk
			AND p.isBox
				GROUP BY s.itemFk;

    
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`stockBuyedByWorker`(
	vDated DATE,
	vWorker INT
)
BEGIN
/**
 * Inserta el volumen de compra de un comprador
 * en stockBuyed de acuerdo con la fecha.
 *
 * @param vDated Fecha de compra
 * @param vWorker Id de trabajador
 */
	CREATE OR REPLACE TEMPORARY TABLE tStockBuyed
		(INDEX (userFk))
		ENGINE = MEMORY
		SELECT requested, reserved, userFk
			FROM stockBuyed
			WHERE dated = vDated
				AND userFk = vWorker;

	DELETE FROM stockBuyed
		WHERE dated = vDated
			AND userFk = vWorker;

	CALL stockTraslation(vDated);

	INSERT INTO stockBuyed(userFk, buyed, `dated`, reserved, requested, description)
		SELECT it.workerFk,
				SUM((ti.quantity / b.packing) * buy_getVolume(b.id)) / vc.palletM3 / 1000000,
				vDated,
				sb.reserved,
				sb.requested,
				u.name
			FROM itemType it
				JOIN item i ON i.typeFk = it.id
				LEFT JOIN tmp.item ti ON ti.itemFk = i.id
				JOIN itemCategory ic ON ic.id = it.categoryFk
				JOIN warehouse wh ON wh.code = 'VNH'
				JOIN tmp.buyUltimate bu ON bu.itemFk = i.id
					AND bu.warehouseFk = wh.id
				JOIN buy b ON b.id = bu.buyFk
				JOIN volumeConfig vc
				JOIN account.`user` u ON u.id = it.workerFk
				LEFT JOIN tStockBuyed sb ON sb.userFk = it.workerFk
			WHERE ic.display
				AND it.workerFk = vWorker;

	SELECT b.entryFk Id_Entrada,
			i.id Id_Article,
			i.name Article,
			ti.quantity Cantidad,
			(ac.conversionCoefficient * (ti.quantity / b.packing) * buy_getVolume(b.id))
				/ (vc.trolleyM3 * 1000000) buyed,
			b.packagingFk id_cubo,
			b.packing
		FROM tmp.item ti
			JOIN item i ON i.id = ti.itemFk
			JOIN itemType it ON i.typeFk = it.id
			JOIN itemCategory ic ON ic.id = it.categoryFk
			JOIN worker w ON w.id = it.workerFk
			JOIN auctionConfig ac
			JOIN tmp.buyUltimate bu ON bu.itemFk = i.id
				AND bu.warehouseFk = ac.warehouseFk
			JOIN buy b ON b.id = bu.buyFk
			JOIN volumeConfig vc
		WHERE ic.display
			AND w.id = vWorker;

	DROP TEMPORARY TABLE tmp.buyUltimate,
		tmp.item,
		tStockBuyed;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingMakeFromDate`(IN `vShelvingFk` VARCHAR(8), IN `vBarcode` VARCHAR(22), IN `vQuantity` INT, IN `vPackagingFk` VARCHAR(10), IN `vGrouping` INT, IN `vPacking` INT, IN `vWarehouseFk` INT, `vCreated` VARCHAR(22))
BEGIN
	
    DECLARE vItemFk INT;

    SELECT vn.barcodeToItem(vBarcode) INTO vItemFk;

    SELECT itemFk INTO vItemFk
        FROM vn.buy b
        WHERE b.id = vItemFk;

    IF (SELECT COUNT(*) FROM vn.shelving WHERE code = vShelvingFk COLLATE utf8_unicode_ci) = 0 THEN

        INSERT IGNORE INTO vn.parking(`code`) VALUES(vShelvingFk);
        INSERT INTO vn.shelving(`code`, parkingFk)
            SELECT vShelvingFk, id
                FROM vn.parking
                WHERE `code` = vShelvingFk COLLATE utf8_unicode_ci;

    END IF;

    IF (SELECT COUNT(*) FROM vn.itemShelving 
            WHERE shelvingFk COLLATE utf8_unicode_ci  = vShelvingFk 
                AND itemFk  = vItemFk 
                AND packing  = vPacking) = 1 THEN

        UPDATE vn.itemShelving
            SET visible = visible+vQuantity,
                created = vCreated
            WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk
                AND itemFk = vItemFk
                AND packing = vPacking;

    ELSE
        CALL cache.last_buy_refresh(FALSE);
        INSERT INTO itemShelving(     itemFk,
                                    shelvingFk,
                                    visible,
                                    created,
                                    `grouping`,
                                    packing,
                                    packagingFk)
            SELECT     vItemFk,
                    vShelvingFk,
                    vQuantity,
                    vCreated,
                    IF(vGrouping = 0, IFNULL(b.packing, vPacking), vGrouping) `grouping`,
                    IF(vPacking = 0, b.packing, vPacking) packing,
                    IF(vPackagingFk = '', b.packagingFk, vPackagingFk) packaging
            FROM vn.item i
                LEFT JOIN cache.last_buy lb ON i.id = lb.item_id AND lb.warehouse_id = vWarehouseFk
                LEFT JOIN vn.buy b ON b.id = lb.buy_id
            WHERE i.id = vItemFk;
    END IF;      
			
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelving_add`(IN vShelvingFk VARCHAR(8), IN vBarcode VARCHAR(22), IN vQuantity INT, IN vPackagingFk VARCHAR(10), IN vGrouping INT, IN vPacking INT, IN vWarehouseFk INT)
BEGIN
	

/**
 * Añade registro o lo actualiza si ya existe.
 *
 * @param vShelvingFk matrícula del carro
 * @param vBarcode el id del registro
 * @param vQuantity indica la cantidad del producto
 * @param vPackagingFk el packaging del producto en itemShelving, NULL para coger el de la ultima compra
 * @param vGrouping el grouping del producto en itemShelving, NULL para coger el de la ultima compra
 * @param vPacking el packing del producto, NULL para coger el de la ultima compra
 * @param vWarehouseFk indica el sector
 * 
 **/

	DECLARE vItemFk INT;

	SELECT barcodeToItem(vBarcode) INTO vItemFk;

	IF (SELECT COUNT(*) FROM shelving WHERE code = vShelvingFk COLLATE utf8_unicode_ci) = 0 THEN

		INSERT IGNORE INTO parking(code) VALUES(vShelvingFk);
		INSERT INTO shelving(code, parkingFk) 
			SELECT vShelvingFk, id
				FROM parking 
				WHERE `code` = vShelvingFk COLLATE utf8_unicode_ci;

	END IF;

	IF (SELECT COUNT(*) FROM itemShelving 
			WHERE shelvingFk COLLATE utf8_unicode_ci  = vShelvingFk 
				AND itemFk  = vItemFk 
				AND packing  = vPacking) = 1 THEN

		UPDATE itemShelving
			SET visible = visible+vQuantity
			WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk AND itemFk = vItemFk AND packing = vPacking; 

	ELSE
		CALL cache.last_buy_refresh(FALSE);
		INSERT INTO itemShelving(   itemFk,
                                    shelvingFk,
                                    visible,
                                    grouping,
                                    packing,
                                    packagingFk)

		SELECT  vItemFk,
                vShelvingFk,
                vQuantity,
                IFNULL(vGrouping, b.grouping),
                IFNULL(vPacking, b.packing),
                IFNULL(vPackagingFk, b.packagingFk)
            FROM item i
				LEFT JOIN cache.last_buy lb ON i.id = lb.item_id AND lb.warehouse_id = vWarehouseFk
				LEFT JOIN buy b ON b.id = lb.buy_id
			WHERE i.id = vItemFk;
	END IF;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemFreight_Show`(vItemFk INT, vWarehouseFk INT)
BEGIN
	
	SELECT 	cm3 Volumen_Entrada, 
			cm3delivery Volumen_Salida,
			p.volume Volumen_del_embalaje,
			p.width Ancho_del_embalaje,
			p.`depth` Largo_del_embalaje,
			b.packagingFk ,
			IFNULL(p.height, i.`size`) + 10 Altura,
			b.packing Packing_Entrada,
			i.packingOut Packing_Salida,
			i.id itemFk,
			b.id buyFk,
			b.entryFk,
			w.name warehouseFk
		FROM vn.itemCost ic 
			JOIN vn.item i ON i.id = ic.itemFk 
			LEFT JOIN cache.last_buy lb ON lb.item_id = ic.itemFk AND lb.warehouse_id = ic.warehouseFk 
			LEFT JOIN vn.buy b ON b.id = lb.buy_id 
			LEFT JOIN vn.packaging p ON p.id = b.packagingFk 
			LEFT JOIN vn.warehouse w ON w.id = ic.warehouseFk
		WHERE ic.itemFk = vItemFk
			AND ic.warehouseFk = vWarehouseFk;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`inventoryMake`(vDate DATE, vWh INT)
proc: BEGIN
/**
* Recalcula los inventarios de todos los almacenes, si vWh = 0
*
* @param vDate Fecha de los nuevos inventarios
* @param vWh almacen al cual hacer el inventario
*/

	DECLARE vDone BOOL;
	DECLARE vEntryFk INT;
	DECLARE vTravelFk INT;
	DECLARE vDateLastInventory DATE;
	DECLARE vDateYesterday DATETIME DEFAULT vDate - INTERVAL 1 SECOND;
	DECLARE vWarehouseOutFkInventory INT;
	DECLARE vInventorySupplierFk INT;
	DECLARE vAgencyModeFkInventory INT;

	DECLARE cWarehouses CURSOR FOR
		SELECT id
			FROM warehouse
			WHERE isInventory
				AND vWh IN (0,id);

	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;

	OPEN cWarehouses;
	SET @isModeInventory := TRUE;
	l: LOOP

		SET vDone = FALSE;
		FETCH cWarehouses INTO vWh;

		IF vDone THEN
			LEAVE l;
		END IF;

		SELECT w.id INTO vWarehouseOutFkInventory
			FROM warehouse w
			WHERE w.code = 'inv';

		SELECT inventorySupplierFk	INTO vInventorySupplierFk
			FROM entryConfig;
		
		SELECT am.id INTO vAgencyModeFkInventory
				FROM agencyMode am
					where code = 'inv';

		SELECT MAX(landed) INTO vDateLastInventory
			FROM travel tr
				JOIN entry e ON e.travelFk = tr.id
				JOIN buy b ON b.entryFk = e.id
			WHERE warehouseOutFk = vWarehouseOutFkInventory
				AND landed < vDate
				AND e.supplierFk = vInventorySupplierFk
				AND warehouseInFk = vWh
				AND NOT isRaid;

		IF vDateLastInventory IS NULL THEN
			SELECT inventoried INTO vDateLastInventory FROM config;
		END IF;

		-- Generamos travel, si no existe.
		SET vTravelFK = 0;

		SELECT id INTO vTravelFk
			FROM travel
			WHERE warehouseOutFk = vWarehouseOutFkInventory
				AND warehouseInFk = vWh
				AND landed = vDate
				AND agencyModeFk = vAgencyModeFkInventory
				AND ref = 'inventario'
			LIMIT 1;

		IF NOT vTravelFK THEN

			INSERT INTO travel SET
				warehouseOutFk = vWarehouseOutFkInventory,
				warehouseInFk = vWh,
				shipped = vDate,
				landed = vDate,
				agencyModeFk = vAgencyModeFkInventory,
				ref = 'inventario',
				isDelivered = TRUE,
				isReceived = TRUE;

			SELECT LAST_INSERT_ID() INTO vTravelFk;

		END IF;

		-- Generamos entrada si no existe, o la vaciamos.
		SET vEntryFk = 0;

		SELECT id INTO vEntryFk
			FROM entry
			WHERE supplierFk = vInventorySupplierFk
			AND travelFk = vTravelFk;

		IF NOT vEntryFk THEN

			INSERT INTO entry SET
				supplierFk = vInventorySupplierFk,
				isConfirmed = TRUE,
				isOrdered = TRUE,
				travelFk = vTravelFk;

			SELECT LAST_INSERT_ID() INTO vEntryFk;

		ELSE

			DELETE FROM buy WHERE entryFk = vEntryFk;

		END IF;

		-- Preparamos tabla auxilar
		CREATE OR REPLACE TEMPORARY TABLE tmp.inventory (
				itemFk INT(11) NOT NULL PRIMARY KEY,
				quantity int(11) DEFAULT '0',
				buyingValue decimal(10,3) DEFAULT '0.000',
				freightValue decimal(10,3) DEFAULT '0.000',
				packing int(11) DEFAULT '0',
				`grouping` smallint(5) unsigned NOT NULL DEFAULT '1',
				groupingMode tinyint(4) NOT NULL DEFAULT 0 ,
				comissionValue decimal(10,3) DEFAULT '0.000',
				packageValue decimal(10,3) DEFAULT '0.000',
				packageFk varchar(10) COLLATE utf8_unicode_ci DEFAULT '--',
				price1 decimal(10,2) DEFAULT '0.00',
				price2 decimal(10,2) DEFAULT '0.00',
				price3 decimal(10,2) DEFAULT '0.00',
				minPrice decimal(10,2) DEFAULT '0.00',
				producer varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
		INDEX (itemFK)) ENGINE = MEMORY;

		-- Compras
		INSERT INTO tmp.inventory(itemFk,quantity)
			SELECT b.itemFk, SUM(b.quantity)
				FROM buy b
					JOIN entry e ON e.id = b.entryFk
					JOIN travel tr ON tr.id = e.travelFk
				WHERE tr.warehouseInFk = vWh
					AND tr.landed BETWEEN vDateLastInventory 
					AND vDateYesterday
					AND NOT isRaid
				GROUP BY b.itemFk;
	SELECT vDateLastInventory , vDateYesterday;

		-- Traslados
		INSERT INTO tmp.inventory(itemFk, quantity)
			SELECT itemFk, quantityOut
			FROM (
					SELECT b.itemFk,- SUM(b.quantity) quantityOut
						FROM buy b
							JOIN entry e ON e.id = b.entryFk
							JOIN travel tr ON tr.id = e.travelFk
						WHERE tr.warehouseOutFk = vWh
							AND tr.shipped BETWEEN vDateLastInventory
							AND vDateYesterday
							AND NOT isRaid
						GROUP BY b.itemFk
				) sub
			ON DUPLICATE KEY UPDATE quantity = IFNULL(quantity, 0) + sub.quantityOut;

		-- Ventas
		INSERT INTO tmp.inventory(itemFk,quantity)
			SELECT itemFk, saleOut
			FROM (
					SELECT s.itemFk, - SUM(s.quantity) saleOut
						FROM sale s
							JOIN ticket t ON t.id = s.ticketFk
						WHERE t.warehouseFk = vWh
							AND t.shipped BETWEEN vDateLastInventory AND vDateYesterday
						GROUP BY s.itemFk
				) sub
			ON DUPLICATE KEY UPDATE quantity = IFNULL(quantity,0) + sub.saleOut;

		-- Actualiza valores de la ultima compra
		UPDATE tmp.inventory inv
				JOIN cache.last_buy lb ON lb.item_id = inv.itemFk AND lb.warehouse_id = vWh
				JOIN buy b ON b.id = lb.buy_id
				JOIN item i ON i.id = b.itemFk
				LEFT JOIN producer p ON p.id = i.producerFk
			SET inv.buyingValue = b.buyingValue,
				inv.freightValue = b.freightValue,
				inv.packing = b.packing,
				inv.`grouping`= b.`grouping`,
				inv.groupingMode = b.groupingMode,
				inv.comissionValue = b.comissionValue,
				inv.packageValue = b.packageValue,
				inv.packageFk = b.packagingFk,
				inv.price1 = b.price1,
				inv.price2 = b.price2,
				inv.price3 = b.price3,
				inv.minPrice = b.minPrice,
				inv.producer = p.name;
	
		INSERT INTO buy( itemFk,
				quantity,
				buyingValue,
				freightValue,
				packing,
				`grouping`,
				groupingMode,
				comissionValue,
				packageValue,
				packagingFk,
				price1,
				price2,
				price3,
				minPrice,
				entryFk)
			SELECT itemFk,
				GREATEST(quantity, 0),
				buyingValue,
				freightValue,
				packing,
				`grouping`,
				groupingMode,
				comissionValue,
				packageValue,
				packagingFk,
				price1,
				price2,
				price3,
				minPrice,
				vEntryFk
					FROM tmp.inventory;

		SELECT vWh, COUNT(*), util.VN_NOW() FROM tmp.inventory;
	
	-- Actualizamos el campo lastUsed de item
	UPDATE item i
			JOIN tmp.inventory i2 ON i2.itemFk = i.id
		SET i.lastUsed = NOW()
		WHERE i2.quantity;
		
	-- DROP TEMPORARY TABLE tmp.inventory;
		
	END LOOP;

	CLOSE cWarehouses;

	UPDATE config SET inventoried = vDate;
	SET @isModeInventory := FALSE;

	DROP TEMPORARY TABLE IF EXISTS tmp.entryToDelete;
	CREATE TEMPORARY TABLE tmp.entryToDelete
		(INDEX(entryId) USING BTREE) ENGINE = MEMORY
		SELECT e.id as entryId,
				t.id as travelId
			FROM travel t
				JOIN `entry` e ON e.travelFk = t.id 
			WHERE e.supplierFk = vInventorySupplierFk
				AND t.shipped <= util.VN_CURDATE() - INTERVAL 12 DAY
				AND (DAY(t.shipped) <> 1 OR shipped < util.VN_CURDATE() - INTERVAL 12 DAY);
			
	DELETE e
		FROM `entry` e
			JOIN tmp.entryToDelete tmp ON tmp.entryId = e.id;

	DELETE IGNORE t
		FROM travel t
			JOIN tmp.entryToDelete tmp ON tmp.travelId = t.id;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`inventory_repair`()
BEGIN

	DROP TEMPORARY TABLE IF EXISTS tmp.lastEntry;
	CREATE TEMPORARY TABLE tmp.lastEntry
	(PRIMARY KEY (buyFk))
	SELECT
			i.id AS itemFk,
			w.id AS warehouseFk,
			w.name AS warehouse,
			tr.landed,
			b.id AS buyFk,
			b.entryFk,
			b.isIgnored,
			b.price2, 
			b.price3,
			b.stickers,
			b.packing,
			b.grouping,
			b.groupingMode,
			b.weight,
			i.stems,
			b.quantity,
			b.buyingValue,
			b.packagingFk ,
			s.id AS supplierFk,
			s.name AS supplier
		FROM itemType it
		RIGHT JOIN (entry e 
				LEFT JOIN supplier s ON s.id = e.supplierFk
				RIGHT JOIN buy b ON b.entryFk = e.id
				LEFT JOIN item i ON i.id = b.itemFk
				LEFT JOIN ink ON ink.id = i.inkFk 
				LEFT JOIN travel tr ON tr.id = e.travelFk
				LEFT JOIN warehouse w ON w.id = tr.warehouseInFk
				LEFT JOIN origin o ON o.id = i.originFk
				) ON it.id = i.typeFk
		LEFT JOIN edi.ekt ek ON b.ektFk = ek.id
		WHERE (b.packagingFk = "--" OR b.price2 = 0 OR b.packing = 0 OR b.buyingValue = 0) AND tr.landed > util.firstDayOfMonth(TIMESTAMPADD(MONTH,-1,util.VN_CURDATE())) AND s.name = 'INVENTARIO';
	  
	DROP TEMPORARY TABLE IF EXISTS tmp.lastEntryOk;
	CREATE TEMPORARY TABLE tmp.lastEntryOk  
	(PRIMARY KEY (buyFk))
	  SELECT
			i.id AS itemFk,
			w.id AS warehouseFk,
			w.name AS warehouse,
			tr.landed,
			b.id AS buyFk,
			b.entryFk,
			b.isIgnored,
			b.price2, 
			b.price3,
			b.stickers,
			b.packing,
			b.grouping,
			b.groupingMode,
			b.weight,
			i.stems,
			b.quantity,
			b.buyingValue,
			b.packagingFk,
			s.id AS supplierFk,
			s.name AS supplier
		FROM itemType it
		RIGHT JOIN (entry e 
				LEFT JOIN supplier s ON s.id = e.supplierFk
				RIGHT JOIN buy b ON b.entryFk = e.id
				LEFT JOIN item i ON i.id = b.itemFk
				LEFT JOIN ink ON ink.id = i.inkFk 
				LEFT JOIN travel tr ON tr.id = e.travelFk
				LEFT JOIN warehouse w ON w.id = tr.warehouseInFk
				LEFT JOIN origin o ON o.id = i.originFk
				) ON it.id = i.typeFk
		LEFT JOIN edi.ekt ek ON b.ektFk = ek.id
		WHERE b.packagingFk != "--" AND b.price2 != 0 AND b.packing != 0 AND b.buyingValue > 0 AND tr.landed > util.firstDayOfMonth(TIMESTAMPADD(MONTH,-2,util.VN_CURDATE()))
		ORDER BY tr.landed DESC;
		
	DROP TEMPORARY TABLE IF EXISTS tmp.lastEntryOkGroup;
	CREATE TEMPORARY TABLE tmp.lastEntryOkGroup  
	(INDEX (warehouseFk,itemFk))
	  SELECT *
		FROM tmp.lastEntryOk tmp
		GROUP BY tmp.itemFk,tmp.warehouseFk;
		
		UPDATE buy b
		JOIN tmp.lastEntry lt ON lt.buyFk = b.id
		JOIN tmp.lastEntryOkGroup eo ON eo.itemFk = lt.itemFk AND eo.warehouseFk = lt.warehouseFk
		SET b.packagingFk = eo.packagingFk WHERE b.packagingFk = "--";
		
		UPDATE buy b
		JOIN tmp.lastEntry lt ON lt.buyFk = b.id
		JOIN tmp.lastEntryOkGroup eo ON eo.itemFk = lt.itemFk AND eo.warehouseFk = lt.warehouseFk
		 SET b.price2 = eo.price2 WHERE  b.price2 = 0 ;
		
		UPDATE buy b
		JOIN tmp.lastEntry lt ON lt.buyFk = b.id
		JOIN tmp.lastEntryOkGroup eo ON eo.itemFk = lt.itemFk AND eo.warehouseFk = lt.warehouseFk
		SET b.packing = eo.packing WHERE b.packing = 0;
		
		UPDATE buy b
		JOIN tmp.lastEntry lt ON lt.buyFk = b.id
		JOIN tmp.lastEntryOkGroup eo ON eo.itemFk = lt.itemFk AND eo.warehouseFk = lt.warehouseFk
		SET b.buyingValue = eo.buyingValue WHERE  b.buyingValue = 0;
    
		DROP TEMPORARY TABLE tmp.lastEntry;
        DROP TEMPORARY TABLE tmp.lastEntryOk;
    	DROP TEMPORARY TABLE tmp.lastEntryOkGroup;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_afterUpsert`(vSelf INT)
BEGIN
/**
 * Triggered actions when a buy is updated or inserted.
 *
 * @param vSelf The buy reference
 */
	DECLARE vEntryFk INT;
	DECLARE vItemFk INT;
	DECLARE vPackingOut DECIMAL(10,2);
	DECLARE vWarehouse INT;
	DECLARE vStandardFlowerBox INT;
	DECLARE vWarehouseOut INT;
	DECLARE vIsMerchandise BOOL;
	DECLARE vIsFeedStock BOOL;
	DECLARE vWeight DECIMAL(10,2);
	DECLARE vPacking INT;
   
	SELECT b.entryFk, 
			b.itemFk, 
			i.packingOut, 
			ic.merchandise, 
			vc.standardFlowerBox,
			b.weight,
			b.packing 
		INTO 
			vEntryFk, 
			vItemFk, 
			vPackingOut, 
			vIsMerchandise, 
			vStandardFlowerBox,
			vWeight,
			vPacking
		FROM buy b
			LEFT JOIN item i ON i.id = b.itemFk
			LEFT JOIN itemType it ON it.id = i.typeFk
			LEFT JOIN itemCategory ic ON ic.id = it.categoryFk
			LEFT JOIN packaging p ON p.id = b.packagingFk AND NOT p.isBox 
			JOIN volumeConfig vc ON TRUE
		WHERE b.id = vSelf;

	SELECT t.warehouseInFk, t.warehouseOutFk
			INTO vWarehouse, vWarehouseOut
		FROM entry e
			JOIN travel t ON t.id = e.travelFk
		WHERE e.id = vEntryFk;

	IF vIsMerchandise THEN

    	REPLACE itemCost SET
			itemFk = vItemFk,
			warehouseFk = vWarehouse,
			cm3 = buy_getUnitVolume(vSelf),
			cm3Delivery = IFNULL((vStandardFlowerBox * 1000) / vPackingOut, buy_getUnitVolume(vSelf));
		
		IF vWeight AND vPacking THEN
			UPDATE itemCost SET
					grams = vWeight * 1000 / vPacking
				WHERE itemFk = vItemFk
					AND warehouseFk = vWarehouse;
		END IF;
	END IF;

	SELECT isFeedStock INTO vIsFeedStock
		FROM warehouse WHERE id = vWarehouseOut;

	IF vIsFeedStock THEN
		INSERT IGNORE INTO producer(`name`)
			SELECT es.company_name
				FROM buy b
					JOIN edi.ekt be ON be.id = b.ektFk
					JOIN edi.supplier es ON es.supplier_id = be.pro
				WHERE b.id = vSelf;

	END IF;
    
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`buy_getUnitVolume`(vSelf INT)
	RETURNS int(11)
	DETERMINISTIC
BEGIN
/**
 * Calculates the unit volume occupied by a buy.
 *
 * @param vSelf The buy id
 * @return The unit volume in cubic centimeters
 */
	DECLARE vItem INT;
	DECLARE vPackaging VARCHAR(10);
	DECLARE vPacking INT;

	SELECT itemFk, packagingFk, packing
		INTO vItem, vPackaging, vPacking
		FROM buy
		WHERE id = vSelf;

	RETURN IFNULL(ROUND(item_getVolume(vItem, vPackaging) / vPacking), 0);
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_recalcPrices`()
BEGIN
/**
 * Recalcula los precios para las compras insertadas en tmp.buyRecalc
 *
 * @param tmp.buyRecalc (id)
 */
	DECLARE vLanded DATE;
	DECLARE vWarehouseFk INT;
	DECLARE vHasNotPrice BOOL;
	DECLARE vBuyingValue DECIMAL(10,3);
	DECLARE vPackagingFk VARCHAR(10);
	DECLARE vIsWarehouseFloramondo BOOL;

	SELECT t.landed, t.warehouseInFk, (w.`name` = 'Floramondo')
			INTO vLanded, vWarehouseFk, vIsWarehouseFloramondo
		FROM tmp.buyRecalc br
			JOIN buy b ON b.id = br.id
			JOIN entry e ON e.id = b.entryFk
			JOIN travel t ON t.id = e.travelFk
			JOIN warehouse w ON w.id = t.warehouseInFk
		LIMIT 1;

	CALL rate_getPrices(vLanded, vWarehouseFk);

	UPDATE buy b
			JOIN tmp.buyRecalc br ON br.id = b.id AND (@buyId := b.id)
			LEFT JOIN packaging p ON p.id = b.packagingFk
			JOIN item i ON i.id = b.itemFk
			JOIN entry e ON e.id = b.entryFk
			JOIN itemType it ON it.id = i.typeFk
			JOIN travel tr ON tr.id = e.travelFk
			JOIN agencyMode am ON am.id = tr.agencyModeFk
			JOIN tmp.rate r
			JOIN volumeConfig vc
		SET b.freightValue = @PF:= IFNULL(((am.m3 * @m3:= item_getVolume(b.itemFk, b.packagingFk) / 1000000)
				/ b.packing) * IF(am.hasWeightVolumetric, GREATEST(b.weight / @m3 / vc.aerealVolumetricDensity, 1), 1), 0),
			b.comissionValue = @CF:= ROUND(IFNULL(e.commission * b.buyingValue / 100, 0), 3),
			b.packageValue = @EF:= IF(vIsWarehouseFloramondo, 0, IFNULL(ROUND(IF(p.isPackageReturnable, p.returnCost / b.packing , p.`value` / b.packing), 3),0)),
			b.price3 = @t3:= IF(r.rate3 = 0, b.buyingValue,ROUND((b.buyingValue + @CF + @EF + @PF) / ((100 - r.rate3 - it.promo ) /100) ,2)),    -- He añadido que el coste sea igual a tarifa3 si t3 = 0
			b.price2 = @t2:= round(@t3 * (1 + ((r.rate2 - r.rate3)/100)),2),
			b.price2 = @t2:= IF(@t2 <= @t3,@t3 , @t2);

	SELECT (b.buyingValue = b.price2), b.buyingValue, b.packagingFk
			INTO vHasNotPrice, vBuyingValue, vPackagingFk
		FROM vn.buy b
		WHERE b.id = @buyId AND b.buyingValue <> 0.01;

	DROP TEMPORARY TABLE tmp.rate;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `edi`.`ekt_load`(IN `vSelf` INT)
proc:BEGIN
	
	DECLARE vRef INT;
	DECLARE vBuy INT;
	DECLARE vItem INT;
	DECLARE vQty INT;
	DECLARE vPackage INT;
	DECLARE vPutOrderFk INT;
	DECLARE vIsLot BOOLEAN;
    DECLARE vForceToPacking INT DEFAULT 2;
    DECLARE vEntryFk INT;
   	DECLARE vHasToChangePackagingFk BOOLEAN;
    DECLARE vIsFloramondoDirect BOOLEAN;
    DECLARE vTicketFk INT;
	DECLARE vHasItemGroup BOOL;
	DECLARE vDescription VARCHAR(255);
	DECLARE vSaleFk INT;

	-- Carga los datos necesarios del EKT

	SELECT 	e.ref, qty, package, putOrderFk MOD 1000000, i2.id , NOT ISNULL(eea.addressFk), NOT ISNULL(igto.group_code),
			CONCAT(e.`ref`, ' ', e.item, ' ', e.sub, ' EktFk:', e.id)
		INTO vRef, vQty, vPackage, vPutOrderFk, vItem, vIsFloramondoDirect, vHasItemGroup, vDescription
		FROM edi.ekt e
			LEFT JOIN edi.item i ON e.ref = i.id
			LEFT JOIN edi.putOrder po ON po.id = e.putOrderFk
			LEFT JOIN vn.item i2 ON i2.supplyResponseFk = po.supplyResponseID 
			LEFT JOIN vn.ektEntryAssign eea ON eea.sub = e.sub
			LEFT JOIN edi.item_groupToOffer igto ON igto.group_code = i.group_id
		WHERE e.id = vSelf
			LIMIT 1;
        
	IF NOT vHasItemGroup THEN
	
		CALL vn.mail_insert('logistica@verdnatura.es', 'nocontestar@verdnatura.es', 'Nuevo grupo en Floramondo', vDescription);
	
		CALL vn.mail_insert('pako@verdnatura.es', 'nocontestar@verdnatura.es', CONCAT('Nuevo grupo en Floramondo: ', vDescription), vDescription);
	
		LEAVE proc;
	
	END IF;
		
	-- Asigna la entrada
    SELECT vn.ekt_getEntry(vSelf) INTO vEntryFk;
    																				
	-- Inserta el cubo si no existe

	IF vPackage = 800 THEN
	
		SET vHasToChangePackagingFk = TRUE;
	
		IF vItem THEN
		
			SELECT vn.item_getPackage(vItem) INTO vPackage ;
		
		ELSE
		
	 		SET vPackage = 8000 + vQty;

			INSERT IGNORE INTO vn.packaging(id, width, `depth`)
				SELECT vPackage, vc.ccLength / vQty, vc.ccWidth
				FROM vn.volumeConfig vc;
		
		END IF;
	
	ELSE
	
		INSERT IGNORE INTO vn2008.Cubos (Id_Cubo, X, Y, Z)
			SELECT bucket_id, ROUND(x_size/10), ROUND(y_size/10), ROUND(z_size/10)
				FROM bucket WHERE bucket_id = vPackage;
		
		IF ROW_COUNT() > 0
		THEN
			INSERT INTO vn2008.mail SET
				`subject` = 'Cubo añadido',
				`text` = CONCAT('Se ha añadido el cubo: ', vPackage),
				`to` = 'ekt@verdnatura.es';
		END IF;
	END IF;
    
	-- Si es una compra de Logiflora obtiene el articulo
	IF vPutOrderFk THEN
		
		SELECT i.id INTO vItem
			FROM edi.putOrder po
				JOIN vn.item i ON i.supplyResponseFk = po.supplyResponseID
			WHERE po.id = vPutOrderFk
			LIMIT 1;
		
	END IF;

	INSERT IGNORE INTO item_track SET
			item_id = vRef;
	
    IF IFNULL(vItem,0) = 0 THEN
    
		-- Intenta obtener el artículo en base a los atributos holandeses
		
		SELECT b.id, IFNULL(b.itemOriginalFk ,b.itemFk) INTO vBuy, vItem
			FROM edi.ekt e 
				JOIN edi.item_track t ON t.item_id = e.ref
				LEFT JOIN edi.ekt l ON l.ref = e.ref
				LEFT JOIN vn.buy b ON b.ektFk = l.id
				LEFT JOIN vn.item i ON i.id = b.itemFk
				JOIN vn2008.config cfg
			WHERE e.id = vSelf
				AND l.id != vSelf
				AND b.itemFk != cfg.generic_item
				AND IF(t.s1, l.s1 = e.s1, TRUE)
				AND IF(t.s2, l.s2 = e.s2, TRUE)
				AND IF(t.s3, l.s3 = e.s3, TRUE)
				AND IF(t.s4, l.s4 = e.s4, TRUE)
				AND IF(t.s5, l.s5 = e.s5, TRUE)
				AND IF(t.s6, l.s6 = e.s6, TRUE)
				AND IF(t.pac, l.pac = e.pac, TRUE)
				AND IF(t.cat, l.cat = e.cat, TRUE)
				AND IF(t.ori, l.ori = e.ori, TRUE)
				AND IF(t.pro, l.pro = e.pro, TRUE)
				AND IF(t.package, l.package = e.package, TRUE)
				AND IF(t.item, l.item = e.item, TRUE)
				AND  i.isFloramondo = vIsFloramondoDirect  				
			ORDER BY l.now DESC, b.id ASC 
			LIMIT 1;

	END IF;
    
	-- Si no encuentra el articulo lo crea en el caso de las compras directas en Floramondo
	IF ISNULL(vItem) AND vIsFloramondoDirect THEN
	
		CALL edi.item_getNewByEkt(vSelf, vItem);
	
	END IF;
	
    INSERT INTO vn.buy
	(
		 entryFk
		,ektFk
		,buyingValue
		,itemFk
        ,stickers
        ,packing
		,`grouping`
        ,quantity
		,groupingMode
		,packagingFk
        ,weight
	)
	SELECT
		 vEntryFk
		,vSelf
		,(@t := IF(i.stems, i.stems, 1)) * e.pri / IFNULL(i.stemMultiplier, 1) buyingValue
		,IFNULL(vItem, cfg.generic_item) itemFk
        ,e.qty stickers
        ,@pac := IFNULL(i.stemMultiplier, 1) * e.pac / @t packing
        ,IFNULL(b.`grouping`, e.pac)
        ,@pac * e.qty 
		,vForceToPacking
		,IF(vHasToChangePackagingFk OR ISNULL(b.packagingFk), vPackage, b.packagingFk)
        ,(IFNULL(i.weightByPiece,0) * @pac)/1000
		FROM edi.ekt e 
			LEFT JOIN vn.buy b ON b.id = vBuy
			LEFT JOIN vn.item i ON i.id = b.itemFk
			LEFT JOIN vn.supplier s ON e.pro = s.id
            JOIN vn2008.config cfg		
		WHERE e.id = vSelf
		LIMIT 1;

	DROP TEMPORARY TABLE IF EXISTS tmp.buyRecalc;

	CREATE TEMPORARY TABLE tmp.buyRecalc
		SELECT buy.id
			FROM vn.buy 
			WHERE ektFk = vSelf;

	CALL vn.buy_recalcPrices();

	-- Si es una compra de Logiflora hay que informar la tabla vn.saleBuy
	IF vPutOrderFk THEN
	
		REPLACE vn.saleBuy(saleFk, buyFk, workerFk)
			SELECT po.saleFk, b.id, account.myUser_getId()
				FROM edi.putOrder po
					JOIN vn.buy b ON b.ektFk = vSelf
				WHERE po.id = vPutOrderFk;
	
	END IF;
	-- Si es una compra directa en Floramondo hay que añadirlo al ticket	

	IF vIsFloramondoDirect THEN

		SELECT t.id INTO vTicketFk
            FROM vn.ticket t
                JOIN vn.ektEntryAssign eea 
					ON eea.addressFk = t.addressFk 
					AND t.warehouseFk = eea.warehouseInFk
                JOIN edi.ekt e 
					ON e.sub = eea.sub 
					AND e.id = vSelf
            WHERE e.fec = t.shipped
            LIMIT 1;
	
		IF ISNULL(vTicketFk) THEN

			INSERT INTO vn.ticket (
					clientFk,
					shipped,
					addressFk,
					agencyModeFk,
					nickname,
					warehouseFk,
					companyFk,
					landed,
					zoneFk,
					zonePrice,
					zoneBonus
				)
				SELECT
							a.clientFk,
							e.fec,
							a.id,
							a.agencyModeFk,
							a.nickname,
							eea.warehouseInFk,
							c.id,
							e.fec,
							z.id,
							z.price,
							z.bonus
					FROM edi.ekt e 
						JOIN vn.ektEntryAssign eea ON eea.sub = e.sub 
						JOIN vn.address a ON a.id = eea.addressFk
						JOIN vn.company c ON c.code = 'VNL'
						JOIN vn.`zone` z ON z.code = 'FLORAMONDO'
					WHERE e.id = vSelf
					LIMIT 1;

			SET vTicketFk = LAST_INSERT_ID();
		
			INSERT INTO vn.ticketLog
			SET originFk = vTicketFk, 
				userFk = account.myUser_getId(), 
				`action` = 'insert', 
				description = CONCAT('EktLoad ha creado el ticket:', ' ', vTicketFk);

		END IF;

		INSERT INTO vn.sale (itemFk, ticketFk, concept, quantity, price)
			SELECT vItem, vTicketFk, e.item, e.qty * e.pac, e.pri * ( 1 + fhc.floramondoMargin )
				FROM edi.ekt e
					JOIN edi.floraHollandConfig fhc
					WHERE e.id = vSelf;
				
		SELECT LAST_INSERT_ID() INTO vSaleFk;
	
		REPLACE vn.saleBuy(saleFk, buyFk, workerFk)
			SELECT vSaleFk, b.id, account.myUser_getId()
				FROM vn.buy b
					WHERE b.ektFk = vSelf;

		INSERT INTO vn.saleComponent(saleFk, componentFk, value)
			SELECT vSaleFk, c.id, e.pri
				FROM edi.ekt e
					JOIN vn.component c ON c.code = 'purchaseValue'
					WHERE e.id = vSelf;
				
		INSERT INTO vn.saleComponent(saleFk, componentFk, value)
			SELECT vSaleFk, c.id, e.pri * fhc.floramondoMargin 
				FROM edi.ekt e
					JOIN edi.floraHollandConfig fhc
					JOIN vn.component c ON c.code = 'margin'
					WHERE e.id = vSelf;
	END IF;
	DROP TEMPORARY TABLE tmp.buyRecalc;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `hedera`.`item_getVisible`(
	vWarehouse TINYINT,
    vDate DATE,
    vType INT,
    vPrefix VARCHAR(255))
BEGIN
	
/**
 * Gets visible items of the specified type at specified date.
 *
 * @param vWarehouse The warehouse id
 * @param vDate The visible date
 * @param vType The type id
 * @param vPrefix The article prefix to filter or %NULL for all
 * @return tmp.itemVisible Visible items
 */ 
	DECLARE vPrefixLen SMALLINT;
	DECLARE vFilter VARCHAR(255) DEFAULT NULL;
	DECLARE vDateInv DATE DEFAULT vn2008.date_inv();
	DECLARE EXIT HANDLER FOR 1114
		BEGIN
			GET DIAGNOSTICS CONDITION 1
        		@message = MESSAGE_TEXT;
			CALL vn.mail_insert(
				'cau@verdnatura.es', 
				NULL, 
			    CONCAT('hedera.item_getVisible error: ', @message),
			    CONCAT(
			    	'warehouse: ', IFNULL(vWarehouse, ''), 
			    	', Fecha:', IFNULL(vDate, ''), 
			    	', tipo: ', IFNULL(vType,''), 
			    	', prefijo: ', IFNULL(vPrefix,'')));
			RESIGNAL;
		END;
	SET vPrefixLen = IFNULL(LENGTH(vPrefix), 0) + 1;

	IF vPrefixLen > 1 THEN
		SET vFilter = CONCAT(vPrefix, '%');
	END IF;

	DROP TEMPORARY TABLE IF EXISTS `filter`;
	CREATE TEMPORARY TABLE `filter`
		(INDEX (itemFk))
		ENGINE = MEMORY
		SELECT id itemFk FROM vn.item
			WHERE typeFk = vType
				AND (vFilter IS NULL OR `name` LIKE vFilter);

	DROP TEMPORARY TABLE IF EXISTS currentStock;
	CREATE TEMPORARY TABLE currentStock
		(INDEX (itemFk))
		ENGINE = MEMORY
		SELECT itemFk, SUM(quantity) quantity
			FROM (
				SELECT b.itemFk, b.quantity
					FROM vn.buy b
						JOIN vn.entry e ON e.id = b.entryFk
						JOIN vn.travel t ON t.id = e.travelFk
					WHERE t.landed BETWEEN vDateInv AND vDate
						AND t.warehouseInFk = vWarehouse
						AND NOT e.isRaid
				UNION ALL
				SELECT b.itemFk, -b.quantity
					FROM vn.buy b
						JOIN vn.entry e ON e.id = b.entryFk
						JOIN vn.travel t ON t.id = e.travelFk
					WHERE t.shipped BETWEEN vDateInv AND util.VN_CURDATE()
						AND t.warehouseOutFk = vWarehouse
						AND NOT e.isRaid
						AND t.isDelivered
				UNION ALL
				SELECT m.itemFk, -m.quantity
					FROM vn.sale m
						JOIN vn.ticket t ON t.id = m.ticketFk
						JOIN vn.ticketState s ON s.ticket = t.id
					WHERE t.shipped BETWEEN vDateInv AND util.VN_CURDATE()
						AND t.warehouseFk = vWarehouse
						AND s.alertLevel = 3
			) t
			GROUP BY itemFk
				HAVING quantity > 0;

	DROP TEMPORARY TABLE IF EXISTS tmp;
	CREATE TEMPORARY TABLE tmp
		(INDEX (itemFk))
		ENGINE = MEMORY
		SELECT *
			FROM (
				SELECT b.itemFk, b.packagingFk, b.packing
					FROM vn.buy b
						JOIN vn.entry e ON e.id = b.entryFk
						JOIN vn.travel t ON t.id = e.travelFk
					WHERE t.landed BETWEEN vDateInv AND vDate
						AND NOT b.isIgnored
						AND b.price2 >= 0
						AND b.packagingFk IS NOT NULL
					ORDER BY t.warehouseInFk = vWarehouse DESC, t.landed DESC
					LIMIT 10000000000000000000
			) t GROUP BY itemFk;

	DROP TEMPORARY TABLE IF EXISTS tmp.itemVisible;
	CREATE TEMPORARY TABLE tmp.itemVisible
		ENGINE = MEMORY
		SELECT i.id Id_Article,
				SUBSTRING(i.`name`, vPrefixLen) Article,
				t.packing, p.id Id_Cubo,
				IF(p.depth > 0, p.depth, 0) depth, p.width, p.height,
				CEIL(s.quantity / t.packing) etiquetas
			FROM vn.item i
				JOIN `filter` f ON f.itemFk = i.id 
				JOIN currentStock s ON s.itemFk = i.id
				LEFT JOIN tmp t ON t.itemFk = i.id
				LEFT JOIN vn.packaging p ON p.id = t.packagingFk
			WHERE CEIL(s.quantity / t.packing) > 0
				-- FIXME: Column Cubos.box not included in view vn.packaging
				/* AND p.box */;

	DROP TEMPORARY TABLE
		`filter`,
		currentStock,
		tmp;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_getVolume`()
BEGIN
/**
 * Cálculo de volumen en líneas de compra
 * @table tmp.buy(buyFk)
 */
	SELECT  t.name Temp,
			CAST(ROUND(SUM(GREATEST(b.stickers ,b.quantity /b.packing ) *
			item_getVolume(b.itemFk, b.packagingFk)) / vc.trolleyM3 / 1000000 ,1) AS DECIMAL(10,2)) carros ,
			CAST(ROUND(SUM(GREATEST(b.stickers ,b.quantity /b.packing ) *
			item_getVolume(b.itemFk, b.packagingFk)) / vc.palletM3 / 1000000,1) AS DECIMAL(10,2)) espais
		FROM buy b 
			JOIN tmp.buy tb ON tb.buyFk = b.id
			JOIN volumeConfig vc
			JOIN item i ON i.id = b.itemFk
			JOIN itemType it ON it.id = i.typeFk
			LEFT JOIN temperature t ON t.code = it.temperatureFk 
		GROUP BY Temp;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_checkPackaging`(vEntryFk INT)
BEGIN
/**
 * Comprueba que los campos package y packaging no sean nulos
 * 
 * @param vEntryFk Id de entrada
 */
	DECLARE vpackageOrPackingNull INT;

	SELECT count(*) INTO vpackageOrPackingNull
		FROM buy b
		WHERE b.entryFk = vEntryFk
			AND (b.packing IS NULL OR b.packagingFk IS NULL);

	IF vpackageOrPackingNull THEN
		CALL util.throw("packageOrPackingNull");
	END IF;
END$$
DELIMITER ;

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`fustControl`(vFromDated DATE, vToDated DATE)
BEGIN
	
	DECLARE vSijsnerClientFk INT DEFAULT 19752;

	DECLARE vDateStart DATETIME;
	DECLARE vDateEnd DATETIME;

	SET vDateStart = vFromDated;
	SET vDateEnd = util.Dayend(vToDated);

	SELECT p.id FustCode, 
			CAST(sent.stucks AS DECIMAL(10,0)) FH, 
			CAST(tp.stucks AS DECIMAL(10,0)) Tickets, 
			CAST(-sj.stucks AS DECIMAL(10,0)) Sijsner, 
			CAST(IFNULL(sent.stucks,0) - IFNULL(tp.stucks,0) + IFNULL(sj.stucks,0) AS DECIMAL(10,0)) saldo
		FROM vn.packaging p
		LEFT JOIN (
			SELECT FustCode, sum(fustQuantity) stucks
				FROM (
				SELECT IFNULL(pe.equivalentFk ,b.packagingFk) FustCode, s.quantity / b.packing AS fustQuantity
					FROM vn.sale s 
						JOIN vn.ticket t ON t.id = s.ticketFk 
						JOIN vn.warehouse w ON w.id = t.warehouseFk 
						JOIN vn.warehouseAlias wa ON wa.id = w.aliasFk 
						JOIN cache.last_buy lb ON lb.item_id = s.itemFk AND lb.warehouse_id = t.warehouseFk 
						JOIN vn.buy b ON b.id = lb.buy_id 
						JOIN vn.packaging p ON p.id = b.packagingFk 
						LEFT JOIN vn.packageEquivalent pe ON pe.packagingFk = p.id
						JOIN vn.address a ON a.id = t.addressFk 
						JOIN vn.province p2 ON p2.id = a.provinceFk 
						JOIN vn.country c ON c.id = p2.countryFk 
					WHERE t.shipped BETWEEN vDateStart AND vDateEnd
						AND wa.name = 'VNH'
						AND p.isPackageReturnable 
						AND c.country = 'FRANCIA') sub 
					GROUP BY FustCode) sent ON sent.FustCode = p.id
		LEFT JOIN (
			SELECT FustCode, sum(quantity) stucks
				FROM (
				SELECT IFNULL(pe.equivalentFk ,tp.packagingFk) FustCode, tp.quantity
					FROM vn.ticketPackaging tp 
						JOIN vn.ticket t ON t.id = tp.ticketFk 
						JOIN vn.warehouse w ON w.id = t.warehouseFk 
						JOIN vn.warehouseAlias wa ON wa.id = w.aliasFk 
						JOIN vn.packaging p ON p.id = tp.packagingFk 
						LEFT JOIN vn.packageEquivalent pe ON pe.packagingFk = p.id
						JOIN vn.address a ON a.id = t.addressFk 
						JOIN vn.province p2 ON p2.id = a.provinceFk 
						JOIN vn.country c ON c.id = p2.countryFk 
					WHERE t.shipped BETWEEN vDateStart AND vDateEnd
						AND wa.name = 'VNH'
						AND p.isPackageReturnable 
						AND c.country = 'FRANCIA'
						AND t.clientFk != vSijsnerClientFk
						AND tp.quantity > 0) sub 
					GROUP BY FustCode) tp ON tp.FustCode = p.id
		LEFT JOIN (
			SELECT FustCode, sum(quantity) stucks
				FROM (
				SELECT IFNULL(pe.equivalentFk ,tp.packagingFk) FustCode, tp.quantity
					FROM vn.ticketPackaging tp 
						JOIN vn.ticket t ON t.id = tp.ticketFk 
						JOIN vn.warehouse w ON w.id = t.warehouseFk 
						JOIN vn.warehouseAlias wa ON wa.id = w.aliasFk 
						JOIN vn.packaging p ON p.id = tp.packagingFk 
						LEFT JOIN vn.packageEquivalent pe ON pe.packagingFk = p.id
					WHERE t.shipped BETWEEN TIMESTAMPADD(DAY, 1, vDateStart ) AND TIMESTAMPADD(DAY, 1, vDateEnd )
						AND wa.name = 'VNH'
						AND p.isPackageReturnable 
						AND t.clientFk = vSijsnerClientFk) sub 
					GROUP BY FustCode) sj ON sj.FustCode = p.id
		WHERE sent.stucks 
			OR tp.stucks
			OR sj.stucks;

END$$
DELIMITER ;