57 lines
1.5 KiB
SQL
57 lines
1.5 KiB
SQL
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 ;
|