DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getVisible`(
	vWarehouseFk INT,
	vDated INT,
	vItemFk INT
)
BEGIN
/**
 * Calcula el visible de un artículo o de todos.
 *
 * @param vWarehouse Warehouse id
 * @param vDated Max date to filter
 * @param vItemFk Item id
 * @param tmp.itemVisible(item_id, stock, visible)
 */
	DECLARE vTomorrow DATETIME DEFAULT vDated + INTERVAL 1 DAY;

	INSERT INTO tmp.itemVisible (item_id, visible)
		SELECT itemFk, SUM(quantity)
			FROM (
				SELECT i.itemFk, i.quantity
					FROM itemTicketOut i
						LEFT JOIN ticketState ts ON ts.ticketFk = i.ticketFk
							JOIN `state` s ON s.id = ts.stateFk
						LEFT JOIN (
							SELECT DISTINCT st.saleFk
								FROM saleTracking st
									JOIN state s ON s.id = st.stateFk
								WHERE st.created > vDated
									AND (s.isPicked OR st.isChecked)
						) stPrevious ON `stPrevious`.`saleFk` = i.saleFk
					WHERE i.warehouseFk = vWarehouseFk
						AND (vItemFk IS NULL OR i.itemFk = vItemFk)
						AND (s.isPicked OR i.reserved OR stPrevious.saleFk)
						AND i.shipped >= vDated AND i.shipped < vTomorrow
				UNION ALL
				SELECT itemFk, quantity
					FROM itemEntryIn
					WHERE isReceived
						AND landed >= vDated AND landed < vTomorrow
						AND warehouseInFk = vWarehouseFk
						AND (vItemFk IS NULL OR itemFk = vItemFk)
						AND NOT isVirtualStock
				UNION ALL
				SELECT itemFk, quantity
					FROM itemEntryOut
					WHERE isDelivered
						AND shipped >= vDated
						AND shipped < vTomorrow
						AND warehouseOutFk = vWarehouseFk
						AND (vItemFk IS NULL OR itemFk = vItemFk)
					) t
			GROUP BY itemFk
			ON DUPLICATE KEY UPDATE
				visible = IFNULL(stock, 0) + VALUES(visible);
END$$
DELIMITER ;
