feat: refs #8139 Added if is campaign #3206

Open
guillermo wants to merge 5 commits from 8139-clockInCampaign into dev
1 changed files with 49 additions and 42 deletions

View File

@ -1,13 +1,13 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`workerTimeControl_clockIn`( CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`workerTimeControl_clockIn`(
vWorkerFk INT, vWorkerFk INT,
vTimed DATETIME, vTimed DATETIME,
vDirection VARCHAR(10), vDirection VARCHAR(10),
vDevice VARCHAR(255) vDevice VARCHAR(255)
) )
BEGIN BEGIN
/** /**
* Verifica si el empleado puede fichar * Verifica si el empleado puede fichar, en caso de que ficha.
* @param vWorkerFk Identificador del trabajador * @param vWorkerFk Identificador del trabajador
* @param vTimed Balor de la fichada, IF vTimed IS NULL vTimed = NOW * @param vTimed Balor de la fichada, IF vTimed IS NULL vTimed = NOW
* @param vDirection Solo se pueden pasa los valores del campo * @param vDirection Solo se pueden pasa los valores del campo
@ -18,14 +18,13 @@ BEGIN
* Solo retorna el primer problema, en caso de no ocurrir ningún error se añadirá * Solo retorna el primer problema, en caso de no ocurrir ningún error se añadirá
* fichada a la tabla vn.workerTimeControl * fichada a la tabla vn.workerTimeControl
*/ */
DECLARE vLastIn DATETIME; DECLARE vLastIn DATETIME;
DECLARE vLastOut DATETIME; DECLARE vLastOut DATETIME;
DECLARE vNextIn DATETIME; DECLARE vNextIn DATETIME;
DECLARE vNextOut DATETIME; DECLARE vNextOut DATETIME;
DECLARE vNextDirection ENUM('in', 'out'); DECLARE vNextDirection ENUM('in', 'out');
DECLARE vLastDirection ENUM('in', 'out'); DECLARE vLastDirection ENUM('in', 'out');
DECLARE vDayMaxTime INTEGER; DECLARE vDayMaxTime INTEGER;
DECLARE vDayBreak INT; DECLARE vDayBreak INT;
DECLARE vShortWeekBreak INT; DECLARE vShortWeekBreak INT;
DECLARE vLongWeekBreak INT; DECLARE vLongWeekBreak INT;
@ -40,6 +39,7 @@ BEGIN
DECLARE vIsManual BOOLEAN DEFAULT TRUE; DECLARE vIsManual BOOLEAN DEFAULT TRUE;
DECLARE vMaxWorkShortCycle INT; DECLARE vMaxWorkShortCycle INT;
DECLARE vMaxWorkLongCycle INT; DECLARE vMaxWorkLongCycle INT;
DECLARE vIsCampaing BOOL;
DECLARE EXIT HANDLER FOR SQLSTATE '45000' DECLARE EXIT HANDLER FOR SQLSTATE '45000'
BEGIN BEGIN
@ -52,7 +52,7 @@ BEGIN
WHERE w.id = vWorkerFk; WHERE w.id = vWorkerFk;
SELECT `description` INTO vErrorMessage SELECT `description` INTO vErrorMessage
FROM workerTimeControlError FROM workerTimeControlError
WHERE `code` = vErrorCode; WHERE `code` = vErrorCode;
IF vErrorMessage IS NULL THEN IF vErrorMessage IS NULL THEN
@ -64,7 +64,7 @@ BEGIN
' no ha podido fichar por el siguiente problema: ', ' no ha podido fichar por el siguiente problema: ',
vErrorMessage) vErrorMessage)
INTO vErrorMessage; INTO vErrorMessage;
CALL mail_insert( vMailTo, vMailTo, 'Error al fichar', vErrorMessage); CALL mail_insert( vMailTo, vMailTo, 'Error al fichar', vErrorMessage);
END; END;
@ -97,19 +97,32 @@ BEGIN
JOIN workerTimeControlConfig wc JOIN workerTimeControlConfig wc
WHERE b.workerFk = vWorkerFk WHERE b.workerFk = vWorkerFk
AND vDated BETWEEN b.started AND IFNULL(b.ended, vDated); AND vDated BETWEEN b.started AND IFNULL(b.ended, vDated);
SELECT EXISTS (
SELECT id FROM campaign
WHERE vTimed BETWEEN dated - INTERVAL scopeDays DAY
AND dated + INTERVAL vLongWeekBreak SECOND
) INTO vIsCampaing;
IF vIsCampaing THEN
SET vWeekScope = vWeekScope * 2;
ELSE
SET vLongWeekBreak = vShortWeekBreak,
vMaxWorkLongCycle = vMaxWorkShortCycle;
END IF;
-- CONTRATO EN VIGOR -- CONTRATO EN VIGOR
IF vDayBreak IS NULL THEN IF vDayBreak IS NULL THEN
SET vErrorCode = 'INACTIVE_BUSINESS'; SET vErrorCode = 'INACTIVE_BUSINESS';
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
-- FICHADAS A FUTURO -- FICHADAS A FUTURO
IF vTimed > util.VN_NOW() + INTERVAL 1 MINUTE THEN IF vTimed > util.VN_NOW() + INTERVAL 1 MINUTE THEN
SET vErrorCode = 'IS_NOT_ALLOWED_FUTURE'; SET vErrorCode = 'IS_NOT_ALLOWED_FUTURE';
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
-- VERIFICAR SI ESTÁ PERMITIDO TRABAJAR -- VERIFICAR SI ESTÁ PERMITIDO TRABAJAR
CALL timeBusiness_calculateByWorker(vWorkerFk, vDated, vDated); CALL timeBusiness_calculateByWorker(vWorkerFk, vDated, vDated);
SELECT isAllowedToWork INTO vIsAllowedToWork SELECT isAllowedToWork INTO vIsAllowedToWork
@ -121,7 +134,6 @@ BEGIN
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
-- DIRECCION CORRECTA -- DIRECCION CORRECTA
CALL workerTimeControl_direction(vWorkerFk, vTimed); CALL workerTimeControl_direction(vWorkerFk, vTimed);
IF (SELECT IF (SELECT
@ -138,18 +150,18 @@ BEGIN
) THEN ) THEN
SET vIsError = TRUE; SET vIsError = TRUE;
END IF; END IF;
IF vIsError THEN IF vIsError THEN
SET vErrorCode = 'WRONG_DIRECTION'; SET vErrorCode = 'WRONG_DIRECTION';
IF(SELECT option1 IS NULL AND option2 IS NULL IF(SELECT option1 IS NULL AND option2 IS NULL
FROM tmp.workerTimeControlDirection) THEN FROM tmp.workerTimeControlDirection) THEN
SET vErrorCode = 'DAY_MAX_TIME'; SET vErrorCode = 'DAY_MAX_TIME';
END IF; END IF;
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
DROP TEMPORARY TABLE tmp.workerTimeControlDirection; DROP TEMPORARY TABLE tmp.workerTimeControlDirection;
-- FICHADAS IMPARES -- FICHADAS IMPARES
SELECT timed INTO vLastIn SELECT timed INTO vLastIn
FROM workerTimeControl FROM workerTimeControl
@ -158,7 +170,7 @@ BEGIN
AND timed < vTimed AND timed < vTimed
ORDER BY timed DESC ORDER BY timed DESC
LIMIT 1; LIMIT 1;
IF (SELECT IF(vDirection = 'in', IF (SELECT IF(vDirection = 'in',
MOD(COUNT(*), 2) , MOD(COUNT(*), 2) ,
IF (vDirection = 'out', NOT MOD(COUNT(*), 2), FALSE)) IF (vDirection = 'out', NOT MOD(COUNT(*), 2), FALSE))
@ -169,7 +181,7 @@ BEGIN
SET vErrorCode = 'ODD_WORKERTIMECONTROL'; SET vErrorCode = 'ODD_WORKERTIMECONTROL';
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
-- DESCANSO DIARIO -- DESCANSO DIARIO
SELECT timed INTO vLastOut SELECT timed INTO vLastOut
FROM workerTimeControl FROM workerTimeControl
@ -178,7 +190,7 @@ BEGIN
AND timed < vTimed AND timed < vTimed
ORDER BY timed DESC ORDER BY timed DESC
LIMIT 1; LIMIT 1;
SELECT timed INTO vNextIn SELECT timed INTO vNextIn
FROM workerTimeControl FROM workerTimeControl
WHERE userFk = vWorkerFk WHERE userFk = vWorkerFk
@ -186,7 +198,7 @@ BEGIN
AND timed > vTimed AND timed > vTimed
ORDER BY timed ASC ORDER BY timed ASC
LIMIT 1; LIMIT 1;
CASE vDirection CASE vDirection
WHEN 'in' THEN WHEN 'in' THEN
IF UNIX_TIMESTAMP(vTimed) - UNIX_TIMESTAMP(vLastOut) <= vDayBreak THEN IF UNIX_TIMESTAMP(vTimed) - UNIX_TIMESTAMP(vLastOut) <= vDayBreak THEN
@ -204,11 +216,8 @@ BEGIN
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
IF (vDirection IN('in', 'out')) THEN IF (vDirection IN('in', 'out')) THEN
-- VERIFICA MAXIMO TIEMPO DESDE ENTRADA HASTA LA SALIDA -- VERIFICA MAXIMO TIEMPO DESDE ENTRADA HASTA LA SALIDA
SELECT timed INTO vNextOut SELECT timed INTO vNextOut
FROM workerTimeControl FROM workerTimeControl
WHERE userFk = vWorkerFk WHERE userFk = vWorkerFk
@ -216,7 +225,7 @@ BEGIN
AND timed > vTimed AND timed > vTimed
ORDER BY timed ASC ORDER BY timed ASC
LIMIT 1; LIMIT 1;
SELECT direction INTO vNextDirection SELECT direction INTO vNextDirection
FROM workerTimeControl FROM workerTimeControl
WHERE userFk = vWorkerFk WHERE userFk = vWorkerFk
@ -224,7 +233,7 @@ BEGIN
AND timed > vTimed AND timed > vTimed
ORDER BY timed ASC ORDER BY timed ASC
LIMIT 1; LIMIT 1;
SELECT direction INTO vLastDirection SELECT direction INTO vLastDirection
FROM workerTimeControl FROM workerTimeControl
WHERE userFk = vWorkerFk WHERE userFk = vWorkerFk
@ -232,34 +241,33 @@ BEGIN
AND timed < vTimed AND timed < vTimed
ORDER BY timed ASC ORDER BY timed ASC
LIMIT 1; LIMIT 1;
IF (vDirection ='in' IF (vDirection ='in'
AND vNextDirection = 'out' AND vNextDirection = 'out'
AND UNIX_TIMESTAMP(vNextOut) - UNIX_TIMESTAMP(vTimed) > vDayMaxTime) OR AND UNIX_TIMESTAMP(vNextOut) - UNIX_TIMESTAMP(vTimed) > vDayMaxTime) OR
(vDirection ='out' (vDirection ='out'
AND vLastDirection = 'in' AND vLastDirection = 'in'
AND UNIX_TIMESTAMP(vTimed) -UNIX_TIMESTAMP(vLastIn) > vDayMaxTime) THEN AND UNIX_TIMESTAMP(vTimed) -UNIX_TIMESTAMP(vLastIn) > vDayMaxTime) THEN
SET vErrorCode = 'DAY_MAX_TIME'; SET vErrorCode = 'DAY_MAX_TIME';
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
-- VERIFICA DESCANSO SEMANAL -- VERIFICA DESCANSO SEMANAL
WITH wtc AS( WITH wtc AS(
(SELECT timed (SELECT timed
FROM vn.workerTimeControl FROM vn.workerTimeControl
WHERE userFk = vWorkerFk WHERE userFk = vWorkerFk
AND direction IN ('in', 'out') AND direction IN ('in', 'out')
AND timed BETWEEN vTimed - INTERVAL (vWeekScope * 2) SECOND AND timed BETWEEN vTimed - INTERVAL vWeekScope SECOND
AND vTimed + INTERVAL (vWeekScope * 2) SECOND ) AND vTimed + INTERVAL vWeekScope SECOND)
UNION UNION
(SELECT vTimed) (SELECT vTimed)
), wtcGap AS( ), wtcGap AS(
SELECT timed, SELECT timed,
TIMESTAMPDIFF(SECOND, LAG(timed) OVER (ORDER BY timed), timed) gap TIMESTAMPDIFF(SECOND, LAG(timed) OVER (ORDER BY timed), timed) gap
FROM wtc FROM wtc
ORDER BY timed ORDER BY timed
), wtcBreak AS( ), wtcBreak AS(
SELECT timed, SELECT timed,
IF(IFNULL(gap, 0) > vShortWeekBreak, TRUE, FALSE) hasShortBreak, IF(IFNULL(gap, 0) > vShortWeekBreak, TRUE, FALSE) hasShortBreak,
IF(IFNULL(gap, 0) > vLongWeekBreak, TRUE, FALSE) hasLongBreak IF(IFNULL(gap, 0) > vLongWeekBreak, TRUE, FALSE) hasLongBreak
@ -270,8 +278,8 @@ BEGIN
SUM(hasShortBreak) OVER (ORDER BY timed) breakCounter , SUM(hasShortBreak) OVER (ORDER BY timed) breakCounter ,
LEAD(hasLongBreak) OVER (ORDER BY timed) nextHasLongBreak LEAD(hasLongBreak) OVER (ORDER BY timed) nextHasLongBreak
FROM wtcBreak FROM wtcBreak
)SELECT TIMESTAMPDIFF(SECOND, MIN(timed), MAX(timed)) > vMaxWorkLongCycle OR )SELECT TIMESTAMPDIFF(SECOND, MIN(timed), MAX(timed)) > vMaxWorkLongCycle OR
(TIMESTAMPDIFF(SECOND, MIN(timed), MAX(timed))> vMaxWorkShortCycle (TIMESTAMPDIFF(SECOND, MIN(timed), MAX(timed)) > vMaxWorkShortCycle
AND NOT SUM(IFNULL(nextHasLongBreak, 1))) AND NOT SUM(IFNULL(nextHasLongBreak, 1)))
hasError INTO vIsError hasError INTO vIsError
FROM wtcBreakCounter FROM wtcBreakCounter
@ -290,6 +298,5 @@ BEGIN
VALUES(vWorkerFk, vTimed, vDirection, vDevice, vIsManual); VALUES(vWorkerFk, vTimed, vDirection, vDevice, vIsManual);
SELECT LAST_INSERT_ID() id; SELECT LAST_INSERT_ID() id;
END$$ END$$
DELIMITER ; DELIMITER ;