Exemplo n.º 1
0
        /// <summary>
        /// Concepto de Premios de Puntualidad
        /// </summary>
        /// <param name="nomina"></param>
        /// <param name="isImpuestoSobreNomina"></param>
        /// <param name="porcentaje"></param>
        public static NOM_Nomina_Detalle PremiosPuntualidad(NOM_Nomina nomina, int diasPeriodo, bool isImpuestoSobreNomina = false, decimal porcentaje = 0)
        {
            decimal       _premiosPuntualidad = 0;
            const decimal diez = (decimal)0.10;

            _premiosPuntualidad = Utils.TruncateDecimales((nomina.SDI * nomina.Dias_Laborados) * diez);
            decimal _impuestoSobreNomina = 0;

            if (isImpuestoSobreNomina)
            {
                _impuestoSobreNomina = Utils.ImpuestoSobreNomina(_premiosPuntualidad, porcentaje);
                //_impuestoSobreNomina = _premiosPuntualidad * porcentaje;// CANCUN
                //_impuestoSobreNomina = Utils.ImpuestoSobreNomina(_premiosPuntualidad, porcentaje, nomina.Dias_Laborados); // MTY
            }

            //   GuardarConcepto(nomina.IdNomina, 8, _premiosPuntualidad, _premiosPuntualidad, impuestoNomina: _impuestoSobreNomina);

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomina.IdNomina,
                IdConcepto          = 8,
                Total               = _premiosPuntualidad,
                GravadoISR          = _premiosPuntualidad,
                ExentoISR           = 0,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = _impuestoSobreNomina,
                Complemento         = false
            };

            return(item);
        }
Exemplo n.º 2
0
        public static NOM_Nomina_Detalle Complemento_Sueldo(NOM_Nomina nomNomina, decimal cantidad = 0)
        {
            decimal total = 0;

            if (cantidad == 0)
            {
                total = nomNomina.SDReal * nomNomina.Dias_Laborados;
            }
            else
            {
                total = nomNomina.SDReal * cantidad;//nomina.Dias_Laborados;
            }


            //    GuardarConcepto(nomNomina.IdNomina, 1, total, isComplemento: true);


            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomNomina.IdNomina,
                IdConcepto          = 1,
                Total               = total,
                GravadoISR          = 0,
                ExentoISR           = 0,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = 0,
                Complemento         = true
            };

            return(item);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Metodo usado para el remigen 02 Sueldo -
        /// </summary>
        /// <param name="nomina"></param>
        /// <param name="diasPeriodo"></param>
        /// <param name="isImpuestoSobreNomina"></param>
        /// <param name="porcentaje"></param>
        /// <returns></returns>
        public static NOM_Nomina_Detalle AsimiladosASalarios(NOM_Nomina nomina, int diasPeriodo, bool isImpuestoSobreNomina = false, decimal porcentaje = 0)
        {
            decimal _sueldo  = 0;
            decimal _sueldoI = 0;

            _sueldo  = Utils.TruncateDecimales(nomina.SD * nomina.Dias_Laborados);
            _sueldoI = nomina.SDI * nomina.Dias_Laborados;
            decimal _impuestoSobreNomina = 0;

            if (isImpuestoSobreNomina)
            {
                //_impuestoSobreNomina = _sueldoI * porcentaje;
                //_impuestoSobreNomina = Utils.ImpuestoSobreNomina(_sueldoI, porcentaje, diasPeriodo);
                _impuestoSobreNomina = Utils.ImpuestoSobreNomina(nomina.SD, porcentaje, nomina.Dias_Laborados);
            }

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomina.IdNomina,
                IdConcepto          = 37,
                Total               = _sueldo,
                GravadoISR          = _sueldo,
                ExentoISR           = 0,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = 0, //_impuestoSobreNomina,
                Complemento         = false
            };

            return(item);
        }
Exemplo n.º 4
0
        public static NOM_Nomina_Detalle Vacaciones(NOM_Nomina nomina, int diasDeVacaciones, bool isImpuestoSobreNomina = false, decimal porcentaje = 0)
        {
            decimal _vacaciones             = 0;
            decimal _impuestoSobreNominaVac = 0;

            //Grava 100%
            _vacaciones = Utils.TruncateDecimales(nomina.SD * diasDeVacaciones);

            if (isImpuestoSobreNomina)
            {
                _impuestoSobreNominaVac = Utils.ImpuestoSobreNomina(_vacaciones, porcentaje);
            }

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomina.IdNomina,
                IdConcepto          = 148,
                Total               = _vacaciones,
                GravadoISR          = _vacaciones,
                ExentoISR           = 0,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = _impuestoSobreNominaVac,
                Complemento         = false
            };

            return(item);
        }
Exemplo n.º 5
0
        //public static Task<TotalIsrSubsidio> CalculoDeIsr(NOM_Nomina nomina, decimal salarioBase, int tipoNomina, int diasPeriodo)
        //{

        //    var t = Task.Factory.StartNew(() =>
        //    {
        //        IsrSubsidio objCalculoSubsidio;

        //        if (tipoNomina == 16) //Asimilado
        //        {
        //            objCalculoSubsidio = CalculoIsrAsimilado(salarioBase, nomina.SD, diasPeriodo, 4);//5 tarifa mensual// se cambio a 4 por peticion de rodolfo y sergio
        //        }
        //        else
        //        {
        //            objCalculoSubsidio = CalculoIsrSubsidio(salarioBase, nomina.SD, diasPeriodo, tipoNomina);
        //        }

        //        if (objCalculoSubsidio != null)
        //        {
        //            //SE crea el objeto total del calculo
        //            var totalConcepto = new TotalIsrSubsidio
        //            {
        //                SubsidioCausado = objCalculoSubsidio.Subsidio,
        //                SubsidioEntregado = 0,
        //                IsrAntesSubsidio = objCalculoSubsidio.Isr,
        //                IsrCobrado = 0
        //            };


        //            //Si Resultado es ISR, Subsidio se guarda en Cero
        //            if (objCalculoSubsidio.EsISR)
        //            {
        //                totalConcepto.IsrCobrado = objCalculoSubsidio.ResultadoIsrOSubsidio;
        //                GuardarConcepto(nomina.IdNomina, 43, objCalculoSubsidio.ResultadoIsrOSubsidio, 0, 0, 0, 0);
        //                GuardarConcepto(nomina.IdNomina, 144, 0, 0, 0, 0, 0);
        //            }
        //            else  //Si Resultado es Subsidio, ISR se guarda en Cero
        //            {
        //                totalConcepto.SubsidioEntregado = objCalculoSubsidio.ResultadoIsrOSubsidio;
        //                GuardarConcepto(nomina.IdNomina, 144, (objCalculoSubsidio.ResultadoIsrOSubsidio), 0, 0, 0, 0);
        //                GuardarConcepto(nomina.IdNomina, 43, 0, 0, 0, 0, 0);
        //            }


        //            return totalConcepto;
        //        }
        //        else
        //        {
        //            var totalConcepto = new TotalIsrSubsidio
        //            {
        //                SubsidioCausado = 0,
        //                SubsidioEntregado = 0,
        //                IsrAntesSubsidio = 0,
        //                IsrCobrado = 0
        //            };

        //            return totalConcepto;
        //        }

        //    });

        //    return t;
        //}


        //usado para el calculo del isr de la nomina - 2 metodo nomina - son 2 porque ultimo se fuerza a que sea la tabla mensual
        //usando para el calculo isr del asimilado - 1
        public static TotalIsrSubsidio CalculoDeIsr(NOM_Nomina nomina, decimal salarioBase, int tipoNomina, int diasPeriodo)
        {
            IsrSubsidio objCalculoSubsidio;

            if (tipoNomina == 16)                                                                 //Asimilado
            {
                objCalculoSubsidio = CalculoIsrAsimilado(salarioBase, nomina.SD, diasPeriodo, 4); //5 tarifa mensual// se cambio a 4 por peticion de rodolfo y sergio
            }
            else
            {
                //objCalculoSubsidio = CalculoIsrSubsidioFin(nomina, salarioBase, nomina.SD, diasPeriodo, tipoNomina);
                objCalculoSubsidio = CalculoIsrSubsidio304(nomina, salarioBase, nomina.SD, diasPeriodo, tipoNomina);//factor
            }

            if (objCalculoSubsidio != null)
            {
                //SE crea el objeto total del calculo
                var totalConcepto = new TotalIsrSubsidio
                {
                    SubsidioCausado   = objCalculoSubsidio.Subsidio, //GetSubsidioCausadoByTipoNomina(tipoNomina,salarioBase),
                    SubsidioEntregado = 0,
                    IsrAntesSubsidio  = objCalculoSubsidio.IsrAntesDeSub,
                    IsrCobrado        = 0
                };


                //Si Resultado es ISR, Subsidio se guarda en Cero
                if (objCalculoSubsidio.EsISR)
                {
                    totalConcepto.IsrCobrado = objCalculoSubsidio.ResultadoIsrOSubsidio;
                    GuardarConcepto(nomina.IdNomina, 43, objCalculoSubsidio.ResultadoIsrOSubsidio, 0, 0, 0, 0);
                    GuardarConcepto(nomina.IdNomina, 144, 0, 0, 0, 0, 0);
                }
                else  //Si Resultado es Subsidio, ISR se guarda en Cero
                {
                    totalConcepto.SubsidioEntregado = objCalculoSubsidio.ResultadoIsrOSubsidio;
                    GuardarConcepto(nomina.IdNomina, 144, (objCalculoSubsidio.ResultadoIsrOSubsidio), 0, 0, 0, 0);
                    GuardarConcepto(nomina.IdNomina, 43, 0, 0, 0, 0, 0);
                }


                return(totalConcepto);
            }
            else
            {
                var totalConcepto = new TotalIsrSubsidio
                {
                    SubsidioCausado   = 0,
                    SubsidioEntregado = 0,
                    IsrAntesSubsidio  = 0,
                    IsrCobrado        = 0
                };

                return(totalConcepto);
            }
        }
Exemplo n.º 6
0
        public ImpuestoDetalleModel GetImpuestosDetalle(NOM_Nomina itemnomina, decimal baseGravable = 0, decimal SD = 0, int tipoTarifa = 0, int diasPeriodo = 0, int idTipoNomina = 0)
        {
            if (baseGravable <= 0)
            {
                return(null);
            }
            if (tipoTarifa <= 0)
            {
                return(null);
            }
            IsrSubsidio calculoIsrSubsidio = new IsrSubsidio();

            if (idTipoNomina == 16)
            {
                calculoIsrSubsidio = MNominas.CalculoIsrAsimilado(baseGravable, SD, diasPeriodo, 4, incluirTablas: true);
            }
            else
            {
                //   calculoIsrSubsidio = MNominas.CalculoIsrSubsidioFin(itemnomina, itemnomina.SBCotizacionDelProcesado, SD, diasPeriodo, tipoTarifa, incluirTablas: true);
                calculoIsrSubsidio = MNominas.CalculoIsrSubsidio304(itemnomina, itemnomina.SBCotizacionDelProcesado, SD, diasPeriodo, tipoTarifa, incluirTablas: true); // factor
            }


            var item = new ImpuestoDetalleModel()
            {
                BaseGravable        = calculoIsrSubsidio.BaseGravable,
                BaseGravableMensual = calculoIsrSubsidio.BaseGravableMensual,
                LimiteInferior      = calculoIsrSubsidio.LimiteInferior,
                Base                  = calculoIsrSubsidio.Base,
                Tasa                  = calculoIsrSubsidio.Tasa,
                Isr                   = calculoIsrSubsidio.IsrAntesDeSub,
                Subsidio              = calculoIsrSubsidio.Subsidio,
                NetoAPagar            = calculoIsrSubsidio.NetoAPagar,
                ResultadoIsrOSubsidio = (calculoIsrSubsidio.ResultadoIsrOSubsidio),
                Tablaisr              = calculoIsrSubsidio.Tablaisr,
                Tablasubsidio         = calculoIsrSubsidio.Tablasubsidio,
                IdTablaIsr            = calculoIsrSubsidio.IdTablaIsr,
                IdTablaSubsidio       = calculoIsrSubsidio.IdTablaSubsidio,
                EsISR                 = calculoIsrSubsidio.EsISR,
                Porcentajeisr         = 0
            };

            return(item);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Pension ALimenticia = 48
        /// </summary>
        /// <param name="nomina"></param>
        /// <param name="contratoActual"></param>
        /// <param name="isImpuestoSobreNomina"></param>
        /// <param name="porcentaje"></param>
        /// <returns></returns>
        public static NOM_Nomina_Detalle PensionAlimenticia(NOM_Nomina nomina, Empleado_Contrato contratoActual, bool isImpuestoSobreNomina = false, decimal porcentaje = 0)
        {
            decimal porcentajePension      = contratoActual.PensionAlimenticiaPorcentaje != null ? (decimal)contratoActual.PensionAlimenticiaPorcentaje.Value : 0;
            var     tipoSueldo             = contratoActual.PensionAlimenticiaSueldo ?? 0;//Tipo de sueldo SD o SDI
            decimal sueldo                 = 0;
            decimal pagoPensionAlimenticia = 0;

            switch (tipoSueldo)
            {
            case 1:
                sueldo = nomina.SD;
                break;

            case 2:
                sueldo = nomina.SDI;
                break;
            }

            if (sueldo > 0 && porcentajePension > 0)
            {
                pagoPensionAlimenticia = ((sueldo * nomina.Dias_Laborados) * (porcentajePension / 100));

                //  GuardarConcepto(nomina.IdNomina, 48, pagoPensionAlimenticia, pagoPensionAlimenticia, impuestoNomina: 0);

                NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 48,
                    Total               = Utils.TruncateDecimales(pagoPensionAlimenticia),
                    GravadoISR          = Utils.TruncateDecimales(pagoPensionAlimenticia),
                    ExentoISR           = 0,
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = 0,
                    Complemento         = false
                };

                return(item);
            }

            return(null);
        }
