97 lines
4.1 KiB
SQL
97 lines
4.1 KiB
SQL
|
|
DROP procedure IF EXISTS `vn`.`timeBusiness_calculate`;
|
|
|
|
DELIMITER $$
|
|
CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`timeBusiness_calculate`(vDatedFrom DATETIME, vDatedTo DATETIME)
|
|
BEGIN
|
|
|
|
/**
|
|
* Horas que debe trabajar un empleado según contrato y día.
|
|
* @param vDatedFrom workerTimeControl
|
|
* @param vDatedTo workerTimeControl
|
|
* @table tmp.user(userFk)
|
|
* @return tmp.timeBusinessCalculate
|
|
*/
|
|
DECLARE vHoursFullTime INT DEFAULT 40;
|
|
|
|
DROP TEMPORARY TABLE IF EXISTS tmp.timeBusinessCalculate;
|
|
DROP TEMPORARY TABLE IF EXISTS tmp.businessFullTime;
|
|
|
|
CALL rangeDateInfo(vDatedFrom, vDatedTo);
|
|
|
|
CREATE TEMPORARY TABLE tmp.timeBusinessCalculate
|
|
SELECT dated,
|
|
businessFk,
|
|
userFk,
|
|
departmentFk,
|
|
hourStart,
|
|
hourEnd,
|
|
timeWorkSeconds,
|
|
SEC_TO_TIME(timeWorkSeconds) timeWorkSexagesimal,
|
|
timeWorkSeconds / 3600 timeWorkDecimal,
|
|
timeWorkSeconds timeBusinessSeconds,
|
|
SEC_TO_TIME(timeWorkSeconds) timeBusinessSexagesimal,
|
|
timeWorkSeconds / 3600 timeBusinessDecimal,
|
|
type,
|
|
permissionrate,
|
|
hoursWeek
|
|
FROM(SELECT rd.dated,
|
|
b.business_id businessFk,
|
|
w.userFk,
|
|
bl.department_id departmentFk,
|
|
IF(cl.hours_week = vHoursFullTime, NULL, GROUP_CONCAT(DISTINCT LEFT(j.start,2) ORDER BY j.start ASC SEPARATOR '-')) hourStart ,
|
|
IF(cl.hours_week = vHoursFullTime, NULL, GROUP_CONCAT(DISTINCT LEFT(j.end,2) ORDER BY j.end ASC SEPARATOR '-')) hourEnd,
|
|
IF(cl.hours_week = vHoursFullTime, 0, IFNULL(SUM(TIME_TO_SEC(j.end)) - SUM(TIME_TO_SEC(j.start)),0)) timeWorkSeconds,
|
|
cs.type,
|
|
cs.permissionRate,
|
|
cl.hours_week hoursWeek
|
|
FROM tmp.rangeDate rd
|
|
LEFT JOIN postgresql.business b ON rd.dated BETWEEN b.date_start AND ifnull(b.date_end, vDatedTo )
|
|
LEFT JOIN postgresql.profile AS pr ON b.client_id = pr.profile_id
|
|
LEFT JOIN postgresql.person AS p ON pr.person_id = p.person_id
|
|
LEFT JOIN vn.worker AS w ON p.id_trabajador = w.id
|
|
JOIN tmp.`user` u ON u.userFK = w.userFK
|
|
JOIN postgresql.business_labour AS bl ON b.business_id = bl.business_id
|
|
LEFT JOIN postgresql.business_labour_payroll AS bp ON bl.business_id = bp.business_id
|
|
LEFT JOIN postgresql.professional_category AS pc ON bl.professional_category_id = pc.professional_category_id
|
|
LEFT JOIN postgresql.workcenter AS wc ON bl.workcenter_id = wc.workcenter_id
|
|
LEFT JOIN postgresql.calendar_labour_type AS cl ON bl.calendar_labour_type_id = cl.calendar_labour_type_id
|
|
LEFT JOIN postgresql.journey AS j ON j.business_id = b.business_id and j.day_id=WEEKDAY(rd.dated)+1
|
|
LEFT JOIN postgresql.calendar_employee ce ON ce.business_id=b.business_id and ce.date = rd.dated
|
|
LEFT JOIN postgresql.calendar_state cs ON cs.calendar_state_id = ce.calendar_state_id
|
|
WHERE rd.dated BETWEEN vDatedFrom AND vDatedTo
|
|
GROUP BY w.userFk,dated
|
|
)sub;
|
|
|
|
|
|
UPDATE tmp.timeBusinessCalculate t
|
|
SET t.timeWorkSeconds = vHoursFullTime / 5 * 3600,
|
|
t.timeWorkSexagesimal = SEC_TO_TIME( vHoursFullTime / 5 * 3600),
|
|
t.timeWorkDecimal = vHoursFullTime / 5,
|
|
t.timeBusinessSeconds = vHoursFullTime / 5 * 3600,
|
|
t.timeBusinessSexagesimal = SEC_TO_TIME( vHoursFullTime / 5 * 3600),
|
|
t.timeBusinessDecimal = vHoursFullTime / 5
|
|
WHERE DAYOFWEEK(t.dated) IN(2,3,4,5,6) AND hoursWeek = vHoursFullTime ;
|
|
|
|
UPDATE tmp.timeBusinessCalculate t
|
|
SET t.timeWorkSeconds = t.timeWorkSeconds - (t.timeWorkSeconds * permissionrate) ,
|
|
t.timeWorkSexagesimal = SEC_TO_TIME(t.timeWorkSeconds - (t.timeWorkSeconds * permissionrate)),
|
|
t.timeWorkDecimal = t.timeWorkDecimal - (t.timeWorkDecimal * permissionrate)
|
|
WHERE permissionrate <> 0;
|
|
|
|
UPDATE tmp.timeBusinessCalculate t
|
|
JOIN postgresql.calendar_labour cl ON cl.day = t.dated
|
|
JOIN postgresql.business_labour bl ON bl.business_id = t.businessFk AND bl.workcenter_id = cl.workcenter_id
|
|
SET t.timeWorkSeconds = 0,
|
|
t.timeWorkSexagesimal = 0,
|
|
t.timeWorkDecimal = 0,
|
|
t.permissionrate = 1,
|
|
t.type = 'Festivo'
|
|
WHERE t.type IS NULL;
|
|
|
|
DROP TEMPORARY TABLE IF EXISTS tmp.rangeDate;
|
|
END$$
|
|
|
|
DELIMITER ;
|
|
|