DROP PROCEDURE IF EXISTS vn.item_getLack;

DELIMITER $$
$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getLack`(
    IN vForce BOOLEAN DEFAULT TRUE,
    IN vDays INT DEFAULT 2,
    IN vCustomWhere TEXT,
    )

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
 * @param vSearch Filtro items
**/

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


	SET @sqlQuery = CONCAT(`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
		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
		WHERE w.isForTicket
			AND ic.display
			AND it.code != 'GEN'
			AND `,vCustomWhere,`
		GROUP BY i.id, w.id
		HAVING lack < 0;`);
        CALL `exec`(@sqlQuery);

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