Exemplo n.º 8
0
        public static NOM_Nomina_Detalle Complemento_DiaFestivo(NOM_Nomina nomNomina, decimal cantidad)
        {
            var total = ((nomNomina.SDReal * cantidad) * 2);
            //    GuardarConcepto(nomNomina.IdNomina, 83, total, isComplemento: true);

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomNomina.IdNomina,
                IdConcepto          = 83,
                Total               = total,
                GravadoISR          = 0,
                ExentoISR           = 0,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = 0,
                Complemento         = true
            };

            return(item);
        }
Exemplo n.º 9
0
        public static NOM_Nomina_Detalle Complemento_HorasExtrasTriples(NOM_Nomina nomNomina, decimal cantidad)
        {
            var total = ((nomNomina.SDReal / 8) * 3) * cantidad;
            // GuardarConcepto(nomNomina.IdNomina, 81, total, isComplemento: true);

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomNomina.IdNomina,
                IdConcepto          = 81,
                Total               = total,
                GravadoISR          = 0,
                ExentoISR           = 0,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = 0,
                Complemento         = true
            };

            return(item);
        }
Exemplo n.º 10
0
        public static NOM_Nomina_Detalle Complemento_VacacionesDisfrutadas(NOM_Nomina nomNomina, decimal cantidad)
        {
            var total = nomNomina.SDReal * cantidad;
            //    GuardarConcepto(nomNomina.IdNomina, 86, total, isComplemento:true);

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomNomina.IdNomina,
                IdConcepto          = 86,
                Total               = total,
                GravadoISR          = 0,
                ExentoISR           = 0,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = 0,
                Complemento         = true
            };

            return(item);
        }
Exemplo n.º 11
0
        public static NOM_Nomina_Detalle PrimaVacaciones(NOM_Nomina nomina, decimal vacaciones, decimal smg, bool isImpuestoSobreNomina = false, decimal porcentaje = 0)
        {
            if (vacaciones <= 0)
            {
                return(null);
            }

            decimal _primaVacacional          = 0;
            decimal _topePrima                = 0;
            decimal _impuestoSobreNominaPrima = 0;
            decimal PrimaVacacionalExcento    = 0;
            decimal PrimaVacacionaGravado     = 0;

            //Tope SMG * 15
            _topePrima       = smg * 15;
            _primaVacacional = Utils.TruncateDecimales(vacaciones * (decimal).25);


            PrimaVacacionalExcento = Utils.TruncateDecimales(_primaVacacional <= _topePrima ? _primaVacacional : _topePrima);
            PrimaVacacionaGravado  = Utils.TruncateDecimales(_primaVacacional - PrimaVacacionalExcento);

            if (isImpuestoSobreNomina)
            {
                _impuestoSobreNominaPrima = Utils.ImpuestoSobreNomina(PrimaVacacionalExcento, porcentaje);
            }

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomina.IdNomina,
                IdConcepto          = 16,
                Total               = _primaVacacional,
                GravadoISR          = PrimaVacacionaGravado,
                ExentoISR           = PrimaVacacionalExcento,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = _impuestoSobreNominaPrima,
                Complemento         = false
            };

            return(item);
        }
Exemplo n.º 12
0
        public static NOM_Nomina_Detalle PensionAlimenticiaComplemento(NOM_Nomina nomina, Empleado_Contrato contratoActual, bool isImpuestoSobreNomina = false, decimal porcentaje = 0)
        {
            decimal porcentajePension      = contratoActual.PensionAlimenticiaPorcentaje != null ? (decimal)contratoActual.PensionAlimenticiaPorcentaje.Value : 0;
            var     tipoSueldo             = contratoActual.PensionAlimenticiaSueldo ?? 0;
            decimal sueldo                 = nomina.SDReal;
            decimal pagoPensionAlimenticia = 0;

            //switch (tipoSueldo)
            //{
            //    case 1:
            //        sueldo = nomina.SD;
            //        break;
            //    case 2:
            //        sueldo = nomina.SDI;
            //        break;
            //}

            if (sueldo > 0 && porcentajePension > 0)
            {
                pagoPensionAlimenticia = (porcentajePension * sueldo) * (porcentajePension / 100);

                // GuardarConcepto(nomina.IdNomina, 48, pagoPensionAlimenticia, pagoPensionAlimenticia, impuestoNomina: 0, isComplemento: true);

                NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 48,
                    Total               = pagoPensionAlimenticia,
                    GravadoISR          = pagoPensionAlimenticia,
                    ExentoISR           = 0,
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = 0,
                    Complemento         = false
                };

                return(item);
            }

            return(null);
        }
Exemplo n.º 13
0
        /// <summary>
        /// Concepto de Sueldo
        /// </summary>
        /// <param name="nomina"></param>
        /// <param name="isImpuestoSobreNomina"></param>
        /// <param name="porcentaje"></param>
        public static NOM_Nomina_Detalle Sueldo(NOM_Nomina nomina, int diasPeriodo, bool isImpuestoSobreNomina = false, decimal porcentaje = 0, int diasVacaciones = 0)
        {
            decimal _sueldo              = 0;
            decimal _sueldoI             = 0;
            decimal _impuestoSobreNomina = 0;
            int     diasSueldo           = 0;

            diasSueldo = nomina.Dias_Laborados;

            if (diasVacaciones > 0)
            {
                diasSueldo -= diasVacaciones;
            }

            _sueldo  = Utils.TruncateDecimales(nomina.SD * diasSueldo);
            _sueldoI = Utils.TruncateDecimales(nomina.SDI * diasSueldo);

            if (isImpuestoSobreNomina)
            {
                //_impuestoSobreNomina = _sueldoI * porcentaje;
                //_impuestoSobreNomina = Utils.ImpuestoSobreNomina(_sueldoI, porcentaje, diasPeriodo);
                _impuestoSobreNomina = Utils.ImpuestoSobreNomina(nomina.SD, porcentaje, diasSueldo);
            }

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomina.IdNomina,
                IdConcepto          = 1,
                Total               = _sueldo,
                GravadoISR          = _sueldo,
                ExentoISR           = 0,
                IntegraIMSS         = _sueldoI,
                ImpuestoSobreNomina = _impuestoSobreNomina,
                Complemento         = false
            };

            return(item);
        }
Exemplo n.º 14
0
        public static NOM_Nomina_Detalle Complemento_PrimaDominical(NOM_Nomina nomNomina, decimal cantidad)
        {
            const decimal porcentaje = (decimal)0.25;
            var           total      = ((nomNomina.SDReal * cantidad) * porcentaje);

            //                GuardarConcepto(nomNomina.IdNomina, 84, total, isComplemento: true);


            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomNomina.IdNomina,
                IdConcepto          = 84,
                Total               = total,
                GravadoISR          = 0,
                ExentoISR           = 0,
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = 0,
                Complemento         = true
            };

            return(item);
        }
Exemplo n.º 15
0
        //Version 2 - 30.4
        //Method Name - CalculoIsrSubsidio304
        //
        public static IsrSubsidio CalculoIsrSubsidio304(NOM_Nomina nomina, decimal baseGravable, decimal SD, int diasPeriodo, int tipoTarifa, bool incluirTablas = false)
        {
            if (baseGravable <= 0)
            {
                return(null);
            }
            //if (tipoTarifa <= 0) return null;

            bool    esISR             = false;
            decimal factor304         = 30.40M;
            decimal nuevaBaseGravable = 0;
            decimal holdBaseGravable  = 0;
            decimal subsidio304       = 0;
            decimal isr304            = 0;

            //Regla 14 dias - para nominas catorcenales***********************************************************
            //version 30.4
            //Se obtiene el sueldo mensual

            //nuevaBaseGravable = (SD * variableMensual);//Obtenemos el sueldo mensual SD * 30.4
            //holdBaseGravable = baseGravable; //Guardamos la baseGravable anterior
            //baseGravable = (decimal)nuevaBaseGravable;


            nuevaBaseGravable = (baseGravable / nomina.Dias_Laborados) * factor304; //nueva base a 30.4
            holdBaseGravable  = baseGravable;                                       //Guardamos la baseGravable anterior
            baseGravable      = (decimal)nuevaBaseGravable;                         // establecemos como base de calculo la nueva base encontrada
            //******************************************************************************************************


            tipoTarifa = 5;//mensual


            List <C_NOM_Tabla_ISR>      tablaisrcompleta      = null;
            List <C_NOM_Tabla_Subsidio> tablasubsidiocompleta = null;

            var tablaIsr      = NominasDao.GeTablaIsrByTipoNomina(tipoTarifa, baseGravable);
            var tablaSubsidio = NominasDao.GetTablaSubsidioByTipoNomina(tipoTarifa, baseGravable);

            if (tablaIsr == null || tablaSubsidio == null)
            {
                return(null);
            }

            if (incluirTablas)
            {
                tablaisrcompleta      = NominasDao.GetAllTablaIsr(tipoTarifa);
                tablasubsidiocompleta = NominasDao.GetAllTablaSubsidios(tipoTarifa);
            }

            //1) Buscar el rango de limite inferior
            decimal limiteInferior = tablaIsr.Limite_Inferior;

            //2) Restar Ingreso - Limite Inferior = BASE
            decimal _base = baseGravable - limiteInferior;

            //3) Tomar el porcentaje del Rango %
            decimal porcentaje = tablaIsr.Porcentaje;

            //4) Multiplicar el % por la BASE
            decimal resultado = _base * (porcentaje / 100);

            //5)Tomar la cuota fija del rango
            decimal cuotaFija = tablaIsr.Cuota_Fija;

            //6 Sumar 4) + 5) = ISR
            decimal isr = resultado + cuotaFija;

            // 7) buscar en la tabla de subsidio en que rango esta el Salario Gravable
            decimal subsidioAlEmpleo = tablaSubsidio.Subsidio;

            //7.1 proporcional para el periodo de 14 dias

            //version 30.4
            isr304       = Utils.TruncateDecimales((isr / (decimal)factor304) * nomina.Dias_Laborados);
            subsidio304  = Utils.TruncateDecimales((subsidioAlEmpleo / (decimal)factor304) * nomina.Dias_Laborados);
            baseGravable = (decimal)holdBaseGravable;



            //8) Resta del 6) - 7) = ISR o Subsidio
            decimal isrOSubsidio = 0;

            if (isr > subsidioAlEmpleo)
            {
                isrOSubsidio = (isr - subsidioAlEmpleo);

                //version 30.4
                isrOSubsidio = (isr304 - subsidio304);
            }
            else
            {
                isrOSubsidio = (subsidioAlEmpleo - isr);

                //version 30.4
                isrOSubsidio = (subsidio304 - isr304);
            }


            //9) Neto a pagar Salario Gravable - 8)
            decimal netoPagar = 0;

            esISR = isr > subsidioAlEmpleo;

            if (esISR)
            {
                netoPagar = baseGravable - (isrOSubsidio);
            }
            else
            {
                netoPagar = baseGravable + (isrOSubsidio);
            }

            esISR = isr > subsidioAlEmpleo;

            var item = new IsrSubsidio()
            {
                BaseGravable        = baseGravable,
                BaseGravableMensual = (decimal)nuevaBaseGravable,
                LimiteInferior      = limiteInferior,
                Base                  = _base,
                Tasa                  = porcentaje,
                IsrAntesDeSub         = isr304,
                Subsidio              = subsidio304,//subsidioAlEmpleo
                NetoAPagar            = Utils.TruncateDecimales(netoPagar),
                ResultadoIsrOSubsidio = Common.Utils.Utils.TruncateDecimales(isrOSubsidio),
                IdTablaIsr            = tablaIsr.IdISR,
                IdTablaSubsidio       = tablaSubsidio.IdSubsidio,
                Tablaisr              = incluirTablas ? tablaisrcompleta : null,
                Tablasubsidio         = incluirTablas ? tablasubsidiocompleta : null,
                EsISR                 = esISR
            };

            return(item);
        }
