예제 #1
0
        private static bool relativoPatronal    = false;//Relativo Patron = 0 dias laborados de un colaborador que aun esta dado de alta

        public static TotalConcepto CuotasImss(ParametrosConfig factorSalarioMinimoGeneralVigente, List <C_NOM_Tabla_IMSS> tablaImss, 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, int diasCuotasImss = 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(factorSalarioMinimoGeneralVigente, tablaImss, salarioMinimoGeneral, uma, primaRiesgo, nomina, finiquito, usarUMA, diasDelPeriodo, permisosSinG: permisosSinGoce, diasCuotasImss: diasCuotasImss);

            // tomando en cuenta que ahora la variable diasDelPeriodo tiene los dias imss correspondientes, si este es mayor a cero
            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);
        }
예제 #2
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);
        }
예제 #3
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>
        /// <param name="factorSalarioMinimoGeneralVigente"></param>
        /// <param name="tablaImss"></param>
        /// <param name="salarioMinimoGeneral"></param>
        private static NOM_Cuotas_IMSS CuotasImss2(ParametrosConfig factorSalarioMinimoGeneralVigente, List <C_NOM_Tabla_IMSS> tablaImss, decimal salarioMinimoGeneral, decimal uma, decimal?primaRiesgo, NOM_Nomina nomina = null, NOM_Finiquito finiquito = null, bool usarUMA = true, int diasDelPeriodo = 0, int permisosSinG = 0, int diasCuotasImss = 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 - CONSULTA REDUNDANTE 1
            // 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

            //regla que aplica para nominas 12-09-2018
            if (nomina != null)
            {
                // este caso es porque el empleado tiene fecha alta imss despues del inicio del periodo
                if (diasCuotasImss > 0)
                {
                    if (nomina.Dias_Laborados > diasCuotasImss)
                    {
                        _diasLaborados = diasCuotasImss;
                    }
                }
            }



            _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?.SDI ?? finiquito.SDI; //antes nomina?.SBC ?? finiquito.SBC;  // Salario Base de Cotizacion

            //CONSULTA REDUNDANTE 2
            //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);
                _cuotaFijaPatron = _cuotaFijaPatron.RedondeoDecimal();
            }

            #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;

                    R1P = R1P.RedondeoDecimal();
                    R2O = R2O.RedondeoDecimal();
                }
                _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;

                _prestacionesDineroPatron = _prestacionesDineroPatron.RedondeoDecimal();
                _prestacionesDineroObrero = _prestacionesDineroObrero.RedondeoDecimal();
            }

            #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;

                _pencionadosBeneficiadosPatron = _pencionadosBeneficiadosPatron.RedondeoDecimal();
                _pencionadosBeneficiadosObrero = _pencionadosBeneficiadosObrero.RedondeoDecimal();
            }

            #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;

                _invalidezVidaPatron = _invalidezVidaPatron.RedondeoDecimal();
                _invalidezVidaObrero = _invalidezVidaObrero.RedondeoDecimal();
            }

            #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;
                _guarderiasPatron = _guarderiasPatron.RedondeoDecimal();
            }

            #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;
                _seguroRetiroPatron = _seguroRetiroPatron.RedondeoDecimal();
            }

            #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;

                _cesantiaVejezPatron = _cesantiaVejezPatron.RedondeoDecimal();
                _cesantiaVejezObrero = _cesantiaVejezObrero.RedondeoDecimal();
            }

            #endregion

            //9) Infonavit
            #region INFONAVIT

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

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

                _infonavitPatron = _infonavitPatron.RedondeoDecimal();
            }

            #endregion

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

            var riesgoTrabajo = primaRiesgo ?? 0;

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

            _riesgoTrabajoPatron = _riesgoTrabajoPatron.RedondeoDecimal();

            #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)
            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)
            if (_SD <= salarioMinimoGeneral || relativoPatronal == true)
            {
                var cuotasImss = new NOM_Cuotas_IMSS()
                {
                    IdCuota                       = 0,
                    IdNomina                      = nomina?.IdNomina ?? 0,
                    IdFiniquito                   = finiquito?.IdFiniquito ?? 0,
                    Cuota_Fija_Patron             = _cuotaFijaPatron,
                    Excedente_Patron              = (_excedentePatron + _excedenteObrero),
                    Excedente_Obrero              = 0,
                    PrestacionesDinero_Patron     = (_prestacionesDineroPatron + _prestacionesDineroObrero),
                    PrestacionesDinero_Obrero     = 0,
                    Pensionados_Patron            = (_pencionadosBeneficiadosPatron + _pencionadosBeneficiadosObrero),
                    Pensionados_Obrero            = 0,
                    InvalidezVida_Patron          = (_invalidezVidaPatron + _invalidezVidaObrero),
                    InvalidezVida_Obrero          = 0,
                    GuarderiasPrestaciones_Patron = _guarderiasPatron,
                    SeguroRetiro_Patron           = _seguroRetiroPatron,
                    CesantiaVejez_Patron          = (_cesantiaVejezPatron + _cesantiaVejezObrero),
                    CesantiaVejez_Obrero          = 0,
                    Infonavit_Patron              = _infonavitPatron,
                    RiesgoTrabajo_Patron          = _riesgoTrabajoPatron,
                    TotalPatron                   = _totalPatron,
                    TotalObrero                   = _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             = _cuotaFijaPatron,
                    Excedente_Patron              = _excedentePatron,
                    Excedente_Obrero              = _excedenteObrero,
                    PrestacionesDinero_Patron     = _prestacionesDineroPatron,
                    PrestacionesDinero_Obrero     = _prestacionesDineroObrero,
                    Pensionados_Patron            = _pencionadosBeneficiadosPatron,
                    Pensionados_Obrero            = _pencionadosBeneficiadosObrero,
                    InvalidezVida_Patron          = _invalidezVidaPatron,
                    InvalidezVida_Obrero          = _invalidezVidaObrero,
                    GuarderiasPrestaciones_Patron = _guarderiasPatron,
                    SeguroRetiro_Patron           = _seguroRetiroPatron,
                    CesantiaVejez_Patron          = _cesantiaVejezPatron,
                    CesantiaVejez_Obrero          = _cesantiaVejezObrero,
                    Infonavit_Patron              = _infonavitPatron,
                    RiesgoTrabajo_Patron          = _riesgoTrabajoPatron,
                    TotalPatron                   = _totalPatron,
                    TotalObrero                   = _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;
        }