DROP PROCEDURE IF EXISTS `vn`.`ticket_canAdvance`;

DELIMITER $$
$$
CREATE DEFINER=`root`@`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
 */

	DECLARE vDateInventory DATE;
	DECLARE vDateToAdvance DATE;

	SELECT inventoried INTO vDateInventory FROM vn.config;

    -- SET vDateToAdvance = TIMESTAMPADD(DAY,-1,vDateFuture);

	DROP TEMPORARY TABLE IF EXISTS tmp.stock;
	CREATE TEMPORARY TABLE tmp.stock
		(itemFk INT PRIMARY KEY,
		amount INT)
		ENGINE = MEMORY;

	INSERT INTO tmp.stock(itemFk, amount)
		SELECT itemFk, SUM(quantity) amount FROM
		(
			SELECT itemFk, quantity
				FROM vn.itemTicketOut
				WHERE shipped >= vDateInventory
					AND shipped < vDateFuture
					AND warehouseFk = vWarehouseFk
			UNION ALL
			SELECT itemFk, quantity
				FROM vn.itemEntryIn
				WHERE landed >= vDateInventory
					AND landed < vDateFuture
					AND isVirtualStock = FALSE
					AND warehouseInFk = vWarehouseFk
			UNION ALL
			SELECT itemFk, quantity
				FROM vn.itemEntryOut
				WHERE shipped >= vDateInventory
					AND shipped < vDateFuture
					AND warehouseOutFk = vWarehouseFk
		) t
		GROUP BY itemFk HAVING amount != 0;

	DROP TEMPORARY TABLE IF EXISTS tmp.filter;
	CREATE TEMPORARY TABLE tmp.filter
        (INDEX (id))
	SELECT s.ticketFk ticketFuture,
			sum((s.quantity <= IFNULL(st.amount,0))) hasStock,
			count(DISTINCT s.id) saleCount,
			st.name tfState,
			GROUP_CONCAT(DISTINCT ipt.code  ORDER BY ipt.code) tfIpt,
			t2.ticketFk id,
			t2.state,
			t2.ipt,
			t.workerFk,
			CAST(sum(litros) AS DECIMAL(10,0)) liters,
			CAST(count(*) AS DECIMAL(10,0)) `lines`,
			t2.shipped,
			t.shipped tfShipped,
			t2.totalWithVat,
			t.totalWithVat tfTotalWithVat
		FROM vn.ticket t
			JOIN vn.ticketState ts ON ts.ticketFk = t.id
			JOIN vn.state st ON st.id = ts.stateFk
			JOIN vn.saleVolume sv ON t.id = sv.ticketFk
			JOIN (SELECT
							t2.id ticketFk,
							t2.addressFk,
							st.name state,
							GROUP_CONCAT(DISTINCT ipt.code  ORDER BY ipt.code) ipt,
							t2.shipped,
							t2.totalWithVat
						FROM vn.ticket t2
							JOIN vn.sale s ON s.ticketFk = t2.id
							JOIN vn.item i ON i.id = s.itemFk
							JOIN vn.ticketState ts ON ts.ticketFk = t2.id
							JOIN vn.state st ON st.id = ts.stateFk
							LEFT JOIN vn.itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
						WHERE t2.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance)
							AND t2.warehouseFk = vWarehouseFk
						GROUP BY t2.id) t2 ON t2.addressFk = t.addressFk
			JOIN vn.sale s ON s.ticketFk = t.id
			JOIN vn.item i ON i.id = s.itemFk
			LEFT JOIN vn.itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
			LEFT JOIN tmp.stock st ON st.itemFk = s.itemFk
		WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
			AND t.warehouseFk = vWarehouseFk
		GROUP BY t.id;

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

INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
VALUES
    ('Ticket', 'getTicketsAdvance', 'READ', 'ALLOW', 'ROLE', 'employee');