Exemplo n.º 16
0
        /// <summary>
        /// Método que realiza el cálculo del IRS/SUBSIDIO Retorna un objeto "IsrSubsidio" con los valores del cálculo.
        /// tipoTarifa: Diario, semanal, quincenal, etc..
        /// 1.- Usado en Detalle de la nomina
        /// 2.- Fininiquito -
        /// 3.- finiquito F
        /// 4.- ultimo sueldo
        /// 5- en este mismo archivo linea 96
        /// </summary>
        /// <param name="nomina"></param>
        /// <param name="baseGravable"></param>
        /// <param name="diasPeriodo"></param>
        /// <param name="tipoTarifa"></param>
        /// <returns></returns>
        public static IsrSubsidio CalculoIsrSubsidioFin(NOM_Nomina nomina, decimal baseGravable, decimal SD, int diasPeriodo, int tipoTarifa, bool incluirTablas = false)
        {
            ////ASimilados a salario
            //if (tipoTarifa == 16) //Asimilado a Salarios - tipo Tarifa viene con el valor de Periodicidad de Pago
            //{
            //    if (diasPeriodo > 15)//Aqui habria que asegurarse de que tarifa quieren aplicar para el calculo
            //    {
            //        tipoTarifa = 5;//Lo cambiamos al tipo de tarifa mensual
            //    }
            //    else if (diasPeriodo == 15)
            //    {
            //        tipoTarifa = 4; //Lo cambiamos al tipo de tarifa quincenal
            //    }
            //    else
            //    {
            //        tipoTarifa = 2; //Lo cambiamos al tipo de tarifa semanal
            //    }
            //}

            if (baseGravable <= 0)
            {
                return(null);
            }
            if (tipoTarifa <= 0)
            {
                return(null);
            }

            bool    esISR             = false;
            double  variableMensual   = 30.40;
            double  nuevaBaseGravable = 0.00;
            double  holdBaseGravable  = 0.00;
            decimal subsidio14        = 0;
            decimal isr14             = 0;

            //Regla 14 dias - para nominas catorcenales
            if (diasPeriodo == 14)
            {
                //Se obtiene el sueldo mensual
                nuevaBaseGravable = ((double)SD * variableMensual);
                holdBaseGravable  = (double)baseGravable;
                baseGravable      = (decimal)nuevaBaseGravable;
                tipoTarifa        = 5;//mensual
            }

            List <C_NOM_Tabla_ISR>      tablaisrcompleta      = null;
            List <C_NOM_Tabla_Subsidio> tablasubsidiocompleta = null;

            var tablaIsr      = NominasDao.GeTablaIsrByTipoNomina(tipoTarifa, baseGravable);
            var tablaSubsidio = NominasDao.GetTablaSubsidioByTipoNomina(tipoTarifa, baseGravable);

            if (tablaIsr == null || tablaSubsidio == null)
            {
                return(null);
            }

            if (incluirTablas)
            {
                tablaisrcompleta      = NominasDao.GetAllTablaIsr(tipoTarifa);
                tablasubsidiocompleta = NominasDao.GetAllTablaSubsidios(tipoTarifa);
            }

            //1) Buscar el rango de limite inferior
            decimal limiteInferior = tablaIsr.Limite_Inferior;

            //2) Restar Ingreso - Limite Inferior = BASE
            decimal _base = baseGravable - limiteInferior;

            //3) Tomar el porcentaje del Rango %
            decimal porcentaje = tablaIsr.Porcentaje;

            //4) Multiplicar el % por la BASE
            decimal resultado = _base * (porcentaje / 100);

            //5)Tomar la cuota fija del rango
            decimal cuotaFija = tablaIsr.Cuota_Fija;

            //6 Sumar 4) + 5) = ISR
            decimal isr = resultado + cuotaFija;

            // 7) buscar en la tabla de subsidio en que rango esta el Salario Gravable
            decimal subsidioAlEmpleo = tablaSubsidio.Subsidio;

            //7.1 proporcional para el periodo de 14 dias
            if (diasPeriodo == 14)
            {
                isr14        = (isr / (decimal)variableMensual) * diasPeriodo;
                subsidio14   = (subsidioAlEmpleo / (decimal)variableMensual) * diasPeriodo;
                baseGravable = (decimal)holdBaseGravable;
            }


            //8) Resta del 6) - 7) = ISR o Subsidio
            decimal isrOSubsidio = 0;

            if (isr > subsidioAlEmpleo)
            {
                isrOSubsidio = (isr - subsidioAlEmpleo);

                if (diasPeriodo == 14)
                {
                    isrOSubsidio = (isr14 - subsidio14);
                }
            }
            else
            {
                isrOSubsidio = (subsidioAlEmpleo - isr);

                if (diasPeriodo == 14)
                {
                    isrOSubsidio = (subsidio14 - isr14);
                }
            }


            //9) Neto a pagar Salario Gravable - 8)
            decimal netoPagar = 0;

            esISR = isr > subsidioAlEmpleo;

            if (esISR)
            {
                netoPagar = baseGravable - (isrOSubsidio);
            }
            else
            {
                netoPagar = baseGravable + (isrOSubsidio);
            }

            esISR = isr > subsidioAlEmpleo;

            var item = new IsrSubsidio()
            {
                BaseGravable        = baseGravable,
                BaseGravableMensual = (decimal)nuevaBaseGravable,
                LimiteInferior      = limiteInferior,
                Base                  = _base,
                Tasa                  = porcentaje,
                IsrAntesDeSub         = isr,
                Subsidio              = subsidioAlEmpleo,
                NetoAPagar            = netoPagar,
                ResultadoIsrOSubsidio = Common.Utils.Utils.TruncateDecimales(isrOSubsidio),
                IdTablaIsr            = tablaIsr.IdISR,
                IdTablaSubsidio       = tablaSubsidio.IdSubsidio,
                Tablaisr              = incluirTablas ? tablaisrcompleta : null,
                Tablasubsidio         = incluirTablas ? tablasubsidiocompleta : null,
                EsISR                 = esISR
            };

            return(item);
        }
Exemplo n.º 17
0
        //public static Task<TotalIsrSubsidio> CalculoDeIsr(NOM_Nomina nomina, decimal salarioBase, int tipoNomina, int diasPeriodo)
        //{

        //    var t = Task.Factory.StartNew(() =>
        //    {
        //        IsrSubsidio objCalculoSubsidio;

        //        if (tipoNomina == 16) //Asimilado
        //        {
        //            objCalculoSubsidio = CalculoIsrAsimilado(salarioBase, nomina.SD, diasPeriodo, 4);//5 tarifa mensual// se cambio a 4 por peticion de rodolfo y sergio
        //        }
        //        else
        //        {
        //            objCalculoSubsidio = CalculoIsrSubsidio(salarioBase, nomina.SD, diasPeriodo, tipoNomina);
        //        }

        //        if (objCalculoSubsidio != null)
        //        {
        //            //SE crea el objeto total del calculo
        //            var totalConcepto = new TotalIsrSubsidio
        //            {
        //                SubsidioCausado = objCalculoSubsidio.Subsidio,
        //                SubsidioEntregado = 0,
        //                IsrAntesSubsidio = objCalculoSubsidio.Isr,
        //                IsrCobrado = 0
        //            };


        //            //Si Resultado es ISR, Subsidio se guarda en Cero
        //            if (objCalculoSubsidio.EsISR)
        //            {
        //                totalConcepto.IsrCobrado = objCalculoSubsidio.ResultadoIsrOSubsidio;
        //                GuardarConcepto(nomina.IdNomina, 43, objCalculoSubsidio.ResultadoIsrOSubsidio, 0, 0, 0, 0);
        //                GuardarConcepto(nomina.IdNomina, 144, 0, 0, 0, 0, 0);
        //            }
        //            else  //Si Resultado es Subsidio, ISR se guarda en Cero
        //            {
        //                totalConcepto.SubsidioEntregado = objCalculoSubsidio.ResultadoIsrOSubsidio;
        //                GuardarConcepto(nomina.IdNomina, 144, (objCalculoSubsidio.ResultadoIsrOSubsidio), 0, 0, 0, 0);
        //                GuardarConcepto(nomina.IdNomina, 43, 0, 0, 0, 0, 0);
        //            }


        //            return totalConcepto;
        //        }
        //        else
        //        {
        //            var totalConcepto = new TotalIsrSubsidio
        //            {
        //                SubsidioCausado = 0,
        //                SubsidioEntregado = 0,
        //                IsrAntesSubsidio = 0,
        //                IsrCobrado = 0
        //            };

        //            return totalConcepto;
        //        }

        //    });

        //    return t;
        //}


        //usado para el calculo del isr de la nomina - 2 metodo nomina - son 2 porque ultimo se fuerza a que sea la tabla mensual
        //usando para el calculo isr del asimilado - 1
        public static TotalIsrSubsidio CalculoDeIsr(NOM_Nomina nomina, decimal salarioBase, int tipoNomina, int diasPeriodo, bool anualOK, int eje, decimal exento)
        {
            decimal     isra = 0, saldo = 0;
            IsrSubsidio objCalculoSubsidio;

            if (tipoNomina == 16)                                                                 //Asimilado
            {
                objCalculoSubsidio = CalculoIsrAsimilado(salarioBase, nomina.SD, diasPeriodo, 4); //5 tarifa mensual// se cambio a 4 por peticion de rodolfo y sergio
            }
            else
            {
                //objCalculoSubsidio = CalculoIsrSubsidioFin(nomina, salarioBase, nomina.SD, diasPeriodo, tipoNomina);
                objCalculoSubsidio = CalculoIsrSubsidio304(nomina, salarioBase, nomina.SD, diasPeriodo, tipoNomina);//factor
            }

            if (objCalculoSubsidio != null)
            {
                //SE crea el objeto total del calculo
                var totalConcepto = new TotalIsrSubsidio
                {
                    SubsidioCausado   = objCalculoSubsidio.Subsidio, //GetSubsidioCausadoByTipoNomina(tipoNomina,salarioBase),
                    SubsidioEntregado = 0,
                    IsrAntesSubsidio  = objCalculoSubsidio.IsrAntesDeSub,
                    IsrCobrado        = 0
                };



                //Si Resultado es ISR, Subsidio se guarda en Cero
                if (objCalculoSubsidio.EsISR)
                {
                    totalConcepto.IsrCobrado = objCalculoSubsidio.ResultadoIsrOSubsidio;
                    GuardarConcepto(nomina.IdNomina, 43, objCalculoSubsidio.ResultadoIsrOSubsidio, 0, 0, 0, 0);
                    GuardarConcepto(nomina.IdNomina, 144, 0, 0, 0, 0, 0);
                }
                else  //Si Resultado es Subsidio, ISR se guarda en Cero
                {
                    totalConcepto.SubsidioEntregado = objCalculoSubsidio.ResultadoIsrOSubsidio;
                    GuardarConcepto(nomina.IdNomina, 144, (objCalculoSubsidio.ResultadoIsrOSubsidio), 0, 0, 0, 0);
                    GuardarConcepto(nomina.IdNomina, 43, 0, 0, 0, 0, 0);
                }

                if (anualOK)
                {
                    CalculoAnual Canual = new CalculoAnual();
                    NominasDao.EliminarCalculoAnual(nomina.IdEmpleado, nomina.IdPeriodo);
                    Canual = GetCalculoAnual(nomina.IdEmpleado, eje, nomina.IdEmpresaFiscal, salarioBase, objCalculoSubsidio.EsISR ? objCalculoSubsidio.ResultadoIsrOSubsidio : 0, objCalculoSubsidio.Subsidio, exento);
                    isra   = Canual.ResultadoIsrOSubsidio > 0 ? Math.Abs(Canual.ResultadoIsrOSubsidio) : 0;
                    saldo  = Canual.ResultadoIsrOSubsidio < 0 ? Math.Abs(Canual.ResultadoIsrOSubsidio) : 0;

                    if (isra > 0)
                    {
                        GuardarConcepto(nomina.IdNomina, 154, isra, 0, 0, 0, 0);
                        totalConcepto.IsrCobrado += isra;
                    }

                    NOM_CalculoAnual itemCalculo = new NOM_CalculoAnual();
                    itemCalculo.id           = 0;
                    itemCalculo.idEmpleado   = nomina.IdEmpleado;
                    itemCalculo.idEmpresa    = (int)nomina.IdEmpresaFiscal;
                    itemCalculo.idEjercicio  = eje;
                    itemCalculo.idPeriodo    = nomina.IdPeriodo;
                    itemCalculo.idNomina     = nomina.IdNomina;
                    itemCalculo.baseGravable = Canual.BaseGravable;
                    itemCalculo.Exento       = Canual.Exento;
                    itemCalculo.subCausado   = Canual.Subsidio;
                    itemCalculo.isrAntes     = Canual.IsrAntesDeSub;
                    itemCalculo.isrPagado    = Canual.isrPagado;
                    itemCalculo.isrRetener   = isra;
                    itemCalculo.saldoFavor   = saldo;
                    itemCalculo.status       = true;

                    _nominasDao.AddCalculoAnual(itemCalculo);
                }

                return(totalConcepto);
            }
            else
            {
                var totalConcepto = new TotalIsrSubsidio
                {
                    SubsidioCausado   = 0,
                    SubsidioEntregado = 0,
                    IsrAntesSubsidio  = 0,
                    IsrCobrado        = 0
                };

                return(totalConcepto);
            }
        }
Exemplo n.º 18
0
        public static decimal[] VerificaSaldo(decimal isr, int idEjercicio, NOM_Nomina itemnomina, int idperiodo)
        {
            decimal[] dato = new decimal[2];
            dato[0] = isr;

            using (var ctx = new RHEntities())
            {
                NominasDao.EliminarAplicacionSaldo(itemnomina.IdEmpleado, idperiodo);
                var item = ctx.NOM_CalculoAnual.Where(x => x.idEjercicio == idEjercicio && x.idEmpleado == itemnomina.IdEmpleado).FirstOrDefault();
                if (item != null && item.saldoFavor > 0)
                {
                    var aplicado = ctx.NOM_AplicacionSaldo.Where(x => x.idEmpleado == itemnomina.IdEmpleado && x.idCalculo == item.id).Select(x => x.ISRinicial).DefaultIfEmpty(0).Sum();

                    if (aplicado < item.saldoFavor)
                    {
                        decimal pagado;
                        decimal remanente = 0;

                        dato[0] = item.saldoFavor - (aplicado + isr);
                        if (dato[0] < 0)
                        {
                            item.status = false;
                            pagado      = isr + dato[0];
                            dato[0]     = Math.Abs(dato[0]);
                        }
                        else
                        {
                            pagado    = isr;
                            remanente = item.saldoFavor - (aplicado + isr);
                        }

                        NOM_AplicacionSaldo Osaldo = new NOM_AplicacionSaldo
                        {
                            idEmpleado = itemnomina.IdEmpleado,
                            idPeriodo  = idperiodo,
                            idCalculo  = item.id,
                            ISRinicial = isr,
                            ISRcobrado = dato[0]
                        };

                        NOM_Nomina_Detalle ODetalle = new NOM_Nomina_Detalle
                        {
                            Id                  = 0,
                            IdNomina            = itemnomina.IdNomina,
                            IdConcepto          = 146,
                            Total               = pagado,
                            GravadoISR          = 0,
                            ExentoISR           = 0,
                            IntegraIMSS         = 0,
                            ExentoIMSS          = 0,
                            ImpuestoSobreNomina = 0,
                            Complemento         = false,
                            IdPrestamo          = 0,
                            SaldoFavor          = item.saldoFavor,
                            Remanente           = remanente
                        };

                        dato[1] = pagado;
                        ctx.NOM_AplicacionSaldo.Add(Osaldo);
                        ctx.NOM_Nomina_Detalle.Add(ODetalle);
                        ctx.SaveChanges();
                    }
                }
            }


            return(dato);
        }
