Retención IMSS sobre SDI

Navigation:  KnowledgeBase Programación > Consultas > Nómina >

Retención IMSS sobre SDI

Previous pageReturn to chapter overviewNext page

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