DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`inventoryDiscrepancyDetail_replace`()
BEGIN
/**
 *  Replace all records in table inventoryDiscrepancyDetail and insert new
 *	records into inventoryDiscrepancy for all inventory warehouses.
 */
	DECLARE vDone INT DEFAULT FALSE;
	DECLARE vCalc INT;
	DECLARE vWarehouseFk INT;

	DECLARE cWarehouses CURSOR FOR 
		SELECT id
			FROM vn.warehouse
			WHERE isInventory;

	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;

	TRUNCATE TABLE inventoryDiscrepancyDetail;

	OPEN cWarehouses;
	read_loop: LOOP
		SET vDone = FALSE;
		FETCH cWarehouses INTO vWarehouseFk;
	
		IF vDone THEN
			LEAVE read_loop;
		END IF;
	
		CALL cache.visible_refresh(vCalc, FALSE, vWarehouseFk);
	
		CREATE OR REPLACE TEMPORARY TABLE tVisible
			SELECT itemFk, SUM(visible) totalVisible
				FROM vn.itemShelving ish
					JOIN vn.shelving sh ON sh.code = ish.shelvingFk
					JOIN vn.parking p ON p.id = sh.parkingFk
					JOIN vn.sector sc ON sc.id = p.sectorFk
					WHERE sc.warehouseFk = vWarehouseFk
				GROUP BY itemFk;
		
		INSERT INTO inventoryDiscrepancyDetail(
				warehouseFk,
				itemFk,
				theorical,
				visible,
				notPicked,
				alert)
			SELECT vWarehouseFk warehouseFk,
					v.item_id itemFk,
					v.visible,
					tv.totalVisible,
					s.notPicked,
				CASE
					WHEN s.notPicked > IFNULL(tv.totalVisible, 0) THEN 0
					WHEN v.visible > IFNULL((tv.totalVisible * 2), 0) THEN 1
					WHEN v.visible > tv.totalVisible THEN 2
					ELSE 3
				END alert
				FROM cache.visible v
					LEFT JOIN tVisible tv ON tv.itemFk = v.item_id
					JOIN (
						SELECT s.itemFk, SUM(s.quantity) notPicked
							FROM vn.sale s
								JOIN vn.ticket t ON t.id = s.ticketFk
								JOIN vn.ticketState ts ON ts.ticketFk = t.id
								JOIN vn.alertLevel al ON al.id = ts.alertLevel
							WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE())
								AND s.isPicked = FALSE
								AND al.code = 'FREE'
								AND  t.warehouseFk = vWarehouseFk
							GROUP BY s.itemFk
							HAVING notPicked
					) s ON s.itemFk = v.item_id
				WHERE v.calc_id = vCalc
					AND NOT v.visible <=> tv.totalVisible;

	END LOOP;
	CLOSE cWarehouses;

	INSERT INTO inventoryDiscrepancy(
			warehouseFk,
			alert,
			quantity)
		SELECT warehouseFk,
				alert,
				COUNT(*)
			FROM inventoryDiscrepancyDetail
			GROUP BY warehouseFk, alert;

	DROP TEMPORARY TABLE IF EXISTS tVisible;
END$$
DELIMITER ;