salix/db/changes/10110-postCampaign/01-ticketBusinessCalculate.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 ;