DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT)
BEGIN
/**
 * Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
 *
 * @param vDateFuture Fecha de los tickets que se quieren adelantar.
 * @param vDateToAdvance Fecha a cuando se quiere adelantar.
 * @param vWarehouseFk Almacén
 */

    CALL item_getStock(vWarehouseFk, vDateToAdvance, NULL);
    CALL item_getMinacum(
		vWarehouseFk,
		vDateToAdvance,
		DATEDIFF(DATE_SUB(vDateFuture, INTERVAL 1 DAY), vDateToAdvance),
		NULL
	);

	CREATE OR REPLACE TEMPORARY TABLE tmp.filter
		(INDEX (id))
		SELECT origin.ticketFk futureId,
				dest.ticketFk id,
				dest.state,
				origin.futureState,
				origin.futureIpt,
				dest.ipt,
				origin.workerFk,
				origin.futureLiters,
				origin.futureLines,
				dest.shipped,
				origin.shipped futureShipped,
				dest.totalWithVat,
				origin.totalWithVat futureTotalWithVat,
				dest.agency,
				dest.agencyModeFk,
				origin.futureAgency,
				origin.agencyModeFk futureAgencyModeFk,
				dest.lines,
				dest.liters,
				origin.futureLines - origin.hasStock AS notMovableLines,
				(origin.futureLines = origin.hasStock) AS isFullMovable,
                dest.zoneFk,
                origin.futureZoneFk,
                origin.futureZoneName,
				origin.classColor futureClassColor,
				dest.classColor,
				origin.clientFk futureClientFk,
				origin.addressFk futureAddressFk,
				origin.warehouseFk futureWarehouseFk,
				origin.companyFk futureCompanyFk,
				IFNULL(dest.nickname, origin.nickname) nickname,
				dest.landed,
				dest.preparation,
				origin.departmentFk,
				origin.saleClonedFk
			FROM (
				SELECT s.ticketFk,
						c.salesPersonFk workerFk,
						t.shipped,
						t.totalWithVat,
						st.name futureState,
						am.name futureAgency,
						count(s.id) futureLines,
						GROUP_CONCAT(DISTINCT ipt.code  ORDER BY ipt.code) futureIpt,
						CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters,
						SUM(s.quantity <= (IFNULL(il.stock,0) + IFNULL(im.amount, 0))) hasStock,
						z.id futureZoneFk,
						z.name futureZoneName,
						st.classColor,
						t.clientFk,
						t.nickname,
						t.addressFk,
						t.warehouseFk,
						t.companyFk,
						t.agencyModeFk,
						wd.departmentFk,
						sc.saleClonedFk
					FROM ticket t
						JOIN client c ON c.id = t.clientFk
						JOIN workerDepartment wd ON wd.workerFk = c.salesPersonFk
						JOIN sale s ON s.ticketFk = t.id
						LEFT JOIN saleCloned sc ON sc.saleClonedFk = s.id
						JOIN saleVolume sv ON sv.saleFk = s.id
						JOIN item i ON i.id = s.itemFk
						JOIN ticketState ts ON ts.ticketFk = t.id
						JOIN `state` st ON st.id = ts.stateFk
						JOIN agencyMode am ON t.agencyModeFk = am.id
						JOIN `zone` z ON t.zoneFk = z.id
						LEFT JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
						LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
						LEFT JOIN tmp.itemMinacum im ON im.itemFk = i.id
							AND im.warehouseFk = vWarehouseFk
						LEFT JOIN tmp.itemList il ON il.itemFk = i.id
					WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
						AND t.warehouseFk = vWarehouseFk
					GROUP BY t.id
				) origin
				LEFT JOIN (
					SELECT t.id ticketFk,
							st.name state,
							GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) ipt,
							t.shipped,
							t.totalWithVat,
							am.name agency,
							CAST(SUM(litros) AS DECIMAL(10,0)) liters,
							CAST(COUNT(*) AS DECIMAL(10,0)) `lines`,
							st.classColor,
							t.clientFk,
							t.nickname,
							t.addressFk,
							t.zoneFk,
							t.warehouseFk,
							t.companyFk,
							t.landed,
							t.agencyModeFk,
							SEC_TO_TIME(
							    COALESCE(HOUR(t.shipped), HOUR(zc.hour), HOUR(z.hour)) * 3600 + 
							    COALESCE(MINUTE(t.shipped), MINUTE(zc.hour), MINUTE(z.hour)) * 60
							) preparation
						FROM ticket t
							JOIN sale s ON s.ticketFk = t.id
							JOIN saleVolume sv ON sv.saleFk = s.id
							JOIN item i ON i.id = s.itemFk
							JOIN ticketState ts ON ts.ticketFk = t.id
							JOIN `state` st ON st.id = ts.stateFk
							JOIN agencyMode am ON t.agencyModeFk = am.id
							LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
							LEFT JOIN `zone` z ON z.id = t.zoneFk
							LEFT JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
							JOIN ticketCanAdvanceConfig tc
						WHERE t.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance)
							AND t.warehouseFk = vWarehouseFk
							AND st.order <= tc.destinationOrder
						GROUP BY t.id
				) dest ON dest.addressFk = origin.addressFk
			WHERE origin.hasStock;

    DROP TEMPORARY TABLE IF EXISTS
        tmp.itemList,
        tmp.itemMinacum;
END$$
DELIMITER ;