Exemplo n.º 19
0
        private static bool relativoPatronal    = false;//Relativo Patron = 0 dias laborados de un colaborador que aun esta dado de alta

        public static TotalConcepto CuotasImss(decimal salarioMinimoGeneral, decimal uma, decimal?primaRiesgo, NOM_Nomina nomina = null, NOM_Finiquito finiquito = null, bool usarUMA = true, int diasDelPeriodo = 0, int diasIncapacidad = 0, int permisosSinGoce = 0)
        {
            NOM_Cuotas_IMSS resultadoCuotas;

            //Inicializar las variables
            relativoPatronal               = false;
            _sbc                           = 0; // Salario Base de Cotizacion
            _zonaSalarial                  = 0;
            _smgv                          = 0; // Salario Minimo General Vigente
            _factorVeces                   = 3;
            _cuotaAdicional                = 0;
            _diasLaborados                 = 0;
            _excedente                     = 0;
            _excedentePatron               = 0;
            _excedenteObrero               = 0;
            _prestacionesDineroPatron      = 0;
            _prestacionesDineroObrero      = 0;
            _cuotaFijaPatron               = 0;
            _pencionadosBeneficiadosPatron = 0;
            _pencionadosBeneficiadosObrero = 0;
            _invalidezVidaPatron           = 0;
            _invalidezVidaObrero           = 0;
            _guarderiasPatron              = 0;
            _seguroRetiroPatron            = 0;
            _cesantiaVejezPatron           = 0;
            _cesantiaVejezObrero           = 0;
            _infonavitPatron               = 0;
            _riesgoTrabajoPatron           = 0;
            _totalPatron                   = 0;
            _totalObrero                   = 0;
            _SDI                           = 0;
            _idNomina                      = 0;
            _idFiniquito                   = 0;
            _SD = 0;



            resultadoCuotas = CuotasImss2(salarioMinimoGeneral, uma, primaRiesgo, nomina, finiquito, usarUMA, diasDelPeriodo, permisosSinG: permisosSinGoce);

            if (diasDelPeriodo == diasIncapacidad)
            {
                resultadoCuotas.CesantiaVejez_Patron          = 0;
                resultadoCuotas.Cuota_Fija_Patron             = 0;
                resultadoCuotas.Excedente_Patron              = 0;
                resultadoCuotas.GuarderiasPrestaciones_Patron = 0;
                resultadoCuotas.InvalidezVida_Patron          = 0;
                resultadoCuotas.Pensionados_Patron            = 0;
                resultadoCuotas.PrestacionesDinero_Patron     = 0;
                resultadoCuotas.RiesgoTrabajo_Patron          = 0;
                resultadoCuotas.TotalPatron = (resultadoCuotas.SeguroRetiro_Patron + resultadoCuotas.Infonavit_Patron);
                resultadoCuotas.TotalObrero = 0;
            }
            //A) Si dias de incapacidad es de 1 a 3 - se toman como faltas
            //queda igual como vienen los datos de la nomina en diasLaborados

            //B) Si dias de incapacidad es > 3 y < a los dias del periodo - el patron paga los dias restantes
            //if(diasIncapacidad >3 && diasIncapacidad < diasDelPeriodo)
            //{
            //    //para calcular nuevamente anexando los dias de incapacidad,
            //    //y esto es lo que será pagado por el patron

            //    nomina.Dias_Laborados += diasIncapacidad;

            //    var nuevoCalculo = CuotasImss2(salarioMinimoGeneral, uma, primaRiesgo, nomina, finiquito, usarUMA, diasDelPeriodo);

            //    //Ese nuevo calculo se actualiza el registro solo del lado del patron
            //    resultadoCuotas.TotalPatron = nuevoCalculo.TotalPatron;
            //    resultadoCuotas.Cuota_Fija_Patron = nuevoCalculo.Cuota_Fija_Patron;
            //    resultadoCuotas.Excedente_Patron = nuevoCalculo.Excedente_Patron;
            //    resultadoCuotas.PrestacionesDinero_Patron = nuevoCalculo.PrestacionesDinero_Patron;
            //    resultadoCuotas.Pensionados_Patron = nuevoCalculo.Pensionados_Patron;
            //    resultadoCuotas.InvalidezVida_Patron = nuevoCalculo.InvalidezVida_Patron;
            //    resultadoCuotas.GuarderiasPrestaciones_Patron = nuevoCalculo.GuarderiasPrestaciones_Patron;
            //    resultadoCuotas.SeguroRetiro_Patron = nuevoCalculo.SeguroRetiro_Patron;
            //    resultadoCuotas.CesantiaVejez_Patron = nuevoCalculo.CesantiaVejez_Patron;
            //    resultadoCuotas.Infonavit_Patron = nuevoCalculo.Infonavit_Patron;
            //    resultadoCuotas.RiesgoTrabajo_Patron = nuevoCalculo.RiesgoTrabajo_Patron;
            //}

            //C) Si los dias de incapacidad es los mismos dias que el periodo -  el patro paga toda la cuota imss
            //queda igual, ya que si el dias laborados es cero, todo lo paga el patron como relativoPatronal


            //Guarda los datos en la Tabla Cuotas Imss
            _nominasDao.AddCuotasImss(resultadoCuotas);


            if (relativoPatronal != true)
            {
                _totalObrero = resultadoCuotas.TotalObrero;
                //Guardar el concepto en detalle de la nomina
                MDeducciones.Imss(_totalObrero, idNomina: _idNomina, idFiniquito: _idFiniquito);
            }
            else
            {
                _totalObrero = 0;
            }


            //Objeto utilizado en el metodo del procesado para la sumatoria de la nomina con los demas conceptos
            var totalConcepto = new TotalConcepto
            {
                Total = _totalObrero,
                ImpuestoSobreNomina = 0,
                TotalObligaciones   = 0
            };

            return(totalConcepto);
        }
Exemplo n.º 20
0
        /// <summary>
        /// Metodo que genera las cuotas imss -
        /// NOM_Nomina - para obetener los datos de la nomina como Id, SD, SDI, dias laborados,
        /// </summary>
        /// <param name="nomina"></param>
        /// <param name="zsalarial"></param>
        /// <param name="primaRiesgo"></param>
        /// <param name="finiquito"></param>
        private static NOM_Cuotas_IMSS CuotasImss2(decimal salarioMinimoGeneral, decimal uma, decimal?primaRiesgo, NOM_Nomina nomina = null, NOM_Finiquito finiquito = null, bool usarUMA = true, int diasDelPeriodo = 0, int permisosSinG = 0)
        {
            //Relativo Patron = 0 dias laborados de un colaborador que aun esta dado de alta

            //PARAMETROS DE CONFIGURACION
            _usarUMAParaCalculo = usarUMA;

            //A) FACTOR VECES SALARIO MINIMO
            var factorSalarioMinimoGeneralVigente = _nominasDao.GetValorParametrosConfig(ParametrosDeConfiguracion.FSMGV); //para obtener el numero de veces del Salario minimo

            if (factorSalarioMinimoGeneralVigente != null)
            {
                if (factorSalarioMinimoGeneralVigente != null)
                {
                    _factorVeces = (int)factorSalarioMinimoGeneralVigente.ValorInt;//al momento del desarrollo es 3
                }
            }

            //validacion
            if (nomina == null && finiquito == null)
            {
                return(null);
            }
            //si ambos objetos contienen datos
            //la prioridad es nomina - entonces finiquito seteamos a null
            if (nomina != null)
            {
                finiquito = null;
            }

            //Anteriormente se obtenia los dias Laborados del finiquito, pero se cambio a que sean los dias del periodo -> solitud por alondra
            _diasLaborados = nomina?.Dias_Laborados ?? diasDelPeriodo;//finiquito.DiasLaborados;// aqui cambiar por los dias de periodicidad de pago en el contrato - incidencias
            _zonaSalarial  = _usarUMAParaCalculo == true ? uma : salarioMinimoGeneral;

            _SDI = nomina?.SDI ?? finiquito.SDI;

            _idNomina    = nomina?.IdNomina ?? 0;        //si el metodo es ejecutado desde el procesado de la nomina, se toma el idNomina
            _idFiniquito = finiquito?.IdFiniquito ?? 0;  //si el metodo es ejecuta desde el procesado del finiquito, se toma el id del finiquito sino se inicializa a cero
            _SD          = nomina?.SD ?? finiquito.SD;
            _sbc         = nomina?.SBC ?? finiquito.SBC; // Salario Base de Cotizacion

            var tablaImss = _nominasDao.GeTablaImss();

            //Regla PS - se concidera los Permiso sin Goce para el calculo de las cuotas
            if (nomina != null && permisosSinG > 0)
            {
                //validamos si los dias de PS son igual que los dias del periodo
                //es decir que tiene Permisos sin goce en todo los dias de la nomina

                if (permisosSinG == diasDelPeriodo)
                {
                    _diasLaborados = 0;//se consideran como faltas y el pago de las cuotas las pagará el patron
                }
                else
                {
                    _diasLaborados += permisosSinG;//? si son 15 dias de PS se calculará la parte obrera y patron ?  es decir, lo no absorvera el patron el total?
                }
            }


            //Si los dias laborados es igual a cero
            //entonces se toma el dia del periodo, para el cálculo de los relativos que se cobrará al patron
            if (_diasLaborados == 0)
            {
                _diasLaborados   = diasDelPeriodo;
                relativoPatronal = true;
            }



            //1) Cuota fija
            #region CUOTA FIJA

            //1   Especie - Cuota Fija    20.400  0.000
            var itemCutoaFija = tablaImss.FirstOrDefault(x => x.IdIMSS == 1);

            var cuotaFija = _diasLaborados * _zonaSalarial;

            if (itemCutoaFija != null)
            {
                _cuotaFijaPatron = cuotaFija * (itemCutoaFija.Patron / 100);
            }

            #endregion

            //Excedentes
            #region EXCEDENTES
            //se busca el registro en la bd para obtener los porcentajes Patron-Obrero
            var itemExcedente = tablaImss.FirstOrDefault(x => x.IdIMSS == 2);

            if (itemExcedente != null)
            {
                _smgv = _zonaSalarial * _factorVeces; // Salario Minimo General Vigente o UMA

                decimal R1P = 0;
                decimal R2O = 0;

                if (_smgv > _sbc)
                {
                    R1P = 0;
                }
                else
                {
                    R1P = ((_sbc - _smgv) * (itemExcedente.Patron / 100)) * _diasLaborados;
                    R2O = ((_sbc - _smgv) * (itemExcedente.Obrero / 100)) * _diasLaborados;
                }
                _excedentePatron = R1P;
                _excedenteObrero = R2O;

                //               decimal R2P = 0;
                //decimal R2O = 0;

                //    //Calcular Excedente Patron
                //    R2P = R1P * (itemExcedente.Patron / 100);
                //    _excedentePatron = R2P * _diasLaborados;

                //    if (_excedentePatron < 0)
                //    {
                //        _excedentePatron = 0;
                //    }
                //    //Calcular Exedente Obrero
                //    R2O = R1P * (itemExcedente.Obrero / 100);
                //    _excedenteObrero = R2O * _diasLaborados;
                //    if (_excedenteObrero < 0)
                //    {
                //        _excedenteObrero = 0;
                //    }
            }

            #endregion

            //3) Prestaciones en Dinero
            #region PRESTACIONES EN DINERO

            var itemPrestacionesDinero = tablaImss.FirstOrDefault(x => x.IdIMSS == 3);

            if (itemPrestacionesDinero != null)
            {
                _prestacionesDineroPatron = (_sbc * (itemPrestacionesDinero.Patron / 100)) * _diasLaborados;
                _prestacionesDineroObrero = (_sbc * (itemPrestacionesDinero.Obrero / 100)) * _diasLaborados;
            }

            #endregion

            //4) Pensionados y Beneficiados
            #region PENSIONADOS Y BENEFICIADOS

            var itemPensionados = tablaImss.FirstOrDefault(x => x.IdIMSS == 4);

            if (itemPensionados != null)
            {
                _pencionadosBeneficiadosPatron = (_sbc * (itemPensionados.Patron / 100)) * _diasLaborados;
                _pencionadosBeneficiadosObrero = (_sbc * (itemPensionados.Obrero / 100)) * _diasLaborados;
            }

            #endregion

            //5) Invalidez y Vida
            #region INVALIDEZ Y VIDA

            var itemIvalidez = tablaImss.FirstOrDefault(x => x.IdIMSS == 5);

            if (itemIvalidez != null)
            {
                _invalidezVidaPatron = (_sbc * (itemIvalidez.Patron / 100)) * _diasLaborados;
                _invalidezVidaObrero = (_sbc * (itemIvalidez.Obrero / 100)) * _diasLaborados;
            }

            #endregion

            //6) Guarderia
            #region GUARDERÍA

            var itemGuardería = tablaImss.FirstOrDefault(x => x.IdIMSS == 6);

            if (itemGuardería != null)
            {
                _guarderiasPatron = (_sbc * (itemGuardería.Patron / 100)) * _diasLaborados;
            }

            #endregion

            //7) Seguro de Retiro
            #region SEGURO DE RETIRO

            var itemSeguro = tablaImss.FirstOrDefault(x => x.IdIMSS == 7);

            if (itemSeguro != null)
            {
                _seguroRetiroPatron = (_sbc * (itemSeguro.Patron / 100)) * _diasLaborados;
            }

            #endregion

            //8) Cesantía y Vejez
            #region CESANTÍA Y VEJEZ

            var itemCesantia = tablaImss.FirstOrDefault(x => x.IdIMSS == 8);

            if (itemCesantia != null)
            {
                _cesantiaVejezPatron = (_sbc * (itemCesantia.Patron / 100)) * _diasLaborados;
                _cesantiaVejezObrero = (_sbc * (itemCesantia.Obrero / 100)) * _diasLaborados;
            }

            #endregion

            //9) Infonavit
            #region INFONAVIT

            var itemInfonavit = tablaImss.FirstOrDefault(x => x.IdIMSS == 9);

            if (itemInfonavit != null)
            {
                _infonavitPatron = (_sbc * (itemInfonavit.Patron / 100)) * _diasLaborados;
            }

            #endregion

            //10) Riesgo de Trabajo
            #region RIESGO DE TRABAJO

            var riesgoTrabajo = primaRiesgo ?? 0;

            _riesgoTrabajoPatron = (_sbc * ((decimal)riesgoTrabajo / 100)) * _diasLaborados;

            #endregion

            //Sumatoria
            #region TOTAL PATRON, TOTAL OBRERO
            //Si el Salario Diario es menor o igual al SMG las cuotas del obrero lo pagará el patron
            if (_SD <= salarioMinimoGeneral)
            {
                _totalPatron = _cuotaFijaPatron + _excedentePatron + _prestacionesDineroPatron +
                               _pencionadosBeneficiadosPatron +
                               _invalidezVidaPatron + _guarderiasPatron + _seguroRetiroPatron + _cesantiaVejezPatron +
                               _infonavitPatron + _riesgoTrabajoPatron + _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero +
                               _invalidezVidaObrero + _cesantiaVejezObrero;

                _totalObrero = 0;
            }
            else
            {
                _totalObrero = _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero +
                               _invalidezVidaObrero + _cesantiaVejezObrero; _totalPatron = _cuotaFijaPatron + _excedentePatron + _prestacionesDineroPatron +
                                                                                           _pencionadosBeneficiadosPatron +
                                                                                           _invalidezVidaPatron + _guarderiasPatron + _seguroRetiroPatron + _cesantiaVejezPatron +
                                                                                           _infonavitPatron + _riesgoTrabajoPatron;

                _totalObrero = _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero +
                               _invalidezVidaObrero + _cesantiaVejezObrero;
            }


            #endregion

            //Si el Salario diario es igual o menor al salario minimo
            // las cuota las paga el patron.
            // O si los dias laborados es cero, pero el colaborar esta activo las cuotas las paga el patron
            if (_SD <= salarioMinimoGeneral || relativoPatronal == true)
            {
                var cuotasImss = new NOM_Cuotas_IMSS()
                {
                    IdCuota                       = 0,
                    IdNomina                      = nomina?.IdNomina ?? 0,
                    IdFiniquito                   = finiquito?.IdFiniquito ?? 0,
                    Cuota_Fija_Patron             = Utils.TruncateDecimales(_cuotaFijaPatron),
                    Excedente_Patron              = Utils.TruncateDecimales((_excedentePatron + _excedenteObrero)),
                    Excedente_Obrero              = 0,
                    PrestacionesDinero_Patron     = Utils.TruncateDecimales((_prestacionesDineroPatron + _prestacionesDineroObrero)),
                    PrestacionesDinero_Obrero     = 0,
                    Pensionados_Patron            = Utils.TruncateDecimales((_pencionadosBeneficiadosPatron + _pencionadosBeneficiadosObrero)),
                    Pensionados_Obrero            = 0,
                    InvalidezVida_Patron          = Utils.TruncateDecimales((_invalidezVidaPatron + _invalidezVidaObrero)),
                    InvalidezVida_Obrero          = 0,
                    GuarderiasPrestaciones_Patron = Utils.TruncateDecimales(_guarderiasPatron),
                    SeguroRetiro_Patron           = Utils.TruncateDecimales(_seguroRetiroPatron),
                    CesantiaVejez_Patron          = Utils.TruncateDecimales((_cesantiaVejezPatron + _cesantiaVejezObrero)),
                    CesantiaVejez_Obrero          = 0,
                    Infonavit_Patron              = Utils.TruncateDecimales(_infonavitPatron),
                    RiesgoTrabajo_Patron          = Utils.TruncateDecimales(_riesgoTrabajoPatron),
                    TotalPatron                   = Utils.TruncateDecimales(_totalPatron),
                    TotalObrero                   = Utils.TruncateDecimales(_totalObrero)
                };
                // _nominasDao.AddCuotasImss(cuotasImss);

                return(cuotasImss);
            }
            else
            {
                var cuotasImss = new NOM_Cuotas_IMSS()
                {
                    IdCuota                       = 0,
                    IdNomina                      = nomina?.IdNomina ?? 0,
                    IdFiniquito                   = finiquito?.IdFiniquito ?? 0,
                    Cuota_Fija_Patron             = Utils.TruncateDecimales(_cuotaFijaPatron),
                    Excedente_Patron              = Utils.TruncateDecimales(_excedentePatron),
                    Excedente_Obrero              = Utils.TruncateDecimales(_excedenteObrero),
                    PrestacionesDinero_Patron     = Utils.TruncateDecimales(_prestacionesDineroPatron),
                    PrestacionesDinero_Obrero     = Utils.TruncateDecimales(_prestacionesDineroObrero),
                    Pensionados_Patron            = Utils.TruncateDecimales(_pencionadosBeneficiadosPatron),
                    Pensionados_Obrero            = Utils.TruncateDecimales(_pencionadosBeneficiadosObrero),
                    InvalidezVida_Patron          = Utils.TruncateDecimales(_invalidezVidaPatron),
                    InvalidezVida_Obrero          = Utils.TruncateDecimales(_invalidezVidaObrero),
                    GuarderiasPrestaciones_Patron = Utils.TruncateDecimales(_guarderiasPatron),
                    SeguroRetiro_Patron           = Utils.TruncateDecimales(_seguroRetiroPatron),
                    CesantiaVejez_Patron          = Utils.TruncateDecimales(_cesantiaVejezPatron),
                    CesantiaVejez_Obrero          = Utils.TruncateDecimales(_cesantiaVejezObrero),
                    Infonavit_Patron              = Utils.TruncateDecimales(_infonavitPatron),
                    RiesgoTrabajo_Patron          = Utils.TruncateDecimales(_riesgoTrabajoPatron),
                    TotalPatron                   = Utils.TruncateDecimales(_totalPatron),
                    TotalObrero                   = Utils.TruncateDecimales(_totalObrero)
                };
                //   _nominasDao.AddCuotasImss(cuotasImss);
                return(cuotasImss);
            }

            //if (relativoPatronal != true)
            //{
            //    //Guardar el concepto en detalle de la nomina
            //    MDeducciones.Imss(_totalObrero, idNomina: _idNomina, idFiniquito: _idFiniquito);
            //}
            //else
            //{
            //    _totalObrero = 0;
            //}


            ////Obeto utilizado en el metodo del procesado para la sumatoria de la nomina con los demas conceptos
            //var totalConcepto = new TotalConcepto
            //{
            //    Total = _totalObrero,
            //    ImpuestoSobreNomina = 0,
            //    TotalObligaciones = 0
            //};

            //return totalConcepto;
        }
