예제 #1
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);
        }
예제 #2
0
        public static NOM_Nomina_Detalle PensionAlimenticiaMonto(decimal monto, Empleado_Contrato contratoActual)
        {
            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;

            if (monto <= 0)
            {
                return(null);
            }


            pagoPensionAlimenticia = ((monto) * (porcentajePension / 100));

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

            return(item);
        }
예제 #3
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);
        }
예제 #4
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);
        }
예제 #5
0
 public static void Imss(decimal totalObrero, int idNomina = 0, int idFiniquito = 0)
 {
     //Si el procesado es desde el modulo de procesar nomina
     if (idNomina != 0)
     {
         NOM_Nomina_Detalle nd = new NOM_Nomina_Detalle()
         {
             Id          = 0,
             IdNomina    = idNomina,
             IdConcepto  = 42,
             Total       = totalObrero,
             GravadoISR  = 0,
             ExentoISR   = 0,
             IntegraIMSS = totalObrero,
             ExentoIMSS  = 0
         };
         _nominasDao.AddDetalleNomina(nd);
     }
     else if (idFiniquito != 0) //si el procesado es desde el modulo de finiquito
     {
         NOM_Finiquito_Detalle fd = new NOM_Finiquito_Detalle()
         {
             Id          = 0,
             IdFiniquito = idFiniquito,
             IdConcepto  = 42,
             Total       = totalObrero,
             GravadoISR  = 0,
             ExentoISR   = 0,
             IntegraIMSS = totalObrero
         };
         _nominasDao.AddDetalleNomina(fd);
     }
 }
예제 #6
0
        private static void GuardarConcepto(int idNomina = 0, int idFiniquito = 0, int idConcepto = 0, decimal total = 0, decimal gravaIsr = 0, decimal excentoIsr = 0, decimal integraImss = 0, decimal impuestoNomina = 0)
        {
            if (idNomina > 0)
            {
                var nd = new NOM_Nomina_Detalle()
                {
                    Id                  = 0,
                    IdNomina            = idNomina,
                    IdConcepto          = idConcepto,
                    Total               = total,
                    GravadoISR          = gravaIsr,
                    ExentoISR           = excentoIsr,
                    IntegraIMSS         = integraImss,
                    ExentoIMSS          = 0,
                    ImpuestoSobreNomina = impuestoNomina
                };

                _nominasDao.AddDetalleNomina(nd);
            }
            else if (idFiniquito > 0)
            {
                NOM_Finiquito_Detalle fd = new NOM_Finiquito_Detalle()
                {
                    Id                  = 0,
                    IdFiniquito         = idFiniquito,
                    IdConcepto          = idConcepto,
                    Total               = total,
                    GravadoISR          = gravaIsr,
                    ExentoISR           = excentoIsr,
                    IntegraIMSS         = integraImss,
                    ImpuestoSobreNomina = impuestoNomina
                };
            }
        }
예제 #7
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);
        }
예제 #8
0
        /// <summary>
        /// Guarda un registro en detalle de nomina
        /// </summary>
        /// <param name="idNomina"></param>
        /// <param name="idConcepto"></param>
        /// <param name="total"></param>
        /// <param name="gravaIsr"></param>
        /// <param name="excentoIsr"></param>
        /// <param name="integraImss"></param>
        /// <param name="impuestoNomina"></param>
        private static void GuardarConcepto1(int idNomina = 0, int idConcepto = 0, decimal total = 0, decimal gravaIsr = 0, decimal excentoIsr = 0, decimal integraImss = 0, decimal impuestoNomina = 0, bool isComplemento = false)
        {
            var nd = new NOM_Nomina_Detalle()
            {
                IdNomina            = idNomina,
                IdConcepto          = idConcepto,
                Total               = total,
                GravadoISR          = gravaIsr,
                ExentoISR           = excentoIsr,
                IntegraIMSS         = integraImss,
                ExentoIMSS          = 0,
                ImpuestoSobreNomina = impuestoNomina,
                Complemento         = isComplemento
            };

            _nominasDao.AddDetalleNomina(nd);
        }
예제 #9
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);
        }
예제 #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);
        }
예제 #11
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);
        }
예제 #12
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);
        }
예제 #13
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);
        }
예제 #14
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);
        }
예제 #15
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);
        }
예제 #16
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);
        }
예제 #17
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);
        }
예제 #18
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);

            //}
        }
예제 #19
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);
        }
예제 #20
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);
        }
예제 #21
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);
        }
예제 #22
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);
        }