USE `vn`;
DROP procedure IF EXISTS `zone_doCalcInitialize`;

DELIMITER $$
USE `vn`$$
CREATE DEFINER=`root`@`%` PROCEDURE `zone_doCalcInitialize`()
proc: BEGIN
/**
 * Initialize ticket
 */
	DECLARE vDone BOOL;
	DECLARE vTicketFk INT;
    DECLARE vLanded DATE;
	DECLARE vZoneFk INT;

	DECLARE cCur CURSOR FOR
		SELECT t.id, t.landed, t.zoneFk
			FROM ticket t
			WHERE (zonePrice IS NULL OR zoneBonus IS NULL OR zoneClosure IS NULL)
				AND landed >= '2019-01-01' AND shipped >= '2019-01-01'
			GROUP BY landed, zoneFk;

	DECLARE CONTINUE HANDLER FOR NOT FOUND
		SET vDone = TRUE;

	OPEN cCur;

	myLoop: LOOP
		SET vDone = FALSE;
		FETCH cCur INTO vTicketFk, vLanded, vZoneFk;

		IF vDone THEN
			LEAVE myLoop;
		END IF;

		DROP TEMPORARY TABLE IF EXISTS tmp.zone;
		CREATE TEMPORARY TABLE tmp.zone
			(INDEX (id))
			ENGINE = MEMORY
			SELECT vZoneFk id;

		CALL zone_getOptionsForLanding(vLanded, TRUE);

		UPDATE ticket t
				LEFT JOIN tmp.zoneOption zo ON TRUE
			SET zonePrice = zo.price, zoneBonus = zo.bonus, zoneClosure = zo.`hour`
            WHERE t.zoneFk = vZoneFk AND landed = vLanded;

		UPDATE ticket t
				LEFT JOIN vn.zone z ON z.id = t.zoneFk
			SET zonePrice = z.price, zoneBonus = z.bonus, zoneClosure = z.`hour`
            WHERE t.zonePrice IS NULL AND z.id = vZoneFk 
				AND landed >= '2019-01-01' AND shipped >= '2019-01-01';

	END LOOP;

	CLOSE cCur;
    		
	DELETE FROM zoneCalcTicket;
END$$

DELIMITER ;