salix/db/routines/vn/procedures/workerTimeControl_getClockI...

79 lines
2.9 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`workerTimeControl_getClockIn`(
vUserFk INT,
vDated DATE)
BEGIN
/**
* Muestra una tabla con los 7 días inmediatamente anteriores a la fecha proporcionada
* y las fichadas de cada día, en columnas por día
* @param vUserFk Identificador del trabajador
* @param vDated Fecha proporcionada
*/
CALL timeControl_calculateByWorker(
vUserFk,
DATE_SUB(vDated, INTERVAL 6 DAY), util.dayEnd(vDated));
SET @position := 0;
SET @lastDated := NULL;
SELECT *
FROM( SELECT MAX(6daysAgo) 6daysAgo,
MAX(6daysAgoDirection) 6daysAgoDirection,
MAX(5daysAgo) 5daysAgo,
MAX(5daysAgoDirection) 5daysAgoDirection,
MAX(4daysAgo) 4daysAgo,
MAX(4daysAgoDirection) 4daysAgoDirection,
MAX(3daysAgo) 3daysAgo,
MAX(3daysAgoDirection) 3daysAgoDirection,
MAX(2daysAgo) 2daysAgo,
MAX(2daysAgoDirection) 2daysAgoDirection,
MAX(1daysAgo) 1daysAgo,
MAX(1daysAgoDirection) 1daysAgoDirection,
MAX(0daysAgo) 0daysAgo,
MAX(0daysAgoDirection) 0daysAgoDirection
FROM(SELECT IF(daysAgo = 6, timed, '') 6daysAgo,
IF(daysAgo = 5, timed, '') 5daysAgo,
IF(daysAgo = 4, timed, '') 4daysAgo,
IF(daysAgo = 3, timed, '') 3daysAgo,
IF(daysAgo = 2, timed, '') 2daysAgo,
IF(daysAgo = 1, timed, '') 1daysAgo,
IF(daysAgo = 0, timed, '') 0daysAgo,
IF(daysAgo = 6, direction, '') 6daysAgoDirection,
IF(daysAgo = 5, direction, '') 5daysAgoDirection,
IF(daysAgo = 4, direction, '') 4daysAgoDirection,
IF(daysAgo = 3, direction, '') 3daysAgoDirection,
IF(daysAgo = 2, direction, '') 2daysAgoDirection,
IF(daysAgo = 1, direction, '') 1daysAgoDirection,
IF(daysAgo = 0, direction, '') 0daysAgoDirection,
direction,
position
FROM(SELECT DATEDIFF(vDated, timed) daysAgo,
TIME_FORMAT(timed,'%H:%i') timed,
IF(DATE(timed) <> @lastDated, @position := 0, NULL),
@position := @position+1 position,
@lastDated := DATE(timed),
direction
FROM workerTimeControl wtc
WHERE wtc.userFk = vUserFk
AND wtc.timed >= TIMESTAMPADD(DAY, -6,vDated)
ORDER BY wtc.timed
LIMIT 10000000000000000000
)sub
)sub2
GROUP BY position) sub3
JOIN (SELECT MAX(IF(daysAgo = 6, timeWorkSeconds, 0)) 6daysAgoTotal,
MAX(IF(daysAgo = 5, timeWorkSeconds, 0)) 5daysAgoTotal,
MAX(IF(daysAgo = 4, timeWorkSeconds, 0)) 4daysAgoTotal,
MAX(IF(daysAgo = 3, timeWorkSeconds, 0)) 3daysAgoTotal,
MAX(IF(daysAgo = 2, timeWorkSeconds, 0)) 2daysAgoTotal,
MAX(IF(daysAgo = 1, timeWorkSeconds, 0)) 1daysAgoTotal,
MAX(IF(daysAgo = 0, timeWorkSeconds, 0)) 0daysAgoTotal
FROM (SELECT DATEDIFF(vDated, dated) daysAgo,
timeWorkSeconds
FROM tmp.timeControlCalculate) sub4)sub5 ON TRUE;
DROP TEMPORARY TABLE tmp.timeControlCalculate;
END$$
DELIMITER ;