DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_GetVisible`(vWarehouse SMALLINT, vItem INT)
BEGIN
	DECLARE vTomorrow DATETIME DEFAULT TIMESTAMPADD(DAY, 1, util.VN_CURDATE());

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