Exemplo n.º 21
0
 public static void GenerarPercepciones(NOM_Nomina nomina, bool isImpuesSobreNomina = false, decimal porcentaje = 0)
 {
 }
Exemplo n.º 22
0
 /// <summary>
 /// Prestamo Fonacot = 26
 /// </summary>
 /// <param name="nomina"></param>
 /// <returns></returns>
 public static List <NOM_Nomina_Detalle> PrestamoFonacot(NOM_Nomina nomina, NOM_PeriodosPago periodoPago)
 {
     return(CalculoDeFonacot(nomina, periodoPago));
 }
Exemplo n.º 23
0
 /// <summary>
 /// Prestamo Infonavit = 25
 /// </summary>
 /// <param name="nomina"></param>
 /// <param name="periodoPago"></param>
 /// <returns></returns>
 public static NOM_Nomina_Detalle PrestamoInfonavit(NOM_Nomina nomina, NOM_PeriodosPago periodoPago, int dias)
 {
     return(CalculoDeInfonavit(nomina, periodoPago, dias));
 }
Exemplo n.º 24
0
        private static List <NOM_Nomina_Detalle> CalculoDeFonacot(NOM_Nomina nomina, NOM_PeriodosPago periodoPago)
        {
            decimal  totalDescuento = 0;
            DateTime fechaServidor  = DateTime.Now;
            List <NOM_Nomina_Detalle> listaFonacot = new List <NOM_Nomina_Detalle>();

            //1) Obtener los creditos fonacot
            var prestamosFonacot = NominasDao.GetPrestamosFonacotByIdContrato(nomina.IdContrato);

            if (prestamosFonacot.Count > 0)
            {
                //2) Por cada prestamo se obtiene su monto de descuento y se guarda en el detalle de la nomina con el id del Prestamo fonacot
                foreach (var prestamo in prestamosFonacot)
                {
                    //validar Saldo > 0
                    if (prestamo.Saldo <= 0)
                    {
                        continue;                      // nueva iteracion del for
                    }
                    //validar Fecha de Inicio del Descuento
                    //if (fechaServidor < prestamo.FechaInicioDescuento) continue;
                    //if (  periodoPago.Fecha_Inicio > prestamo.FechaInicioDescuento || periodoPago.Fecha_Fin > prestamo.FechaInicioDescuento) continue;

                    if (periodoPago.Fecha_Inicio < prestamo.FechaInicioDescuento && periodoPago.Fecha_Fin < prestamo.FechaInicioDescuento)
                    {
                        continue;
                    }
                    //validar FechaSuspension
                    //if (!(fechaServidor < prestamo.FechaSuspension)) continue;

                    //validar que la retencion no sea mayor que el saldo
                    var cantidadDescuento = prestamo.Retencion > prestamo.Saldo
                        ? prestamo.Saldo
                        : prestamo.Retencion;

                    //Guardar en el detalle de la nomina
                    //GuardarConcepto(nomina.IdNomina, 52, cantidadDescuento, 0, cantidadDescuento, 0, 0,false, prestamo.Id);
                    NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
                    {
                        Id                  = 0,
                        IdNomina            = nomina.IdNomina,
                        IdConcepto          = 52,
                        Total               = Utils.TruncateDecimales(cantidadDescuento),
                        GravadoISR          = 0,
                        ExentoISR           = Utils.TruncateDecimales(cantidadDescuento),
                        IntegraIMSS         = 0,
                        ImpuestoSobreNomina = 0,
                        Complemento         = false,
                        IdPrestamo          = prestamo.Id
                    };

                    //return item;

                    listaFonacot.Add(item);


                    //Guarda el total de todos los prestamos fonacot activos
                    totalDescuento += cantidadDescuento;
                }


                return(listaFonacot);
            }

            return(null);
        }
Exemplo n.º 25
0
        private static NOM_Nomina_Detalle CalculoDeInfonavit(NOM_Nomina nomina, NOM_PeriodosPago periodoPago, int dias = -1)
        {
            decimal totalADescontar = 0;
            //   DateTime fechaServidor = DateTime.Now;
            int diasDeDescuento = 0;

            if (dias >= 0)
            {
                diasDeDescuento = dias;
            }
            else
            {
                diasDeDescuento = nomina.Dias_Laborados;
            }


            //1) Obtener el prestamo infonavit de la tabla Prestamos pasando el Id del contrato
            var prestamoInfonavit = NominasDao.GetPrestamoInfonavitByIdContrato(nomina.IdContrato);

            //Infonavit no maneja saldo

            if (prestamoInfonavit == null)
            {
                return(null);
            }
            //Validar Fecha de inicio  del descuento

            if (periodoPago.Fecha_Inicio < prestamoInfonavit.FechaInicio && periodoPago.Fecha_Fin < prestamoInfonavit.FechaInicio)
            {
                return(null);
            }

            //if (fechaServidor >= prestamoInfonavit.FechaInicio)

            //Validar Fecha suspension
            //if (prestamoInfonavit.FechaSuspension != null)
            //{
            //    if (prestamoInfonavit.FechaSuspension > fechaServidor)
            //        return null;
            //}

            //Validar Fecha de Suspension del descuentos
            //if (fechaServidor < prestamoInfonavit.FechaSuspension)
            //{
            RH.BLL.Infonavit inf = new RH.BLL.Infonavit();
            if (diasDeDescuento > 0)
            {
                //CALCULO DEL CREDITO -
                var calculo = inf.GetInfonavitById(prestamoInfonavit.Id);
                totalADescontar = diasDeDescuento * calculo.DescuentoDiario;
            }

            //Se guarda como detalle de la nomina
            //GuardarConcepto(nomina.IdNomina, 51, totalADescontar, 0, totalADescontar, 0, 0, false, prestamoInfonavit.Id);

            NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
            {
                Id                  = 0,
                IdNomina            = nomina.IdNomina,
                IdConcepto          = 51,
                Total               = Utils.TruncateDecimales(totalADescontar),
                GravadoISR          = 0,
                ExentoISR           = Utils.TruncateDecimales(totalADescontar),
                IntegraIMSS         = 0,
                ImpuestoSobreNomina = 0,
                Complemento         = false,
                IdPrestamo          = prestamoInfonavit?.Id ?? 0
            };

            return(item);

            //}
        }
