DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getLack`(
	vSelf INT,
    vForce BOOLEAN,
    vDays INT,
    vLongname VARCHAR(255),
    vProducerName VARCHAR(255),
    vColor VARCHAR(255),
    vSize INT,
    vOrigen INT,
    vLack INT,
    vWarehouseFk INT
    )
BEGIN
/**
 * Calcula una tabla con el máximo negativo visible para cada producto y almacen
 *
 * @param vForce Fuerza el recalculo del stock
 * @param vDays Numero de dias a considerar
**/

	CALL `cache`.stock_refresh(vForce);
	CALL item_getMinacum(NULL, util.VN_CURDATE(), vDays, NULL);
	CALL item_getMinETD();
	CALL item_zoneClosure();

	SELECT i.id itemFk,
			i.longName,
			w.id warehouseFk,
			p.`name` producer,
			i.`size`,
			i.category,
			w.name warehouse,
			SUM(IFNULL(sub.amount,0)) lack,
			i.inkFk,
			IFNULL(im.timed, util.midnight()) timed,
			IFNULL(izc.timed, util.midnight()) minTimed,
			o.name originFk
		FROM (SELECT item_id,
						warehouse_id,
						amount
					FROM cache.stock
					WHERE amount > 0
				UNION ALL
				SELECT itemFk,
						warehouseFk,
						amount
					FROM tmp.itemMinacum
			) sub
			JOIN warehouse w ON w.id = sub.warehouse_id
			JOIN item i ON i.id = sub.item_id
			LEFT JOIN producer p ON p.id = i.producerFk
			JOIN itemType it ON it.id = i.typeFk
			JOIN itemCategory ic ON ic.id = it.categoryFk
			LEFT JOIN tmp.itemMinETD im ON im.itemFk = i.id
			LEFT JOIN tmp.itemZoneClosure izc ON izc.itemFk = i.id
			JOIN origin o ON o.id = i.originFk
		WHERE w.isForTicket
			AND ic.display
			AND it.code != 'GEN'
            AND (vSelf IS NULL OR i.id = vSelf)
			AND (vLongname IS NULL OR i.name = vLongname)
			AND (vProducerName IS NULL OR p.`name` LIKE CONCAT('%', vProducerName, '%'))
			AND (vColor IS NULL OR vColor = i.inkFk)
			AND (vSize IS NULL OR vSize = i.`size`)
			AND (vOrigen IS NULL OR vOrigen = w.id)
			AND (vLack IS NULL OR vLack = sub.amount)
			AND (vWarehouseFk IS NULL OR vWarehouseFk = w.id)
		GROUP BY i.id, w.id
		HAVING lack < 0;

	DROP TEMPORARY TABLE tmp.itemMinacum;
	DROP TEMPORARY TABLE tmp.itemMinETD;
	DROP TEMPORARY TABLE tmp.itemZoneClosure;
END$$
DELIMITER ;
