DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getAtp`(vDated DATE)
BEGIN
/**
 * Calcula el valor mínimo acumulado para cada artículo ordenado por fecha y
 * almacén.
 *
 * @param vDated Si no hay movimientos en la fecha indicada, debe devolver 0
 * @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity)
 * @return tmp.itemAtp(itemFk, warehouseFk, quantity)
 */
	CREATE OR REPLACE TEMPORARY TABLE tItemOrdered
		(UNIQUE(itemFk, warehouseFk, dated))
		ENGINE = MEMORY
		SELECT itemFk, warehouseFk, dated, SUM(quantity) quantity
			FROM (
				SELECT itemFk, warehouseFk, dated, quantity
					FROM tmp.itemCalc
				UNION ALL
				SELECT itemFk, warehouseFk, vDated, 0
					FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2
			) t1
			GROUP BY itemFk, warehouseFk, dated
			ORDER BY itemFk, warehouseFk, dated;

	SET @lastItemFk := 0;
	SET @lastWareHouseFk := 0;
	SET @lastQuantity := 0;

	CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp
		(INDEX (itemFk, wareHouseFk))
		SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity
			FROM (
				SELECT
					itemFk,
					IF(itemFk <> @lastItemFk OR wareHouseFk <> @lastWareHouseFk,
						@lastQuantity := quantity,
						@lastQuantity := @lastQuantity + quantity) quantityAccumulated,
					wareHouseFk,
					@lastItemFk := itemFk,
					@lastWareHouseFk := wareHouseFk
				FROM tItemOrdered
			)sub
			GROUP BY itemFk, wareHouseFk;

	DROP TEMPORARY TABLE tItemOrdered;
END$$
DELIMITER ;