From 2d3ae5ce9e2b8a9b40a540af826c99e1e115ab6f Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 11:19:21 +0100 Subject: [PATCH 1/2] feat: refs #8139 Added if is campaign --- .../procedures/workerTimeControl_clockIn.sql | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/db/routines/vn/procedures/workerTimeControl_clockIn.sql b/db/routines/vn/procedures/workerTimeControl_clockIn.sql index 522546918..e2549d415 100644 --- a/db/routines/vn/procedures/workerTimeControl_clockIn.sql +++ b/db/routines/vn/procedures/workerTimeControl_clockIn.sql @@ -1,13 +1,13 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`workerTimeControl_clockIn`( - vWorkerFk INT, - vTimed DATETIME, - vDirection VARCHAR(10), - vDevice VARCHAR(255) + vWorkerFk INT, + vTimed DATETIME, + vDirection VARCHAR(10), + vDevice VARCHAR(255) ) BEGIN /** -* Verifica si el empleado puede fichar +* Verifica si el empleado puede fichar, en caso de que sí ficha. * @param vWorkerFk Identificador del trabajador * @param vTimed Balor de la fichada, IF vTimed IS NULL vTimed = NOW * @param vDirection Solo se pueden pasa los valores del campo @@ -18,7 +18,6 @@ BEGIN * Solo retorna el primer problema, en caso de no ocurrir ningún error se añadirá * fichada a la tabla vn.workerTimeControl */ - DECLARE vLastIn DATETIME; DECLARE vLastOut DATETIME; DECLARE vNextIn DATETIME; @@ -40,6 +39,7 @@ BEGIN DECLARE vIsManual BOOLEAN DEFAULT TRUE; DECLARE vMaxWorkShortCycle INT; DECLARE vMaxWorkLongCycle INT; + DECLARE vIsCampaing BOOL; DECLARE EXIT HANDLER FOR SQLSTATE '45000' BEGIN @@ -75,11 +75,16 @@ BEGIN SET vDated = DATE(vTimed); + SELECT EXISTS ( + SELECT TRUE FROM campaign + WHERE vTimed BETWEEN dated - INTERVAL scopeDays DAY AND dated + ) INTO vIsCampaing; + SELECT IF(pc.code = 'driverCE', wc.dayBreakDriver, wc.dayBreak), wc.shortWeekBreak, - wc.longWeekBreak, + IF(vIsCampaing, NULL, wc.longWeekBreak), wc.weekScope, wc.dayMaxTime, wc.maxWorkShortCycle, @@ -97,19 +102,19 @@ BEGIN JOIN workerTimeControlConfig wc WHERE b.workerFk = vWorkerFk AND vDated BETWEEN b.started AND IFNULL(b.ended, vDated); - + -- CONTRATO EN VIGOR IF vDayBreak IS NULL THEN SET vErrorCode = 'INACTIVE_BUSINESS'; CALL util.throw(vErrorCode); END IF; - + -- FICHADAS A FUTURO IF vTimed > util.VN_NOW() + INTERVAL 1 MINUTE THEN SET vErrorCode = 'IS_NOT_ALLOWED_FUTURE'; CALL util.throw(vErrorCode); END IF; - + -- VERIFICAR SI ESTÁ PERMITIDO TRABAJAR CALL timeBusiness_calculateByWorker(vWorkerFk, vDated, vDated); SELECT isAllowedToWork INTO vIsAllowedToWork @@ -121,7 +126,6 @@ BEGIN CALL util.throw(vErrorCode); END IF; - -- DIRECCION CORRECTA CALL workerTimeControl_direction(vWorkerFk, vTimed); IF (SELECT @@ -138,8 +142,7 @@ BEGIN ) THEN SET vIsError = TRUE; END IF; - - + IF vIsError THEN SET vErrorCode = 'WRONG_DIRECTION'; IF(SELECT option1 IS NULL AND option2 IS NULL @@ -150,6 +153,7 @@ BEGIN CALL util.throw(vErrorCode); END IF; DROP TEMPORARY TABLE tmp.workerTimeControlDirection; + -- FICHADAS IMPARES SELECT timed INTO vLastIn FROM workerTimeControl @@ -158,7 +162,7 @@ BEGIN AND timed < vTimed ORDER BY timed DESC LIMIT 1; - + IF (SELECT IF(vDirection = 'in', MOD(COUNT(*), 2) , IF (vDirection = 'out', NOT MOD(COUNT(*), 2), FALSE)) @@ -169,7 +173,7 @@ BEGIN SET vErrorCode = 'ODD_WORKERTIMECONTROL'; CALL util.throw(vErrorCode); END IF; - + -- DESCANSO DIARIO SELECT timed INTO vLastOut FROM workerTimeControl @@ -178,7 +182,7 @@ BEGIN AND timed < vTimed ORDER BY timed DESC LIMIT 1; - + SELECT timed INTO vNextIn FROM workerTimeControl WHERE userFk = vWorkerFk @@ -186,7 +190,7 @@ BEGIN AND timed > vTimed ORDER BY timed ASC LIMIT 1; - + CASE vDirection WHEN 'in' THEN IF UNIX_TIMESTAMP(vTimed) - UNIX_TIMESTAMP(vLastOut) <= vDayBreak THEN @@ -204,11 +208,8 @@ BEGIN CALL util.throw(vErrorCode); END IF; - - IF (vDirection IN('in', 'out')) THEN -- VERIFICA MAXIMO TIEMPO DESDE ENTRADA HASTA LA SALIDA - SELECT timed INTO vNextOut FROM workerTimeControl WHERE userFk = vWorkerFk @@ -216,7 +217,7 @@ BEGIN AND timed > vTimed ORDER BY timed ASC LIMIT 1; - + SELECT direction INTO vNextDirection FROM workerTimeControl WHERE userFk = vWorkerFk @@ -224,7 +225,7 @@ BEGIN AND timed > vTimed ORDER BY timed ASC LIMIT 1; - + SELECT direction INTO vLastDirection FROM workerTimeControl WHERE userFk = vWorkerFk @@ -232,7 +233,7 @@ BEGIN AND timed < vTimed ORDER BY timed ASC LIMIT 1; - + IF (vDirection ='in' AND vNextDirection = 'out' AND UNIX_TIMESTAMP(vNextOut) - UNIX_TIMESTAMP(vTimed) > vDayMaxTime) OR @@ -242,9 +243,8 @@ BEGIN SET vErrorCode = 'DAY_MAX_TIME'; CALL util.throw(vErrorCode); END IF; - + -- VERIFICA DESCANSO SEMANAL - WITH wtc AS( (SELECT timed FROM vn.workerTimeControl @@ -271,7 +271,7 @@ BEGIN LEAD(hasLongBreak) OVER (ORDER BY timed) nextHasLongBreak FROM wtcBreak )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))) hasError INTO vIsError FROM wtcBreakCounter @@ -290,6 +290,5 @@ BEGIN VALUES(vWorkerFk, vTimed, vDirection, vDevice, vIsManual); SELECT LAST_INSERT_ID() id; - END$$ DELIMITER ; -- 2.40.1 From 9768ce658fc5c0e5588de6103f20927a8cef5190 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 22 Nov 2024 11:27:10 +0100 Subject: [PATCH 2/2] feat: refs #8139 Added if is campaign --- .../vn/procedures/workerTimeControl_clockIn.sql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/db/routines/vn/procedures/workerTimeControl_clockIn.sql b/db/routines/vn/procedures/workerTimeControl_clockIn.sql index e2549d415..29edc903c 100644 --- a/db/routines/vn/procedures/workerTimeControl_clockIn.sql +++ b/db/routines/vn/procedures/workerTimeControl_clockIn.sql @@ -75,16 +75,11 @@ BEGIN SET vDated = DATE(vTimed); - SELECT EXISTS ( - SELECT TRUE FROM campaign - WHERE vTimed BETWEEN dated - INTERVAL scopeDays DAY AND dated - ) INTO vIsCampaing; - SELECT IF(pc.code = 'driverCE', wc.dayBreakDriver, wc.dayBreak), wc.shortWeekBreak, - IF(vIsCampaing, NULL, wc.longWeekBreak), + wc.longWeekBreak, wc.weekScope, wc.dayMaxTime, wc.maxWorkShortCycle, @@ -244,6 +239,11 @@ BEGIN CALL util.throw(vErrorCode); END IF; + SELECT EXISTS ( + SELECT id FROM campaign + WHERE vTimed BETWEEN dated - INTERVAL scopeDays DAY AND dated + ) INTO vIsCampaing; + -- VERIFICA DESCANSO SEMANAL WITH wtc AS( (SELECT timed @@ -262,7 +262,7 @@ BEGIN ), wtcBreak AS( SELECT timed, IF(IFNULL(gap, 0) > vShortWeekBreak, TRUE, FALSE) hasShortBreak, - IF(IFNULL(gap, 0) > vLongWeekBreak, TRUE, FALSE) hasLongBreak + IF(IFNULL(gap, 0) > vLongWeekBreak AND NOT vIsCampaing, TRUE, FALSE) hasLongBreak FROM wtcGap ORDER BY timed ), wtcBreakCounter AS( -- 2.40.1