DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_setState`(
	vSelf INT,
	vStateCode VARCHAR(255) COLLATE utf8_general_ci
)
BEGIN
/**
 * Modifica el estado de un ticket si se cumplen las condiciones necesarias.
 *
 * @param vSelf el id del ticket
 * @param vStateCode estado a modificar del ticket
 */
	DECLARE vticketAlertLevel INT;
	DECLARE vTicketStateCode VARCHAR(255);
	DECLARE vCanChangeState BOOL;
	DECLARE vPackedAlertLevel INT;
	DECLARE vZoneFk INT;

	SELECT s.alertLevel, s.`code`, t.zoneFk
		INTO vticketAlertLevel, vTicketStateCode,  vZoneFk
		FROM state s
			JOIN ticketTracking tt ON tt.stateFk = s.id
			JOIN ticket t ON t.id = tt.ticketFk
		WHERE tt.ticketFk = vSelf
		ORDER BY tt.created DESC
		LIMIT 1;

	SELECT id INTO vPackedAlertLevel FROM alertLevel WHERE code = 'PACKED'; 

	IF vStateCode = 'OK' AND vZoneFk IS NULL THEN
		CALL util.throw('ASSIGN_ZONE_FIRST');
	END IF;

	SET vCanChangeState = ((
			vStateCode <> 'ON_CHECKING' AND vStateCode <> 'CHECKED') OR 
			vticketAlertLevel < vPackedAlertLevel
		)AND NOT (
			vTicketStateCode IN ('CHECKED', 'CHECKING')
			AND vStateCode IN ('PREPARED', 'ON_PREPARATION')
		);

	IF vCanChangeState THEN
		INSERT INTO ticketTracking (stateFk, ticketFk, userFk)
			SELECT id, vSelf, account.myUser_getId()
				FROM state
				WHERE `code` = vStateCode COLLATE utf8_unicode_ci;
				
		IF vStateCode = 'PACKED' THEN
			CALL ticket_doCmr(vSelf);
		END IF;
	ELSE
		CALL util.throw('INCORRECT_TICKET_STATE');
	END IF;
	
END$$
DELIMITER ;