Exemplo n.º 26
0
        public static List <NOM_Nomina_Detalle> HorasExtras(NOM_Nomina nomina, decimal salarioMin, NOM_PeriodosPago periodoPago, bool isImpuestoSobreNomina = false, decimal porcentaje = 0)
        {
            decimal sd           = nomina.SD;
            decimal limiteExento = 0;
            int     horasExtras  = 0;

            decimal valorDobles  = 0;
            decimal valorTriples = 0;

            int horasDobles  = 0;
            int horasTriples = 0;

            int diasD = 0;
            int diasT = 0;
            int tipo  = 0;

            decimal isnDobles  = 0;
            decimal isnTriples = 0;

            List <NOM_Nomina_Detalle> listaDetalles = new List <NOM_Nomina_Detalle>();

            //GetData()
            //Validar el rango de fechas del periodo
            //Recibo
            //integrar al xml

            //Para obtener los dias, no solo sera con el count sino revisar que no sean las mismas fechas

            List <HorasExtrasEmpleado> listaGeneral = NominasDao.GetHorasExtras(nomina.IdEmpleado, periodoPago);

            listaGeneral = listaGeneral.OrderBy(x => x.Fecha).ToList();

            if (listaGeneral.Count <= 0)
            {
                return(null);
            }

            List <HorasExtrasEmpleado> listaSimples = listaGeneral.Where(x => x.Simples == true).ToList();

            List <HorasExtrasEmpleado> listaDobleTriples = listaGeneral.Where(x => x.Simples == false).ToList();

            #region SIMPLES

            if (listaSimples.Count > 0)
            {
                int horasTotalesSimples = 0;

                horasTotalesSimples = listaSimples.Sum(x => x.Horas);

                //limte exento
                decimal limiteExentoSimple = salarioMin * 5;

                decimal gravadoSimple1     = 0;
                decimal exentoSimple       = 0;
                decimal gravadoSimple2     = 0;
                decimal totalGravadoSimple = 0;
                decimal mitadSimple        = 0;
                decimal totalSimples       = 0;
                int     diasSimples        = 0;
                decimal isnSimples         = 0;

                diasSimples = listaSimples.Select(x => x.Fecha).Distinct().Count();;

                totalSimples = sd * horasTotalesSimples;

                mitadSimple = totalSimples / 2;

                //gravado 1
                gravadoSimple1 = mitadSimple;

                //gravado 2
                if (mitadSimple > limiteExentoSimple)
                {
                    gravadoSimple2 = mitadSimple;
                }
                else
                {
                    //exento
                    exentoSimple = mitadSimple;
                }

                totalGravadoSimple = gravadoSimple1 + gravadoSimple2;

                isnSimples = totalSimples * porcentaje;

                NOM_Nomina_Detalle itemS = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 14,
                    Total               = Utils.TruncateDecimales(totalSimples),
                    GravadoISR          = Utils.TruncateDecimales(totalGravadoSimple),
                    ExentoISR           = exentoSimple,
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = isnSimples, //genera impuesto sobre nomina ?
                    Complemento         = false,
                    DiasHE              = diasSimples,
                    TipoHE              = 3,
                    HorasE              = horasTotalesSimples
                };

                if (itemS.Total > 0)
                {
                    listaDetalles.Add(itemS);
                }
            }

            #endregion

            #region HORAS DOBLES TRIPLES

            if (listaDobleTriples.Count > 0)
            {
                int horasTotales = listaDobleTriples.Sum(x => x.Horas);

                if (horasTotales > 9) //
                {
                    int cont = 0;
                    int indx = 1;

                    DateTime hold        = new DateTime(1999, 1, 1);
                    int      diasDoble   = 0;
                    int      diasTriples = 0;

                    foreach (var item in listaDobleTriples)
                    {
                        if (hold != item.Fecha && cont < 9)
                        {
                            hold = item.Fecha;
                            //incrementa dias d y cont
                            diasDoble++;
                            cont += item.Horas;

                            if (cont > 9)
                            {
                                diasTriples++;
                            }
                        }
                        else if (cont <= 9)
                        {
                            //solo incrementa cont
                            cont += item.Horas;

                            if (cont > 9)
                            {
                                diasTriples++;
                            }
                        }
                        else if (hold != item.Fecha && cont > 9)
                        {
                            hold = item.Fecha;
                            //incrementa dias t y cont
                            diasTriples++;
                            cont += item.Horas;
                        }
                        else
                        {
                            //solo incrementa cont
                            cont += item.Horas;
                        }
                        //    cont = item.Horas;
                        //if (cont < 9)
                        //{
                        //    indx++;
                        //}
                        //else
                        //{
                        //    diasD = indx;
                        //    break;
                        //}
                    }

                    //diasT = listaDobleTriples.Count - diasD;
                    diasD = diasDoble;
                    diasT = diasTriples;

                    horasDobles  = 9;
                    horasTriples = horasTotales - 9;
                }
                else
                {
                    diasD       = listaDobleTriples.Select(x => x.Fecha).Distinct().Count();
                    horasDobles = horasTotales;
                }

                //limte exento
                limiteExento = salarioMin * 5;

                valorDobles  = 2 * sd;
                valorTriples = 3 * sd;

                //total horas dobles
                decimal totalDobles = horasDobles * valorDobles;

                //total horas triples
                decimal totalTriples = horasTriples * valorTriples;

                //total a pagat
                decimal totalPago = totalDobles + totalTriples;

                //GRAVADOS
                //DIVIDMOS EN DOS LAS PARTE DE LAS HORAS DOBLES
                decimal gravado2     = 0;
                decimal exento       = 0;
                decimal gravado1     = 0;
                decimal totalGravado = 0;

                decimal mitadDobles = totalDobles / 2;

                //gravado 1
                gravado1 = mitadDobles;

                //gravado 2
                if (mitadDobles > limiteExento)
                {
                    gravado2 = mitadDobles;
                }
                else
                {
                    //exento
                    exento = mitadDobles;
                }

                totalGravado = gravado1 + gravado2;

                //1 dobles
                //2 triples
                //3 simples
                isnDobles = totalDobles * porcentaje;
                NOM_Nomina_Detalle itemD = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 14,
                    Total               = Utils.TruncateDecimales(totalDobles),
                    GravadoISR          = Utils.TruncateDecimales(totalGravado),
                    ExentoISR           = exento,
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = isnDobles, //genera impuesto sobre nomina ?
                    Complemento         = false,
                    DiasHE              = diasD,
                    TipoHE              = 1,
                    HorasE              = horasDobles
                };

                isnTriples = totalTriples * porcentaje;
                NOM_Nomina_Detalle itemT = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 14,
                    Total               = Utils.TruncateDecimales(totalTriples),
                    GravadoISR          = Utils.TruncateDecimales(totalTriples),
                    ExentoISR           = 0,
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = isnTriples, //genera impuesto sobre nomina ?
                    Complemento         = false,
                    DiasHE              = diasT,
                    TipoHE              = 2,
                    HorasE              = horasTriples
                };

                if (itemD.Total > 0)
                {
                    listaDetalles.Add(itemD);
                }
                if (itemT.Total > 0)
                {
                    listaDetalles.Add(itemT);
                }
            }

            #endregion

            return(listaDetalles);
        }
