Calcular ISR Integrado

Navigation:  KnowledgeBase Programación > Base de Datos > Recursos Humanos > Consultas >

Calcular ISR Integrado

Previous pageReturn to chapter overviewNext page

--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
 
 
  SET  @PrimaVacacional = ((24 * @SalarioDiario) / 365) *  @DiasJornada
  SELECT @Aguinaldo = NVALOR1 FROM CONFIGURACIONES WHERE TipoConfig = 7000 AND IDConfig = '1001'
  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