Consulta 300300
--DECLARE @IDNomina int = 2
DECLARE @IDNominaDetalle int = 0
DECLARE @IDJornada int = 0
DECLARE @ISRGravado float = 0
DECLARE @ISRExento float = 0
DECLARE @IMSSGravado float = 0
DECLARE @IMSSExento float = 0
DECLARE @SalarioDiario float = 0
DECLARE @IDEmpleado int = 0
DECLARE @Ejercicio int = 0
DECLARE @CalculaISRProporcional bit = 0
DECLARE @SalarioMinimoDF float = 0
DECLARE @DiasJornada float = 0
SELECT @Ejercicio = YEAR(RRHH_Nominas.Fecha), @IDJornada=RRHH_Nominas.IDJornada FROM RRHH_Nominas WHERE RRHH_Nominas.IDNomina = @IDNomina
SELECT @CalculaISRProporcional = isnull(RRHH_Jornadas.CalculoISRProporcional,0), @DiasJornada = isnull(RRHH_Jornadas.DiasJornada,15) FROM RRHH_Jornadas WHERE IDJornada = @IDJornada
SELECT @SalarioMinimoDF = isnull(SalarioMinimo,0) FROM RRHH_SalariosMinimos WHERE Zona = 'A'
if @SalarioMinimoDF = 0
BEGIN
RAISERROR 44447 N'NO SE ENCONTRÓ SALARIO MINIMO DEL D.F. (ZONA A)'
RETURN
END
DECLARE @ERRORES TABLE(IDNominaDetalle INT, IDEmpleado int, MSG varchar(200))
DECLARE MiCursor CURSOR LOCAL FOR
SELECT dbo.RRHH_NominaDetalle.IDNominaDetalle, ROUND(SumasPrestaciones.ISRGravado,2), SumasPrestaciones.ISRExento,
SumasPrestaciones.IMSSGravado, SumasPrestaciones.IMSSExento, dbo.RRHH_NominaDetalle.IDEmpleado, SumasPrestaciones.SalarioDiario
FROM dbo.RRHH_NominaDetalle INNER JOIN
(SELECT dbo.RRHH_NominaInfo.IDNominaDetalle, SUM(dbo.RRHH_NominaPrestaciones.ISRGravado) AS ISRGravado,
SUM(dbo.RRHH_NominaPrestaciones.ISRExento) AS ISRExento, SUM(CASE WHEN ISNULL(AplicaSub,0) = 1 THEN 0 ELSE dbo.RRHH_NominaPrestaciones.IMSSGravado END) AS IMSSGravado,
SUM(dbo.RRHH_NominaPrestaciones.IMSSExento) AS IMSSExento, MAX(RRHH_NominaInfo.SalarioDiario) as SalarioDiario
FROM dbo.RRHH_NominaInfo INNER JOIN
dbo.RRHH_NominaPrestaciones ON dbo.RRHH_NominaInfo.IDNominaInfo = dbo.RRHH_NominaPrestaciones.IDNominaInfo WHERE ISNULL(RRHH_NominaInfo.AplicarRetencionISR,0) = 0
GROUP BY dbo.RRHH_NominaInfo.IDNominaDetalle) AS SumasPrestaciones ON
dbo.RRHH_NominaDetalle.IDNominaDetalle = SumasPrestaciones.IDNominaDetalle
WHERE (dbo.RRHH_NominaDetalle.IDNomina = @IDNomina)
OPEN MiCursor
FETCH MiCursor INTO @IDNominaDetalle, @ISRGravado, @ISRExento, @IMSSGravado, @IMSSExento, @IDEmpleado, @SalarioDiario
While (@@FETCH_STATUS = 0)
BEGIN
DECLARE @LimInf float = 0
DECLARE @CuotaFija float = 0
DECLARE @Porc float = 0
DECLARE @ISRCorrespondido float = 0
DECLARE @SubCorrespondido float = 0
IF @CalculaISRProporcional = 0
BEGIN
-- CALCULA ISR
SELECT TOP(1) @LimInf = RRHH_TablasImpuestos.LimiteInferior, @CuotaFija = RRHH_TablasImpuestos.CuotaFija , @Porc = RRHH_TablasImpuestos.ExedenteLimite FROM RRHH_TablasImpuestos WHERE RRHH_TablasImpuestos.LimiteInferior <= @ISRGravado AND RRHH_TablasImpuestos.LimiteSuperior >= @ISRGravado AND TipoTabla=1 AND Ejercicio = @Ejercicio AND IDJornada = @IDJornada ORDER BY RRHH_TablasImpuestos.LimiteInferior
SET @ISRCorrespondido = ((ISNULL(@ISRGravado,0) - ISNULL(@LimInf,0)) * ISNULL(@Porc,0)) + ISNULL(@CuotaFija ,0)
SET @ISRCorrespondido = ROUND (isnull(@ISRCorrespondido,0),2)
if @ISRGravado = 0 GOTO FinalNormal
if ISNULL(@LimInf,0)=0
BEGIN
INSERT INTO @ERRORES (IDNominaDetalle, IDEmpleado, MSG) VALUES (@IDNominaDetalle, @IDEmpleado, 'NO SE ENCONTRO LIMITE INFERIOR EN LA TABLA DE IMPUESTOS DEL EJERCICIO')
END
UPDATE RRHH_NominaDetalle SET ISR_LimInf = @LimInf, ISR_CuotaFija=@CuotaFija , ISR_Porc=@Porc, ISRCorrespondido = @ISRCorrespondido WHERE IDNominaDetalle = @IDNominaDetalle
FinalNormal:
END
ELSE
BEGIN
-- CALCULA ISR PROPORCIONAL
DECLARE @CALCULO FLOAT = 0
DECLARE @SueldoOrdinario FLOAT = 0
DECLARE @ISRCalculo FLOAT = 0
DECLARE @ISRSueldoOrdinario FLOAT = 0
SET @CALCULO = ( @ISRGravado / 365 ) * 30.4
SELECT @SueldoOrdinario = SUM(CASE WHEN SalarioDiario > 0 THEN ISNULL(SalarioDiario,0) ELSE ISNULL(HorasDiarias,0) * ISNULL(SalarioHora,0) END) FROM dbo.RRHH_NominaInfo INNER JOIN
dbo.RRHH_NominaDetalle ON dbo.RRHH_NominaInfo.IDNominaDetalle = dbo.RRHH_NominaDetalle.IDNominaDetalle
WHERE RRHH_NominaDetalle.IDNominaDetalle = @IDNominaDetalle
SET @SueldoOrdinario = ISNULL(@SueldoOrdinario,0) * 30.4
SET @CALCULO = @CALCULO + @SueldoOrdinario
if @CALCULO = 0 GOTO FinalProporcional
-- CALCULA ISR DEL @CALCULO
SELECT TOP(1) @LimInf = RRHH_TablasImpuestos.LimiteInferior, @CuotaFija = RRHH_TablasImpuestos.CuotaFija , @Porc = RRHH_TablasImpuestos.ExedenteLimite FROM RRHH_TablasImpuestos WHERE RRHH_TablasImpuestos.LimiteInferior <= @CALCULO AND RRHH_TablasImpuestos.LimiteSuperior >= @CALCULO AND TipoTabla=1 AND Ejercicio = @Ejercicio AND IDJornada = @IDJornada ORDER BY RRHH_TablasImpuestos.LimiteInferior
SET @ISRCalculo = ((ISNULL(@CALCULO,0) - ISNULL(@LimInf,0)) * ISNULL(@Porc,0)) + ISNULL(@CuotaFija ,0)
SET @ISRCalculo = ROUND (isnull(@ISRCalculo,0),2)
if ISNULL(@LimInf,0)=0
BEGIN
INSERT INTO @ERRORES (IDNominaDetalle, IDEmpleado, MSG) VALUES (@IDNominaDetalle, @IDEmpleado, 'NO SE ENCONTRO LIMITE INFERIOR EN LA TABLA DE IMPUESTOS DEL EJERCICIO')
END
UPDATE RRHH_NominaDetalle SET ISR_LimInf = @LimInf, ISR_CuotaFija=@CuotaFija , ISR_Porc=@Porc WHERE IDNominaDetalle = @IDNominaDetalle
-- CALCULA ISR DEL @SueldoOrdinario
SELECT TOP(1) @LimInf = RRHH_TablasImpuestos.LimiteInferior, @CuotaFija = RRHH_TablasImpuestos.CuotaFija , @Porc = RRHH_TablasImpuestos.ExedenteLimite FROM RRHH_TablasImpuestos WHERE RRHH_TablasImpuestos.LimiteInferior <= @SueldoOrdinario AND RRHH_TablasImpuestos.LimiteSuperior >= @SueldoOrdinario AND TipoTabla=1 AND Ejercicio = @Ejercicio AND IDJornada = @IDJornada ORDER BY RRHH_TablasImpuestos.LimiteInferior
SET @ISRSueldoOrdinario = ((ISNULL(@SueldoOrdinario,0) - ISNULL(@LimInf,0)) * ISNULL(@Porc,0)) + ISNULL(@CuotaFija ,0)
SET @ISRSueldoOrdinario = ROUND (isnull(@ISRSueldoOrdinario,0),2)
-- CALCULA ISR PROPORCIONAL
if isnull(@ISRGravado,0) = 0
BEGIN
SET @ISRCorrespondido = 0
END
ELSE
BEGIN
SET @ISRCorrespondido = ROUND(((@ISRCalculo-@ISRSueldoOrdinario) / (( @ISRGravado / 365 ) * 30.4)), 4) * @ISRGravado
END
if ISNULL(@LimInf,0)=0
BEGIN
INSERT INTO @ERRORES (IDNominaDetalle, IDEmpleado, MSG) VALUES (@IDNominaDetalle, @IDEmpleado, 'NO SE ENCONTRO LIMITE INFERIOR EN LA TABLA DE IMPUESTOS DEL EJERCICIO PARA: $' + convert(varchar,cast(@SueldoOrdinario as money),1) )
END
UPDATE RRHH_NominaDetalle SET ISR_Sueldo142 = @SueldoOrdinario, ISR_LimInf2 = @LimInf, ISR_CuotaFija2=@CuotaFija , ISR_Porc2=@Porc, ISRCorrespondido = @ISRCorrespondido WHERE IDNominaDetalle = @IDNominaDetalle
FinalProporcional:
END
-- CALCULA SUBSIDIO
SET @LimInf=0
IF @CalculaISRProporcional = 0
BEGIN
SELECT TOP(1) @LimInf = RRHH_TablasImpuestos.LimiteInferior, @SubCorrespondido = RRHH_TablasImpuestos.CuotaFija FROM RRHH_TablasImpuestos WHERE RRHH_TablasImpuestos.LimiteInferior <= @ISRGravado AND RRHH_TablasImpuestos.LimiteSuperior >= @ISRGravado AND TipoTabla=2 AND Ejercicio = @Ejercicio AND IDJornada = @IDJornada ORDER BY RRHH_TablasImpuestos.LimiteInferior
END
SET @SubCorrespondido = ROUND (isnull(@SubCorrespondido,0),2)
UPDATE RRHH_NominaDetalle SET SUB_LinInf = isnull(@LimInf,0), SubsidioCorrespondido=isnull(@SubCorrespondido,0) WHERE IDNominaDetalle = @IDNominaDetalle
-- CALCULO DE IMSS
DECLARE @CUOTAIMSS FLOAT =0
DECLARE @RETIMSS FLOAT =0
DECLARE @CUOTA_Exe_Sal_Min AS float = 0
DECLARE @CotizaMaxima AS float = 0
DECLARE @PrimaVacacional as float
DECLARE @Aguinaldo as float
DECLARE @DiasVac as float
DECLARE @PorcPrimaVac as float
SELECT @DiasVac = DiasVaciones FROM RRHH_EMPLEADOS WHERE IDEmpleado = @IDEmpleado
SELECT @Aguinaldo = NVALOR1 FROM CONFIGURACIONES WHERE TipoConfig = 7000 AND IDConfig = '1001'
SELECT @PorcPrimaVac = NVALOR1 FROM CONFIGURACIONES WHERE TipoConfig = 7000 AND IDConfig = '1002'
SET @PrimaVacacional = (((@DiasVac * @SalarioDiario) / 365) * @PorcPrimaVac) * @DiasJornada
SET @Aguinaldo = ((isnull(@Aguinaldo,0)*@SalarioDiario)/365) * @DiasJornada
SET @IMSSGravado = isnull(@IMSSGravado,0) + isnull(@Aguinaldo,0) + isnull(@PrimaVacacional,0)
SELECT @CUOTAIMSS = SUM(CASE WHEN IDConfig BETWEEN 1501 AND 1504 THEN CONFIGURACIONES.NValor1 ELSE 0 END), @CUOTA_Exe_Sal_Min = SUM(CASE WHEN IDConfig = 1505 THEN CONFIGURACIONES.NValor1 ELSE 0 END) FROM CONFIGURACIONES WHERE CONFIGURACIONES.TipoConfig = 7000 AND CONFIGURACIONES.IDConfig > 1500 AND CONFIGURACIONES.IDConfig < 1599
SELECT @CotizaMaxima = CONFIGURACIONES.NValor1 FROM CONFIGURACIONES WHERE CONFIGURACIONES.TipoConfig = 7000 AND CONFIGURACIONES.IDConfig = 1600
IF @CotizaMaxima = 0 SET @CotizaMaxima = 25
set @CotizaMaxima = @CotizaMaxima * @SalarioMinimoDF * @DiasJornada
if @IMSSGravado > @CotizaMaxima
BEGIN
SET @IMSSGravado = @CotizaMaxima
END
SET @RETIMSS = ROUND(ISNULL(@CUOTAIMSS,0) * ISNULL(@IMSSGravado,0),2)
IF ISNULL(@IMSSGravado,0) > (ISNULL(@SalarioMinimoDF,0) * 3)*@DiasJornada
BEGIN
SET @RETIMSS += ROUND(ISNULL(@CUOTA_Exe_Sal_Min,0) * (ISNULL(@IMSSGravado,0) - (ISNULL(@SalarioMinimoDF,0) * 3)*@DiasJornada),2)
END
-- ACTUALIZACION FINAL
UPDATE RRHH_NominaDetalle SET RRHH_NominaDetalle.IMSSBase = @IMSSGravado, RRHH_NominaDetalle.ISRBase = @ISRGravado, RRHH_NominaDetalle.IMSS_Retenido =@RETIMSS, RRHH_NominaDetalle.IMSS_Factor = @CUOTAIMSS, ISRRetenido = CASE WHEN @ISRCorrespondido>@SubCorrespondido THEN @ISRCorrespondido-@SubCorrespondido ELSE 0 END, SubsidioOtorgado = CASE WHEN @ISRCorrespondido<@SubCorrespondido THEN @SubCorrespondido-@ISRCorrespondido ELSE 0 END WHERE IDNominaDetalle = @IDNominaDetalle
FETCH NEXT FROM MiCursor INTO @IDNominaDetalle, @ISRGravado, @ISRExento, @IMSSGravado, @IMSSExento, @IDEmpleado, @SalarioDiario
END
CLOSE MiCursor
DEALLOCATE MiCursor
SELECT * FROM @ERRORES