DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_calcVisible`(
	vSelf INT,
	vWarehouseFk INT
)
BEGIN
/**
 * Calcula el visible de un artículo o de todos.
 *
 * @param vWarehouse Warehouse id
 * @param vSelf Item id
 * @param tmp.itemVisible(item_id, stock, visible)
 */
 	DECLARE vDated DATE DEFAULT util.VN_CURDATE();
	DECLARE vTomorrow DATETIME DEFAULT util.tomorrow();

	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 IFNULL(vWarehouseFk, i.warehouseFk) = i.warehouseFk
						AND (vSelf IS NULL OR i.itemFk = vSelf)
						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 IFNULL(vWarehouseFk, warehouseInFk) = warehouseInFk
						AND (vSelf IS NULL OR itemFk = vSelf)
						AND NOT isVirtualStock
				UNION ALL
				SELECT itemFk, quantity
					FROM itemEntryOut
					WHERE isDelivered
						AND shipped >= vDated
						AND shipped < vTomorrow
						AND IFNULL(vWarehouseFk, warehouseOutFk) = warehouseOutFk
						AND (vSelf IS NULL OR itemFk = vSelf)
					) t
			GROUP BY itemFk
			ON DUPLICATE KEY UPDATE
				visible = IFNULL(stock, 0) + VALUES(visible);
END$$
DELIMITER ;
