Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- ======================================================================================================
- -- Author: <Jeremias Badilla> --
- -- Create date: <01-09-2009> --
- -- Description: <funcio que retorna las hrs extras y las hrs de turno entre fechas diferentes> --
- -- ======================================================================================================
- CREATE FUNCTION [dbo].[HrasExtras](@id_turno as int, @id_personal as varchar(15) , @id_actividad as int
- ,@id_proceso as int,@planta as varchar(5)) RETURNS @tbl table (hrs1 float ,hrs2 float)
- AS
- BEGIN
- --declare @id_proceso as int
- --declare @planta as varchar(5)
- --declare @id_turno as int
- --declare @id_personal as varchar (15)
- --declare @id_actividad as int
- --set @id_proceso = 11787
- --set @planta = 'LIN'
- --SET @id_turno = 6
- --SET @id_personal ='07.586.042-0'
- --SET @id_actividad = 17
- declare @Diffturno as float -- Diferencia de hrs entre los turnos
- declare @hinicioT as datetime --hora inicio turno
- declare @hterminoT as datetime -- hora termino turno
- set @hinicioT = (select hora_inicio from turno where id_turno = @id_turno) -- obtenemos de la tabla turno la hora de inicio de
- set @hterminoT = (select hora_termino from turno where id_turno = @id_turno) -- un turno y sacamos la diferencia en turno
- set @diffturno = datediff(minute,@hinicioT,@hterminoT) -- 24 es la cantidad de hrs en un dia por lo que
- --restamos 24 menos la diferencia del turno y nos da la cantidad de
- if @Diffturno < 0
- begin
- set @hterminot = dateadd(day,1,@hterminot)
- set @diffturno = datediff(minute,@hinicioT,@hterminoT)
- end
- --hrs que se trabajan en un turno
- declare @hraEntrada as datetime -- hora entrada trabajador;
- declare @hrasalida as datetime -- hora salida trabajador;
- declare @fsalida as varchar(20) -- salida es un convertidor para poder tomar la fecha del dia de inicio
- declare @hsalida as varchar(20) -- y tomar la hra de termino de un turno se concatena con hsalida;
- declare @fentrada as varchar(20) -- fecha actual + inicio turno
- declare @hentrada as varchar(20) -- para concatenar
- set @hraEntrada = (select top 1 Fecha_inicio from det_ActividadPersonal where id_personal = @id_personal
- and id_actividad = @id_actividad and id_proceso = @id_proceso and id_planta = @planta) --hra entrada trabajador segun su id , proceso y actividad
- --print @hraentrada
- set @fsalida = convert(varchar ,@hraentrada) --convierte a varchar la hraentrada
- set @hsalida = convert(varchar ,@hterminoT) -- convierte a varchar la htermino que es del turno
- set @fsalida = substring(@fsalida,1,11) -- toma el substring de la fecha 1 = inicio 11 la cantidad por lo que toma solo la fecha y no la hra
- set @hsalida = substring(@hsalida,14,6)-- toma la hra de termino de turno
- set @fsalida = (@fsalida +' '+ @hsalida) -- concatenamos la fecha del dia con la hra fin de turno
- set @fsalida = convert(datetime , @fsalida , 103)-- volvcemos a tomar
- set @hrasalida = (select top 1 fecha_termino from det_actividadpersonal where id_personal = @id_personal and id_actividad= @id_actividad
- and id_proceso = @id_proceso and id_planta = @planta order by fecha_termino desc) --obtenemos la hra de salida cuando es le mismo dia
- declare @diffdias int
- set @diffdias = 1
- while @hrasalida is null --si la hrasalida es nula es por que la fsalida es menor que fecha termino
- begin
- set @fsalida = dateadd(day,@diffdias,@fsalida) -- sumamos n cantidad de dias a la @fsalida para que sea la fecha correcta qe sale el trabajador
- set @hrasalida = (select top 1 fecha_termino from det_actividadpersonal where
- id_personal = @id_personal and id_planta = @planta order by fecha_termino desc) -- obtenemos la fecha correcta de salida para el caso de los turno
- -- que pasan por las 00:00:00 hrs y hay un cambio de dia
- set @diffdias = (@diffdias + 1) -- sumamos un dia para cuando la funcion hrasalida aun siguie siendo menor que la de entrada
- end
- declare @diffhrsT as float -- diferencias horas trabajadas
- declare @totalhrs as float -- total de hrs trabajadas
- declare @HrsExtra as float -- Hrs Extra Expresado en hrs,minutos
- set @diffhrst = datediff(minute,@hraentrada,@hrasalida) -- sacamos la diff de hrs entre la entra y la salida eso nos data el total de horas trabajadas
- -- si las hrs son mayores a la duracion del turno entonses ubieron hrs extra
- if @diffhrst <= @diffturno -- hrs menores que lo que dura el turno
- begin
- set @totalhrs = @diffhrst/60 -- entonses son hras trabajas normales
- end
- else
- begin
- set @hrsextra = (@diffhrst - @diffturno)/60 -- si se pasa se restan y se obtienen las hrs extra
- set @totalhrs = (@diffhrst/60) -- dividimos las hrs por 60 ya que estan calculadas en minutos
- set @totalhrs = (@totalhrs) - (@hrsextra) --restamos las hrs totales con las hrs extra y sacamos las hrs normales trabajadas
- end
- if @hrsextra is null -- si no tiene hrs extra entonses las hrs extra seran 0
- begin
- set @hrsextra = 0
- end
- declare @ColacionI as datetime
- Declare @ColacionT as Datetime
- set @ColacionI = (Select fecha_inicio from det_tiempomuerto where id_tiempomuerto = 3 and id_proceso = @id_proceso and id_actividad = @id_actividad and id_planta = @planta ) --Obtenemos La Fecha Inicio De La Colacion
- set @ColacionT = (Select fecha_Termino from det_tiempomuerto where id_tiempomuerto = 3 and id_proceso = @id_proceso and id_actividad = @id_actividad and id_planta = @planta ) --Obtenemos La Fecha Termino De la Colacion
- if @hraentrada < @fsalida
- begin
- if @ColacionI > @hraentrada and @ColacionT < @hrasalida
- begin
- set @totalhrs = @totalhrs - 0.5
- end
- end
- else
- begin
- declare @paso as float
- declare @diffoo as varchar(20)
- set @diffoo = convert(varchar,@fsalida)
- set @diffoo = substring(@diffoo,1,11)
- set @diffoo = @diffoo + ' 23:59:59'
- set @diffoo = convert(datetime,@diffoo,103)
- set @paso = datediff(minute,@hraentrada,@diffoo)
- set @hraentrada = dateadd(minute,@paso,@hraentrada)
- set @fsalida = dateadd(minute,@paso,@fsalida)
- set @ColacionI = dateadd(minute,@paso,@ColacionI)
- set @ColacionT = dateadd(minute,@paso,@ColacionT)
- if @ColacionI > @hraentrada and @ColacionT < @hrasalida
- begin
- set @totalhrs = @totalhrs - 0.5
- end
- end
- Insert into @tbl Values (@totalhrs,@hrsextra)
- --print @hrsextra
- --print @totalhrs
- return
- END
Add Comment
Please, Sign In to add comment