DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_moveNotPrinted`(vSelf INT,
	vDays INT,
	vChangeEntry BOOL,
	OUT vNewEntryFk INT)
BEGIN
/**
 * Crea una entrada a futuro y divide las lineas de buy de
 * la entrada original en función de las etiquetas impresas
 *
 * @param vSelf Identificador de entry
 * @param vDays Número de dias a futuro que se quiere la nueva entrada
 * @param vChangeEntry Si se modifica la entrada original
 *
 * @return vNewEntryFk Identificador de la nueva entrada
 */
	DECLARE vNewTravelFk INT;
	DECLARE vTravelFk INT;
	DECLARE vInvoiceAmountOldEntryFk DECIMAL(10,2);
	DECLARE vInvoiceAmountNewEntry DECIMAL(10,2);
	DECLARE vIsOrdered BOOL;
	DECLARE vIsConfirmed BOOL;
	DECLARE vInvoiceNumber VARCHAR(50);
	DECLARE vTypeFk VARCHAR(100);

	SELECT travelFk, isOrdered, isConfirmed, invoiceNumber, typeFk INTO vTravelFk, vIsOrdered, vIsConfirmed, vInvoiceNumber, vTypeFk
		FROM entry
		WHERE id = vSelf;

	CALL travel_clone(vTravelFk, vDays, vNewTravelFk);
	CALL entry_cloneWithoutBuy(vSelf, vNewEntryFk);

	UPDATE entry e
		SET e.travelFk = vNewTravelFk,
			e.evaNotes = CONCAT('No impresas de: ', vSelf, ' ', IFNULL(e.evaNotes,'')),
			e.isOrdered = vIsOrdered,
			e.isConfirmed = vIsConfirmed,
			e.invoiceNumber = vInvoiceNumber,
			e.typeFk = vTypeFk
		WHERE e.id = vNewEntryFk;

	IF vChangeEntry THEN
		UPDATE buy b
			SET b.entryFk = vNewEntryFk
			WHERE b.printedStickers = 0
				AND b.entryFk = vSelf;
	END IF;

	INSERT INTO buy(entryFk,
			itemFk,
			quantity,
			buyingValue,
			freightValue,
			isIgnored,
			stickers,
			packing,
			`grouping`,
			groupingMode,
			containerFk,
			comissionValue,
			packageValue,
			packagingFk,
			price1,
			price2,
			price3,
			minPrice,
			workerFk,
			weight,
			itemOriginalFk)
		SELECT vNewEntryFk,
				itemFk,
				((stickers - CAST(printedStickers AS INT)) * packing) quantity,
				buyingValue,
				freightValue,
				isIgnored,
				(stickers - CAST(printedStickers AS INT)) stickers,
				packing,
				`grouping`,
				groupingMode,
				containerFk,
				comissionValue,
				packageValue,
				packagingFk,
				price1,
				price2,
				price3,
				minPrice,
				workerFk,
				weight,
				itemOriginalFk
			FROM buy b
			WHERE b.entryFk = vSelf
				AND b.printedStickers != b.stickers;
			
	IF vChangeEntry THEN
		UPDATE buy
			SET stickers = printedStickers,
				quantity = printedStickers * packing
			WHERE entryFk = vSelf;
	ELSE
		INSERT INTO buy(entryFk, itemFk)
			SELECT vSelf, i.id
				FROM item i
				WHERE i.description = 'MISFIT'
				LIMIT 1;
		
		INSERT INTO buy(entryFk,
					itemFk,
					quantity,
					buyingValue,
					freightValue,
					isIgnored,
					stickers,
					packing,
					`grouping`,
					groupingMode,
					containerFk,
					comissionValue,
					packageValue,
					location,
					packagingFk,
					price1,
					price2,
					price3,
					minPrice)
		SELECT vSelf,
				itemFk,
				(CAST(printedStickers AS INT) - stickers) * packing quantity,
				buyingValue,
				freightValue,
				TRUE isIgnored,
				CAST(printedStickers AS INT) - stickers,
				packing,
				`grouping`,
				groupingMode,
				containerFk,
				comissionValue,
				packageValue,
				location,
				packagingFk,
				price1,
				price2,
				price3,
				minPrice
			FROM buy
			WHERE entryFk = vSelf
				AND printedStickers != stickers;
	END IF;

	SELECT SUM(IFNULL(b.buyingValue * b.quantity, 0)) INTO vInvoiceAmountOldEntryFk
		FROM buy b
		WHERE b.entryFk = vSelf;

	UPDATE entry e
		JOIN buy b ON b.entryFk = e.id
			SET e.reference = CONCAT(e.reference,'(1)'),
			e.invoiceAmount = vInvoiceAmountOldEntryFk
	WHERE e.id = vSelf;

	SELECT SUM(IFNULL(b.buyingValue * b.quantity, 0)) INTO vInvoiceAmountNewEntry
		FROM buy b
		WHERE b.entryFk = vNewEntryFk;

	UPDATE entry e
		JOIN buy b ON b.entryFk = e.id
			SET e.reference = CONCAT(e.reference,'(2)'),
			e.invoiceAmount = vInvoiceAmountNewEntry
		WHERE e.id = vNewEntryFk;

	UPDATE entry
		SET gestDocFk = (SELECT gestDocFk FROM entry WHERE id = vSelf LIMIT 1)
		WHERE id = vNewEntryFk;
	
	INSERT INTO duaEntry (duaFk, entryFk)
		SELECT duaFk, vNewEntryFk FROM duaEntry WHERE entryFk = vSelf LIMIT 1;
END$$
DELIMITER ;