USE `vn`;
DROP procedure IF EXISTS `timeControl_calculate`;

DELIMITER $$
USE `vn`$$
CREATE DEFINER=`root`@`%` PROCEDURE `timeControl_calculate`(vDatedFrom DATETIME, vDatedTo DATETIME)
BEGIN
	SET @vIsOdd := TRUE;
	SET @vUser := NULL;
	SET @vDated := NULL;	
 
	DROP TEMPORARY TABLE IF EXISTS tmp.timeControlCalculate;
	
	CREATE TEMPORARY TABLE tmp.timeControlCalculate
	  SELECT  userFk,
			  dated,
			  IF( timeWork >= 18000, @timeWork:=timeWork + 1200, @timeWork:=timeWork) timeWorkSeconds,
			  SEC_TO_TIME(@timeWork ) timeWorkSexagesimal,    
			  @timeWork / 3600 timeWorkDecimal 
			FROM (SELECT SUM(timeWork) timeWork, 
						 userFk, 
                         dated 
					FROM (SELECT IF(@vUser = wtc.userFk, @vUser :=@vUser, @vUser := wtc.userFk ),
								 IF(@vIsOdd, @vIsOdd := FALSE, @vIsOdd := TRUE ),
								 IF(direction='in', @vIsOdd := TRUE, @vIsOdd := @vIsOdd ),
								 IF(@vIsOdd, @vLastTimed:=UNIX_TIMESTAMP(timed),@vLastTimed:=@vLastTimed), 
								 IF(@vIsOdd, 0, UNIX_TIMESTAMP(timed)-@vLastTimed) timeWork,
								 IF(direction='in', @vDated := DATE(wtc.timed), @vDated :=@vDated) dated,
								 wtc.userFk,
								 wtc.timed timed,
								 direction
							FROM (SELECT * FROM workerTimeControl ORDER BY userFk, timed ASC) wtc
								JOIN tmp.`user` w ON w.userFk = wtc.userFk
							WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo 
							ORDER BY userFk, timed ASC
						 ) sub
					GROUP BY userFk, dated
					ORDER BY userFk, dated
				 )sub2;

END$$

DELIMITER ;