Exemplo n.º 27
0
        //private static List<int> CalcularAguinaldo(Dictionary<int, int> datosEmpleado, int idEjercicio, int idPeriodo, DateTime fechaUltimoDia, int idSucursal, int idUsuario)
        //{
        //    //PARAMETROS CON LA LISTA DE LAS FALTAS MODIFICADAS -
        //    //PARA APLICARLO AL CALCULO

        //    //Variables -
        //    int faltas = 0;
        //    int diasEjercicioFiscal = 365;//Obtener desde la BD
        //    List<int> aguinaldosGenerados = new List<int>();//guarda los registros de aguinaldos generados

        //    var listaKey = datosEmpleado.Select(x => x.Key).ToArray();

        //    //Contratos de los emplados - activos
        //    var listaContratos = _NominasDao.GetContratoEmpleados(listaKey, idSucursal);

        //    //Zona Salarial
        //    var zonaSalarial = _NominasDao.GetZonaSalario(); //Zona de Salario 73.04

        //    //Dias del Ejercicio
        //    var ejercicioFiscal = _NominasDao.GetEjercicioFiscal(idEjercicio);
        //    diasEjercicioFiscal = ejercicioFiscal.Dias;


        //    //Por cada Empleado
        //    foreach (var contrato in listaContratos)
        //    {
        //        //fecha inicial
        //        var fechaInicialFiscal = contrato.FechaAlta;
        //        var fechaInicialReal = contrato.FechaReal;

        //        //Si fecha Inicial Fiscal es menor a 01-01-del Año Actual se pondra 01-01-del año actual = 01-01-2016


        //        //dias laborados del año
        //        decimal diasLaboradosFiscal = Utils.GetDiasEntreDosFechas(fechaInicialFiscal, fechaUltimoDia);
        //        decimal diasLaboradosComplemento = Utils.GetDiasEntreDosFechas(fechaInicialReal, fechaUltimoDia);

        //        //Dias aguinaldo de la Tabla Factor de Integracion
        //        var añosAntiguedad = fechaUltimoDia.Year - contrato.FechaAlta.Year;
        //        var añosAntiguedadReal = fechaUltimoDia.Year - contrato.FechaReal.Year;

        //        var factorIntegracion = NominasDao.GetFactoresIntegracionByAntiguedad(añosAntiguedad);
        //        var diasAguinaldoCorrespondiente = factorIntegracion.DiasAguinaldo;//obtener desde la BD

        //        // Faltas e inasistencias -- ?? - OBTENERLAS DESDE LA VISTA - PARA RECIBIRLO COMO PARAMETRO
        //        var faltasDescontar = datosEmpleado.Where(x => x.Key == contrato.IdEmpleado).Select(p => p.Value).FirstOrDefault();
        //        faltas = faltasDescontar;

        //        //Dias proporcional de pago de los 15 dias correspondientes del año
        //        var diasCorrespondienteFiscal = ((diasLaboradosFiscal - faltas) * diasAguinaldoCorrespondiente) / diasEjercicioFiscal;
        //        var diasCorrespondienteReal = ((diasLaboradosComplemento - faltas) * diasAguinaldoCorrespondiente) / diasEjercicioFiscal;

        //        //Total Fiscal
        //        var TotalFiscal = diasCorrespondienteFiscal * contrato.SD;
        //        //Total Real
        //        var totalReal = diasCorrespondienteReal * contrato.SalarioReal;
        //        //Tope Fiscal
        //        var TopeFiscal = 30 * zonaSalarial.SMG;
        //        //Excento
        //        var exento = TotalFiscal > TopeFiscal ? TopeFiscal : TotalFiscal;
        //        //Gravado
        //        var Gravado = TopeFiscal > TotalFiscal ? (TotalFiscal - TopeFiscal) : 0;
        //        //Complemento
        //        var TotalComplemento = totalReal - TotalFiscal;
        //        //Total Aguinaldo
        //        var TotalAguinaldo = TotalComplemento + TotalFiscal;

        //        //Guardar el registro en la Base de Datos
        //        NOM_Aguinaldo itemAguinaldo = new NOM_Aguinaldo()
        //        {
        //            IdAguinaldo = 0,
        //            IdPeriodo = idPeriodo,
        //            IdContrato = contrato.IdContrato,
        //            IdEmpleado = contrato.IdEmpleado,
        //            DiasAguinaldoFiscal = diasAguinaldoCorrespondiente,
        //            DiasAguinaldoReal = diasAguinaldoCorrespondiente,
        //            SD = contrato.SD,
        //            SDReal = contrato.SalarioReal,
        //            SalarioMinimo = zonaSalarial.SMG,
        //            FechaAlta = contrato.FechaAlta,
        //            FechaAntiguedad = contrato.FechaReal,
        //            FechaUltimoDia = fechaUltimoDia,
        //            FechaInicialFiscal = fechaInicialFiscal,
        //            FechaInicialReal = fechaInicialReal,
        //            TotalFaltas = faltas,
        //            Incapacidades = 0,
        //            FaltasInjustificadas = 0,
        //            PermisoSinGose = 0,
        //            DiasEjercicioFiscal = diasEjercicioFiscal,
        //            DiasLaboradosFiscal = (int)diasLaboradosFiscal,
        //            DiasLaboradosComplemento = (int)diasLaboradosComplemento,
        //            DiasCorrespondientesFiscal = diasCorrespondienteFiscal,
        //            DiasCorrespondientesComplemento = diasCorrespondienteReal,
        //            TotalFiscal = TotalFiscal,
        //            TopeFiscal = TopeFiscal,
        //            Excento = exento,
        //            Gravado = Gravado,
        //            TotalReal = totalReal,
        //            Complemento = TotalComplemento,
        //            TotalAguinaldoNeto = TotalAguinaldo

        //        };

        //        _NominasDao.AddAguinaldo(itemAguinaldo);
        //        aguinaldosGenerados.Add(itemAguinaldo.IdAguinaldo);
        //    }

        //    return aguinaldosGenerados;
        //}

        private static List <NotificationSummary> CalcularAguinaldoA(int[] arrayIdEmpleado, string[] faltasCapturadas, bool[] generarPensionAlimenticia, int idPeriodo, int idCliente, int idSucursal, int idUsuario, bool anual)
        {
            List <NotificationSummary> summaryList = new List <NotificationSummary>();

            //VARIABLES
            decimal  sm            = 0;
            int      dias          = 30;
            decimal  sd            = 0;
            decimal  sdi           = 0;
            int      diasAguinaldo = 15;//default
            int      diasEjercicio = 365;
            DateTime primerDia;
            DateTime fechaUltimoDia;
            DateTime fechaIngreso       = DateTime.Now;
            int      faltas             = 0;
            int      faltaPersonalizada = -1;
            int      diasTrabajados     = 0;
            decimal  sueldoMensual      = 0;
            decimal  proporcion         = 0;
            decimal  topeExento         = 0;
            decimal  aguinaldo          = 0;
            decimal  parteExento        = 0;
            decimal  parteGravado       = 0;

            decimal neto = 0;
            // decimal complemento = 0;
            decimal total              = 0;
            decimal iSobreNomina       = 0;
            decimal factor             = 0;
            decimal antiguedad         = 0;
            decimal IngresoGravable    = 0;
            decimal IngresoGravable304 = 0;
            decimal parteComplemento   = 0;

            List <NOM_Nomina> listaNominasGeneradas = new List <NOM_Nomina>();

            //Obtenemos los contratos
            List <Empleado_Contrato>     listaContratos         = new List <Empleado_Contrato>();
            List <C_FactoresIntegracion> listaFactorIntegracion = new List <C_FactoresIntegracion>();
            ZonaSalario      itemZonaSalario = new ZonaSalario();
            ParametrosConfig itemConfigISN   = new ParametrosConfig();
            NOM_PeriodosPago periodoPago     = new NOM_PeriodosPago();

            List <Incapacidades> listaIncapacidades = new List <Incapacidades>();
            List <Inasistencias> listaInasistencias = new List <Inasistencias>();
            List <Permisos>      listaPermisos      = new List <Permisos>();

            List <NOM_Empleado_Complemento> listaDatosComplementosDelPeriodo = null;

            Sucursal itemSucursal = new Sucursal();



            if (arrayIdEmpleado == null)
            {
                return(null);
            }

            if (arrayIdEmpleado.Length <= 0)
            {
                return(null);
            }

            //VALIDACION TIMBRADOS

            #region VALIDA QUE EL EMPLEADO YA TENGA SU NOMINA TIMBRADA EN ESTE PERIODO - para no conciderar en el procesado estas nominas

            NominasDao _nominasDao = new NominasDao();

            var arrayidEmpleadosCfdiGenerados = _nominasDao.GetEmpleadosIdCfdiGenerados(arrayIdEmpleado, idPeriodo);

            if (arrayidEmpleadosCfdiGenerados.Length > 0)
            {
                var idEmpSumm = string.Join(",", arrayidEmpleadosCfdiGenerados);

                summaryList.Add(new NotificationSummary()
                {
                    Reg = 0, Msg1 = $"Los empleados con id: {idEmpSumm} tienen su nominas timbradas en este periodo. \n Ya no se pueden volver a procesar.", Msg2 = ""
                });

                //Filtra los empleados que ya se timbraron
                var arrayFiltro = Utils.ElimarEnArrarDeOtroArray(arrayIdEmpleado, arrayidEmpleadosCfdiGenerados);
                arrayIdEmpleado = arrayFiltro;
            }
            #endregion

            if (arrayIdEmpleado.Length <= 0)
            {
                return(null);
            }

            //Buscamos los id de la nomina de los empleados,
            //para eliminar las nominas que hayan sido procesadas con ese id de empleado en el mismo periodo
            #region SE ELIMINA LOS REGISTROS DEL PROCESADO ANTERIOR

            var arrayIdNominas = _nominasDao.GetNominasIdByEmpleados(arrayIdEmpleado, idPeriodo);

            //si la nomina fue procesada anteriormente, se eliminan sus registros, para guardar sus nuevos valores.
            if (arrayIdNominas.Length > 0)
            {
                NominasDao.EliminarAguinaldosProcesados(arrayIdNominas);
            }


            #endregion

            #region GET DATA

            using (var context = new RHEntities())
            {
                periodoPago = context.NOM_PeriodosPago.FirstOrDefault(x => x.IdPeriodoPago == idPeriodo);

                //VALIDACIONES
                if (periodoPago == null)
                {
                    summaryList.Add(new NotificationSummary()
                    {
                        Reg = idPeriodo, Msg1 = $"No se encontró el periodo {idPeriodo}.", Msg2 = ""
                    });
                    return(null);
                }


                itemSucursal = context.Sucursal.FirstOrDefault(x => x.IdSucursal == periodoPago.IdSucursal);

                listaDatosComplementosDelPeriodo = _nominasDao.GetDatosComplementoDelPeriodo(idPeriodo);


                var fechaInicial = new DateTime(periodoPago.Fecha_Inicio.Year, periodoPago.Fecha_Inicio.Month, periodoPago.Fecha_Inicio.Day, 05, 00, 0);
                var fechaFinal   = new DateTime(periodoPago.Fecha_Fin.Year, periodoPago.Fecha_Fin.Month, periodoPago.Fecha_Fin.Day, 23, 50, 0);


                listaContratos = (from c in context.Empleado_Contrato
                                  where arrayIdEmpleado.Contains(c.IdEmpleado) &&
                                  c.Status == true
                                  select c).ToList();

                listaIncapacidades = (from i in context.Incapacidades
                                      where arrayIdEmpleado.Contains(i.IdEmpleado) &&
                                      i.FechaInicio >= fechaInicial && i.FechaInicio <= fechaFinal &&
                                      (i.IdIncapacidadesSat == 2 || i.IdIncapacidadesSat == 3)
                                      select i).ToList();     //tipo 2,3 - idEmpleado - fi y ff

                listaInasistencias = (from i in context.Inasistencias
                                      where arrayIdEmpleado.Contains(i.IdEmpleado) &&
                                      i.Fecha >= fechaInicial && i.Fecha <= fechaFinal &&
                                      (i.IdTipoInasistencia == 3 || i.IdTipoInasistencia == 4 || i.IdTipoInasistencia == 5 || i.IdTipoInasistencia == 8 || i.IdTipoInasistencia == 9 || i.IdTipoInasistencia == 10 || i.IdTipoInasistencia == 11 || i.IdTipoInasistencia == 16)
                                      select i).ToList();    // tipo 3,4,5,8,9,10,11,16 - idEmpleado - fecha-fechafin

                listaPermisos = (from p in context.Permisos
                                 where arrayIdEmpleado.Contains(p.IdEmpleado) &&
                                 p.FechaInicio >= fechaInicial && p.FechaInicio <= fechaFinal
                                 select p).ToList();    // id Empleado - FechaInicio-Fechafin

                itemZonaSalario = context.ZonaSalario.FirstOrDefault(x => x.Status == true);

                listaFactorIntegracion = context.C_FactoresIntegracion.ToList();

                //  var strNumerador = ((ParametrosDeConfiguracion)intNumerador).ToString().ToUpper();

                int idConfig = (int)ParametrosDeConfiguracion.ISN;

                itemConfigISN = context.ParametrosConfig.FirstOrDefault(x => x.IdConfig == idConfig);
            }


            #endregion

            //primerDia = periodoPago.Fecha_Inicio;
            fechaUltimoDia = periodoPago.Fecha_Fin;

            if (itemZonaSalario != null)
            {
                sm = itemZonaSalario.UMA;
            }


            diasEjercicio = Utils.GetDiasDelAño(fechaUltimoDia);
            topeExento    = sm * dias;

            //Listas
            List <NOM_Nomina_Detalle> listaDetalles   = new List <NOM_Nomina_Detalle>();
            List <NOM_Aguinaldo>      listaAguinaldos = new List <NOM_Aguinaldo>();


            //Por cada empleado
            int index = 0;
            foreach (var idArrayEmpleado in arrayIdEmpleado)
            {
                CalculoAnual Canual = new CalculoAnual();
                bool         anualOK = false;
                decimal      isr = 0, saldo = 0;
                bool         calcularPensionA   = true;
                decimal      pensionAlimenticia = 0;

                primerDia = periodoPago.Fecha_Inicio;
                var itemContrato = listaContratos.OrderByDescending(x => x.IdContrato).FirstOrDefault(x => x.IdEmpleado == idArrayEmpleado);

                //Validar si el contrato es null
                if (itemContrato == null)
                {
                    summaryList.Add(new NotificationSummary()
                    {
                        Reg = idArrayEmpleado, Msg1 = $"No se encontró contrato para el empleado: {idArrayEmpleado}.", Msg2 = ""
                    });

                    index++;
                    continue;
                }

                //Valida que el SD o SDI sea mayor a cero
                if (itemContrato.SD == 0 || itemContrato.SDI == 0)
                {
                    summaryList.Add(new NotificationSummary()
                    {
                        Reg = idArrayEmpleado, Msg1 = $"El contrato {itemContrato.IdContrato} tiene los valores SD: {itemContrato.SD}, SDI:{itemContrato.SDI}", Msg2 = ""
                    });

                    // index++;
                    // continue;
                }

                if (itemContrato.FechaIMSS != null)
                {
                    fechaIngreso = itemContrato.FechaIMSS.Value;

                    if (itemContrato.FechaIMSS > periodoPago.Fecha_Inicio)
                    {
                        primerDia = itemContrato.FechaIMSS.Value;
                    }
                    if (anual == true && fechaIngreso < new DateTime(DateTime.Now.Year, 1, 1))
                    {
                        anualOK = true;
                    }
                }



                #region PROCESO CALCULO

                sd             = itemContrato.SD;
                sdi            = itemContrato.SDI;
                sueldoMensual  = 0;
                diasTrabajados = 0;
                //obtenemos los años de antiguedad
                antiguedad = fechaIngreso.Year - fechaUltimoDia.Year;

                if (antiguedad == 0)
                {
                    antiguedad = 1;
                }
                //buscamos en la lista de factores los dias de aguinaldo
                var itemFactorIntegracion = listaFactorIntegracion.FirstOrDefault(x => x.Antiguedad == antiguedad);

                if (itemFactorIntegracion != null)
                {
                    diasAguinaldo = itemFactorIntegracion.DiasAguinaldo;
                }

                //FALTAS
                faltas             = 0;
                faltaPersonalizada = GetFaltaPersonalizada(faltasCapturadas[index]);

                faltas = faltaPersonalizada >= 0 ? faltaPersonalizada : GetFaltas(idArrayEmpleado, listaIncapacidades, listaInasistencias, listaPermisos);

                diasTrabajados = Utils.GetDiasEntreDosFechas(primerDia, fechaUltimoDia) - faltas;    // diasEjercicio - faltas;

                sueldoMensual = dias * sd;

                proporcion = ((decimal)diasAguinaldo * (decimal)diasTrabajados) / (decimal)diasEjercicio;

                aguinaldo = sd * proporcion;

                if (aguinaldo <= topeExento)
                {
                    parteExento  = aguinaldo;
                    parteGravado = 0;
                }
                else
                {
                    parteExento  = topeExento;
                    parteGravado = aguinaldo - topeExento;
                }

                IngresoGravable    = sueldoMensual;
                IngresoGravable304 = ((parteGravado / diasTrabajados) * (decimal)30.40) + sueldoMensual;


                if (parteGravado > 0 && !anualOK)
                {
                    var IsrAguinaldo = MNominas.CalculoIsrSubsidio174(parteGravado, sd);
                    isr = IsrAguinaldo.ResultadoIsrOSubsidio;
                }
                if (anualOK)
                {
                    if (arrayIdNominas.Length > 0)
                    {
                        NominasDao.EliminarCalculosAnuales(arrayIdNominas);
                    }

                    Canual = MNominas.GetCalculoAnualconPrevision(idArrayEmpleado, periodoPago.IdEjercicio, sd, sdi, itemContrato.IdEmpresaFiscal, parteGravado, 0);
                    isr    = Canual.ResultadoIsrOSubsidio > 0 ? Math.Abs(Canual.ResultadoIsrOSubsidio) : 0;
                    saldo  = Canual.ResultadoIsrOSubsidio < 0 ? Math.Abs(Canual.ResultadoIsrOSubsidio) : 0;
                }
                neto = aguinaldo - isr;


                //PENSION ALIMENTICIA
                if (generarPensionAlimenticia != null)
                {
                    calcularPensionA = generarPensionAlimenticia[index];
                }

                if (calcularPensionA)
                {
                    if (itemContrato.PensionAlimenticiaPorcentaje != null)
                    {
                        decimal porcentaje = 0;

                        porcentaje = itemContrato.PensionAlimenticiaPorcentaje.Value;

                        if (porcentaje > 0)
                        {
                            pensionAlimenticia = (neto * (porcentaje / 100));

                            //Se le descuenta al neto
                            if (pensionAlimenticia > 0)
                            {
                                neto = (neto - pensionAlimenticia);
                            }
                        }
                    }
                }



                //parte de complemento
                //complemento = 0;



                var porcentajeSobreNomina = (decimal)0.03;

                if (itemConfigISN != null)
                {
                    porcentajeSobreNomina = itemConfigISN.ValorDecimal;
                }

                //iSobreNomina = (sd * diasAguinaldo) * porcentajeSobreNomina; // mty
                iSobreNomina = aguinaldo * porcentajeSobreNomina;    //cancun

                iSobreNomina = iSobreNomina.TruncateDecimal(2);

                //COMPLEMENTO
                parteComplemento = 0;


                #region NUEVO CÁLCULO DE COMPLEMENTO

                //Busca en la lista de Datos de Complemento lo correspondiente al colaborador
                //Obtenemos una lista con los concentos de complemento
                var complementoEmpleado =
                    listaDatosComplementosDelPeriodo.Where(x => x.IdEmpleado == itemContrato.IdEmpleado)
                    .ToList();

                //valida que la lista no este vacia
                if (complementoEmpleado?.Count > 0)
                {
                    //Complemento que se subio en el Layout
                    var sumaTotalComplemento = complementoEmpleado.Select(x => x.Cantidad).Sum();

                    //Regla se aplico en monterrey por causa de descuento de lado de complemento
                    //donde el complemento se queda menor que el fiscal y eso genera negativo
                    //para no aplicar negativo se pondra cero
                    if (neto > sumaTotalComplemento)
                    {
                        parteComplemento = 0;
                    }
                    else
                    {
                        parteComplemento = (sumaTotalComplemento - neto.TruncateDecimal(2));
                    }
                }

                #endregion


                total = parteComplemento + neto;


                #endregion

                #region item Nomina
                //1.-Crear un item para Nominas
                //1) Crear el registro de nomina --------------------------------------------
                NOM_Nomina itemNomina = new NOM_Nomina();
                itemNomina.IdNomina                             = 0;
                itemNomina.IdCliente                            = idCliente;
                itemNomina.IdSucursal                           = idSucursal;
                itemNomina.IdEjercicio                          = periodoPago.IdEjercicio;
                itemNomina.IdPeriodo                            = idPeriodo;
                itemNomina.IdEmpleado                           = itemContrato.IdEmpleado;
                itemNomina.IdContrato                           = itemContrato.IdContrato;
                itemNomina.FechaReg                             = DateTime.Now;
                itemNomina.IdUsuario                            = idUsuario;
                itemNomina.CFDICreado                           = false;
                itemNomina.TotalNomina                          = neto;
                itemNomina.TotalPercepciones                    = 0;
                itemNomina.TotalDeducciones                     = 0;
                itemNomina.TotalOtrosPagos                      = 0;
                itemNomina.TotalComplemento                     = parteComplemento;
                itemNomina.TotalImpuestoSobreNomina             = iSobreNomina;
                itemNomina.TotalImpuestoSobreNomina_Complemento = 0;
                itemNomina.TotalObligaciones                    = 0;
                itemNomina.TotalCuotasIMSS                      = 0;
                itemNomina.TotalCuotasIMSSComplemento           = 0;
                itemNomina.SubsidioCausado                      = 0;
                itemNomina.SubsidioEntregado                    = 0;
                itemNomina.ISRantesSubsidio                     = isr;
                itemNomina.SD                       = itemContrato.SD;
                itemNomina.SDI                      = itemContrato.SDI;
                itemNomina.SBC                      = itemContrato.SBC;
                itemNomina.SDReal                   = itemContrato.SalarioReal;
                itemNomina.IdEmpresaFiscal          = itemContrato.IdEmpresaFiscal;
                itemNomina.IdEmpresaComplemento     = itemContrato.IdEmpresaComplemento;
                itemNomina.IdEmpresaAsimilado       = itemContrato.IdEmpresaAsimilado;
                itemNomina.IdEmpresaSindicato       = itemContrato.IdEmpresaSindicato;
                itemNomina.IdMetodo_Pago            = itemContrato.FormaPago;
                itemNomina.Dias_Laborados           = diasTrabajados;
                itemNomina.Faltas                   = faltas;
                itemNomina.Prima_Riesgo             = 0;
                itemNomina.TipoTarifa               = 5;//mensual
                itemNomina.SBCotizacionDelProcesado = 0;
                itemNomina.XMLSinTimbre             = null;
                itemNomina.SMGV                     = itemZonaSalario.SMG;
                itemNomina.UMA                      = itemZonaSalario.UMA;


                _NominasDao.CrearNomina(itemNomina);
                listaNominasGeneradas.Add(itemNomina);
                #endregion

                #region item Detalle Nomina


                //2.- Crear un item para Detalle de nomina
                NOM_Nomina_Detalle itemNominaDetalle = new NOM_Nomina_Detalle();
                itemNominaDetalle.Id                  = 0;
                itemNominaDetalle.IdNomina            = itemNomina.IdNomina;
                itemNominaDetalle.IdConcepto          = 2;
                itemNominaDetalle.Total               = aguinaldo;
                itemNominaDetalle.GravadoISR          = parteGravado;
                itemNominaDetalle.ExentoISR           = parteExento;
                itemNominaDetalle.IntegraIMSS         = 0;
                itemNominaDetalle.ExentoIMSS          = 0;
                itemNominaDetalle.ImpuestoSobreNomina = iSobreNomina;
                itemNominaDetalle.Complemento         = false;
                itemNominaDetalle.IdPrestamo          = 0;

                listaDetalles.Add(itemNominaDetalle);

                if (isr > 0)
                {
                    NOM_Nomina_Detalle itemDetalleIsr = new NOM_Nomina_Detalle();
                    itemDetalleIsr.Id                  = 0;
                    itemDetalleIsr.IdNomina            = itemNomina.IdNomina;
                    itemDetalleIsr.IdConcepto          = 43;
                    itemDetalleIsr.Total               = isr;
                    itemDetalleIsr.GravadoISR          = 0;
                    itemDetalleIsr.ExentoISR           = 0;
                    itemDetalleIsr.IntegraIMSS         = 0;
                    itemDetalleIsr.ExentoIMSS          = 0;
                    itemDetalleIsr.ImpuestoSobreNomina = 0;
                    itemDetalleIsr.Complemento         = false;
                    itemDetalleIsr.IdPrestamo          = 0;

                    listaDetalles.Add(itemDetalleIsr);
                }

                // datos anual

                /* if (anualOK)
                 * {
                 *   NOM_Nomina_Detalle itemanual = new NOM_Nomina_Detalle()
                 *   {
                 *       Id = 0,
                 *       IdNomina = itemNomina.IdNomina,
                 *       IdConcepto = Canual.ResultadoIsrOSubsidio < 0 ? 143 : 43,
                 *       Total = Math.Abs(Canual.ResultadoIsrOSubsidio),
                 *       GravadoISR = 0,
                 *       ExentoISR = 0,
                 *       IntegraIMSS = 0,
                 *       ImpuestoSobreNomina = 0,
                 *       Complemento = false
                 *
                 *   };
                 *
                 *   listaDetalles.Add(itemanual);
                 *
                 * }*/

                if (pensionAlimenticia > 0)
                {
                    NOM_Nomina_Detalle itemPension = new NOM_Nomina_Detalle()
                    {
                        Id                  = 0,
                        IdNomina            = itemNomina.IdNomina,
                        IdConcepto          = 48,
                        Total               = pensionAlimenticia,
                        GravadoISR          = pensionAlimenticia,
                        ExentoISR           = 0,
                        IntegraIMSS         = 0,
                        ImpuestoSobreNomina = 0,
                        Complemento         = false
                    };

                    listaDetalles.Add(itemPension);
                }

                #endregion

                #region item Aguinaldo


                //3.- Creo un item para Aguinaldo

                NOM_Aguinaldo itemAguinaldo = new NOM_Aguinaldo();

                itemAguinaldo.IdAguinaldo         = 0;
                itemAguinaldo.IdEjercicio         = periodoPago.IdEjercicio;
                itemAguinaldo.IdPeriodo           = periodoPago.IdPeriodoPago;
                itemAguinaldo.IdContrato          = itemContrato.IdContrato;
                itemAguinaldo.IdEmpleado          = itemContrato.IdEmpleado;
                itemAguinaldo.IdNomina            = itemNomina.IdNomina;
                itemAguinaldo.SD                  = sd;
                itemAguinaldo.SDI                 = sdi;
                itemAguinaldo.SalarioMinimo       = sm;
                itemAguinaldo.DiasAguinaldo       = diasAguinaldo;
                itemAguinaldo.DiasEjercicioFiscal = diasEjercicio;
                itemAguinaldo.FechaIngreso        = fechaIngreso;
                itemAguinaldo.FechaPrimerDia      = primerDia;
                itemAguinaldo.FechaUltimoDia      = fechaUltimoDia;
                itemAguinaldo.TotalFaltas         = faltas;
                int?personalF = null;

                if (faltaPersonalizada >= 0)
                {
                    personalF = faltaPersonalizada;
                }

                itemAguinaldo.FaltasPersonalizadas = personalF;
                itemAguinaldo.Incapacidades        = 0;
                itemAguinaldo.FaltasInjustificadas = 0;
                itemAguinaldo.PermisoSinGose       = 0;
                itemAguinaldo.DiasTrabajados       = diasTrabajados;
                itemAguinaldo.SueldoMensual        = sueldoMensual;
                itemAguinaldo.Proporcion           = proporcion;
                itemAguinaldo.TopeExcento          = topeExento;
                itemAguinaldo.Aguinaldo            = aguinaldo;
                itemAguinaldo.Exento      = parteExento;
                itemAguinaldo.Gravado     = parteGravado;
                itemAguinaldo.ISR         = isr;
                itemAguinaldo.Neto        = neto;
                itemAguinaldo.Complemento = parteComplemento;
                itemAguinaldo.Total       = total;
                itemAguinaldo.ISN3        = iSobreNomina;
                itemAguinaldo.Factor      = factor;
                itemAguinaldo.FechaReg    = DateTime.Now;
                itemAguinaldo.CalcularPensionAlimenticia = calcularPensionA;
                itemAguinaldo.PensionAlimenticia         = pensionAlimenticia;
                itemAguinaldo.SaldoAnual = saldo;

                listaAguinaldos.Add(itemAguinaldo);

                #endregion



                index++;
            }                                                         //-> fin for
            NominasDao.GuardarDetallesNomina(listaDetalles, null, 0); //Aguinaldo - no aplica agregar incapacidades
            _NominasDao.AddRangeAguinaldos(listaAguinaldos);


            //Obtener las empresas fiscales
            var listaNominaA   = _nominasDao.GetDatosNominas(idPeriodo);
            var listaAguinaldo = _nominasDao.GetAguinaldosByIdPeriodo(idPeriodo);

            var empresaFiscal      = listaNominaA.Where(x => x.IdEmpresaFiscal != null).Select(x => x.IdEmpresaFiscal).Distinct().ToArray();
            var empresaComplemento = listaNominaA.Select(x => x.IdEmpresaComplemento).Distinct().ToArray();

            empresaFiscal      = empresaFiscal.Distinct().ToArray();
            empresaComplemento = empresaComplemento.Distinct().ToArray();

            var porcentajeIva = _nominasDao.PorcentajeIVA();

            foreach (var itemFiscal in empresaFiscal)
            {
                decimal isn             = 0;
                decimal totalPercepcion = 0;
                decimal totalFiscal     = 0;
                decimal totalPension    = 0;
                decimal relativo        = 0;

                isn = listaNominaA.Where(x => x.IdEmpresaFiscal == itemFiscal).Sum(x => x.TotalImpuestoSobreNomina);

                totalPercepcion = listaNominaA.Where(x => x.IdEmpresaFiscal == itemFiscal).Sum(x => x.TotalNomina);

                var arrayIdNom = listaNominaA.Select(x => x.IdNomina).ToArray();

                var listaA = (from p in listaAguinaldo where arrayIdNom.Contains(p.IdNomina) select p).ToList();

                totalPension = listaA.Sum(x => x.PensionAlimenticia);

                relativo = isn + totalPension;

                totalFiscal = relativo + totalPercepcion;

                _nominasDao.CrearFactura(idPeriodo, itemFiscal.Value, 0, isn, 0, 0, totalPension, relativo, totalPercepcion, totalFiscal, porcentajeIva);
            }

            foreach (var itemComp in empresaComplemento)
            {
                if (itemComp == null)
                {
                    continue;
                }

                decimal totalPercepcionesC = 0;


                decimal relativoC          = 0;
                decimal subTotalC          = 0;
                decimal totalIVAC          = 0;
                decimal totalComple        = 0;
                decimal porcentajeServicio = 0;
                decimal totalServicio      = 0;

                decimal isn = 0;

                isn = listaNominaA.Where(x => x.IdEmpresaComplemento == itemComp).Sum(x => x.TotalImpuestoSobreNomina);

                totalPercepcionesC = listaNominaA.Where(x => x.IdEmpresaComplemento == itemComp).Sum(x => x.TotalComplemento);


                //resultado complemento de la factura
                porcentajeServicio = itemSucursal.PorcentajeServicio;    //  _nominasDao.PorcentajeServicioHold(ppago.IdSucursal);
                porcentajeServicio = porcentajeServicio / 100;
                totalServicio      = totalPercepcionesC * porcentajeServicio;

                relativoC = isn;
                subTotalC = relativoC + totalPercepcionesC + totalServicio;

                totalIVAC   = (porcentajeIva / 100) * subTotalC;
                totalComple = totalIVAC + subTotalC;

                _nominasDao.CrearFacturaComplemento(idPeriodo, itemComp.Value, totalPercepcionesC, porcentajeServicio, totalServicio, 0, isn, relativoC, subTotalC, totalIVAC, totalComple);
            }


            return(summaryList);
        }
Exemplo n.º 28
0
        private static List <NOM_Nomina_Detalle> CalculoDeInfonavit(NOM_Nomina nomina, NOM_PeriodosPago periodoPago, int dias = -1)
        {
            decimal totalADescontar = 0;
            List <NOM_Nomina_Detalle> listaDetallesInfonavit = new List <NOM_Nomina_Detalle>();
            //   DateTime fechaServidor = DateTime.Now;
            int diasDeDescuento = 0;

            if (dias >= 0)
            {
                diasDeDescuento = dias;
            }
            else
            {
                diasDeDescuento = nomina.Dias_Laborados;
            }


            //1) Obtener el prestamo infonavit de la tabla Prestamos pasando el Id del contrato
            var listaInfonavit = NominasDao.GetPrestamoInfonavitByIdContrato(nomina.IdContrato);

            //Infonavit no maneja saldo

            if (listaInfonavit == null)
            {
                return(null);
            }
            //Validar Fecha de inicio  del descuento

            foreach (var prestamoInfonavit in listaInfonavit)
            {
                //SI FECHA DE INICIO DEL PERIODO < FECHA INICIO DEL CREDITO
                //NO SE COBRA EL INFONAVIT
                if (periodoPago.Fecha_Inicio < prestamoInfonavit.FechaInicio &&
                    periodoPago.Fecha_Fin < prestamoInfonavit.FechaInicio)
                {
                    continue;
                }

                //SI FECHA FIN DEL CREDITO ESTA DENTRO DEL RANGO DEL PERIODO
                //SE OBTIENE LOS DIAS DESDE EL INICIO DEL PERIODO HASTA LA FECHA FIN DEL CREDITO
                //18-05-2018 solicitud de alondra
                //  sin tomar la fecha de suspension como dia valido
                //ejem periodo 01-05-2018 hasta 16-05-2018
                //fecha suspension 10-05-2018
                //dias del 01 al 09 y no al 10
                if (prestamoInfonavit.FechaSuspension != null)
                {
                    if (prestamoInfonavit.FechaSuspension.Value >= periodoPago.Fecha_Inicio &&
                        prestamoInfonavit.FechaSuspension.Value <= periodoPago.Fecha_Fin)
                    {
                        var diasRestantes = Utils.GetDiasEntreDosFechas(periodoPago.Fecha_Inicio, prestamoInfonavit.FechaSuspension.Value);

                        diasDeDescuento = diasRestantes - 1;
                    }
                }



                //if (fechaServidor >= prestamoInfonavit.FechaInicio)

                //Validar Fecha suspension
                //if (prestamoInfonavit.FechaSuspension != null)
                //{
                //    if (prestamoInfonavit.FechaSuspension > fechaServidor)
                //        return null;
                //}

                //Validar Fecha de Suspension del descuentos
                //if (fechaServidor < prestamoInfonavit.FechaSuspension)
                //{
                RH.BLL.Infonavit inf = new RH.BLL.Infonavit();


                if (diasDeDescuento > 0)
                {
                    //CALCULO DEL CREDITO -
                    var calculo = inf.GetInfonavitById(prestamoInfonavit.Id);
                    totalADescontar = diasDeDescuento * calculo.DescuentoDiario;
                }

                //Se guarda como detalle de la nomina
                //GuardarConcepto(nomina.IdNomina, 51, totalADescontar, 0, totalADescontar, 0, 0, false, prestamoInfonavit.Id);

                NOM_Nomina_Detalle item = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = nomina.IdNomina,
                    IdConcepto          = 51,
                    Total               = Utils.TruncateDecimales(totalADescontar),
                    GravadoISR          = 0,
                    ExentoISR           = Utils.TruncateDecimales(totalADescontar),
                    IntegraIMSS         = 0,
                    ImpuestoSobreNomina = 0,
                    Complemento         = false,
                    IdPrestamo          = prestamoInfonavit?.Id ?? 0
                };

                listaDetallesInfonavit.Add(item);
            }//final del for



            //}
            return(listaDetallesInfonavit);
        }