/// <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); }
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); }
/// <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); }
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); }
//public static Task<TotalIsrSubsidio> CalculoDeIsr(NOM_Nomina nomina, decimal salarioBase, int tipoNomina, int diasPeriodo) //{ // var t = Task.Factory.StartNew(() => // { // IsrSubsidio objCalculoSubsidio; // if (tipoNomina == 16) //Asimilado // { // objCalculoSubsidio = CalculoIsrAsimilado(salarioBase, nomina.SD, diasPeriodo, 4);//5 tarifa mensual// se cambio a 4 por peticion de rodolfo y sergio // } // else // { // objCalculoSubsidio = CalculoIsrSubsidio(salarioBase, nomina.SD, diasPeriodo, tipoNomina); // } // if (objCalculoSubsidio != null) // { // //SE crea el objeto total del calculo // var totalConcepto = new TotalIsrSubsidio // { // SubsidioCausado = objCalculoSubsidio.Subsidio, // SubsidioEntregado = 0, // IsrAntesSubsidio = objCalculoSubsidio.Isr, // IsrCobrado = 0 // }; // //Si Resultado es ISR, Subsidio se guarda en Cero // if (objCalculoSubsidio.EsISR) // { // totalConcepto.IsrCobrado = objCalculoSubsidio.ResultadoIsrOSubsidio; // GuardarConcepto(nomina.IdNomina, 43, objCalculoSubsidio.ResultadoIsrOSubsidio, 0, 0, 0, 0); // GuardarConcepto(nomina.IdNomina, 144, 0, 0, 0, 0, 0); // } // else //Si Resultado es Subsidio, ISR se guarda en Cero // { // totalConcepto.SubsidioEntregado = objCalculoSubsidio.ResultadoIsrOSubsidio; // GuardarConcepto(nomina.IdNomina, 144, (objCalculoSubsidio.ResultadoIsrOSubsidio), 0, 0, 0, 0); // GuardarConcepto(nomina.IdNomina, 43, 0, 0, 0, 0, 0); // } // return totalConcepto; // } // else // { // var totalConcepto = new TotalIsrSubsidio // { // SubsidioCausado = 0, // SubsidioEntregado = 0, // IsrAntesSubsidio = 0, // IsrCobrado = 0 // }; // return totalConcepto; // } // }); // return t; //} //usado para el calculo del isr de la nomina - 2 metodo nomina - son 2 porque ultimo se fuerza a que sea la tabla mensual //usando para el calculo isr del asimilado - 1 public static TotalIsrSubsidio CalculoDeIsr(NOM_Nomina nomina, decimal salarioBase, int tipoNomina, int diasPeriodo) { IsrSubsidio objCalculoSubsidio; if (tipoNomina == 16) //Asimilado { objCalculoSubsidio = CalculoIsrAsimilado(salarioBase, nomina.SD, diasPeriodo, 4); //5 tarifa mensual// se cambio a 4 por peticion de rodolfo y sergio } else { //objCalculoSubsidio = CalculoIsrSubsidioFin(nomina, salarioBase, nomina.SD, diasPeriodo, tipoNomina); objCalculoSubsidio = CalculoIsrSubsidio304(nomina, salarioBase, nomina.SD, diasPeriodo, tipoNomina);//factor } if (objCalculoSubsidio != null) { //SE crea el objeto total del calculo var totalConcepto = new TotalIsrSubsidio { SubsidioCausado = objCalculoSubsidio.Subsidio, //GetSubsidioCausadoByTipoNomina(tipoNomina,salarioBase), SubsidioEntregado = 0, IsrAntesSubsidio = objCalculoSubsidio.IsrAntesDeSub, IsrCobrado = 0 }; //Si Resultado es ISR, Subsidio se guarda en Cero if (objCalculoSubsidio.EsISR) { totalConcepto.IsrCobrado = objCalculoSubsidio.ResultadoIsrOSubsidio; GuardarConcepto(nomina.IdNomina, 43, objCalculoSubsidio.ResultadoIsrOSubsidio, 0, 0, 0, 0); GuardarConcepto(nomina.IdNomina, 144, 0, 0, 0, 0, 0); } else //Si Resultado es Subsidio, ISR se guarda en Cero { totalConcepto.SubsidioEntregado = objCalculoSubsidio.ResultadoIsrOSubsidio; GuardarConcepto(nomina.IdNomina, 144, (objCalculoSubsidio.ResultadoIsrOSubsidio), 0, 0, 0, 0); GuardarConcepto(nomina.IdNomina, 43, 0, 0, 0, 0, 0); } return(totalConcepto); } else { var totalConcepto = new TotalIsrSubsidio { SubsidioCausado = 0, SubsidioEntregado = 0, IsrAntesSubsidio = 0, IsrCobrado = 0 }; return(totalConcepto); } }
public ImpuestoDetalleModel GetImpuestosDetalle(NOM_Nomina itemnomina, decimal baseGravable = 0, decimal SD = 0, int tipoTarifa = 0, int diasPeriodo = 0, int idTipoNomina = 0) { if (baseGravable <= 0) { return(null); } if (tipoTarifa <= 0) { return(null); } IsrSubsidio calculoIsrSubsidio = new IsrSubsidio(); if (idTipoNomina == 16) { calculoIsrSubsidio = MNominas.CalculoIsrAsimilado(baseGravable, SD, diasPeriodo, 4, incluirTablas: true); } else { // calculoIsrSubsidio = MNominas.CalculoIsrSubsidioFin(itemnomina, itemnomina.SBCotizacionDelProcesado, SD, diasPeriodo, tipoTarifa, incluirTablas: true); calculoIsrSubsidio = MNominas.CalculoIsrSubsidio304(itemnomina, itemnomina.SBCotizacionDelProcesado, SD, diasPeriodo, tipoTarifa, incluirTablas: true); // factor } var item = new ImpuestoDetalleModel() { BaseGravable = calculoIsrSubsidio.BaseGravable, BaseGravableMensual = calculoIsrSubsidio.BaseGravableMensual, LimiteInferior = calculoIsrSubsidio.LimiteInferior, Base = calculoIsrSubsidio.Base, Tasa = calculoIsrSubsidio.Tasa, Isr = calculoIsrSubsidio.IsrAntesDeSub, Subsidio = calculoIsrSubsidio.Subsidio, NetoAPagar = calculoIsrSubsidio.NetoAPagar, ResultadoIsrOSubsidio = (calculoIsrSubsidio.ResultadoIsrOSubsidio), Tablaisr = calculoIsrSubsidio.Tablaisr, Tablasubsidio = calculoIsrSubsidio.Tablasubsidio, IdTablaIsr = calculoIsrSubsidio.IdTablaIsr, IdTablaSubsidio = calculoIsrSubsidio.IdTablaSubsidio, EsISR = calculoIsrSubsidio.EsISR, Porcentajeisr = 0 }; return(item); }
/// <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); }
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); }
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); }
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); }
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); }
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); }
/// <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); }
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); }
//Version 2 - 30.4 //Method Name - CalculoIsrSubsidio304 // public static IsrSubsidio CalculoIsrSubsidio304(NOM_Nomina nomina, decimal baseGravable, decimal SD, int diasPeriodo, int tipoTarifa, bool incluirTablas = false) { if (baseGravable <= 0) { return(null); } //if (tipoTarifa <= 0) return null; bool esISR = false; decimal factor304 = 30.40M; decimal nuevaBaseGravable = 0; decimal holdBaseGravable = 0; decimal subsidio304 = 0; decimal isr304 = 0; //Regla 14 dias - para nominas catorcenales*********************************************************** //version 30.4 //Se obtiene el sueldo mensual //nuevaBaseGravable = (SD * variableMensual);//Obtenemos el sueldo mensual SD * 30.4 //holdBaseGravable = baseGravable; //Guardamos la baseGravable anterior //baseGravable = (decimal)nuevaBaseGravable; nuevaBaseGravable = (baseGravable / nomina.Dias_Laborados) * factor304; //nueva base a 30.4 holdBaseGravable = baseGravable; //Guardamos la baseGravable anterior baseGravable = (decimal)nuevaBaseGravable; // establecemos como base de calculo la nueva base encontrada //****************************************************************************************************** tipoTarifa = 5;//mensual List <C_NOM_Tabla_ISR> tablaisrcompleta = null; List <C_NOM_Tabla_Subsidio> tablasubsidiocompleta = null; var tablaIsr = NominasDao.GeTablaIsrByTipoNomina(tipoTarifa, baseGravable); var tablaSubsidio = NominasDao.GetTablaSubsidioByTipoNomina(tipoTarifa, baseGravable); if (tablaIsr == null || tablaSubsidio == null) { return(null); } if (incluirTablas) { tablaisrcompleta = NominasDao.GetAllTablaIsr(tipoTarifa); tablasubsidiocompleta = NominasDao.GetAllTablaSubsidios(tipoTarifa); } //1) Buscar el rango de limite inferior decimal limiteInferior = tablaIsr.Limite_Inferior; //2) Restar Ingreso - Limite Inferior = BASE decimal _base = baseGravable - limiteInferior; //3) Tomar el porcentaje del Rango % decimal porcentaje = tablaIsr.Porcentaje; //4) Multiplicar el % por la BASE decimal resultado = _base * (porcentaje / 100); //5)Tomar la cuota fija del rango decimal cuotaFija = tablaIsr.Cuota_Fija; //6 Sumar 4) + 5) = ISR decimal isr = resultado + cuotaFija; // 7) buscar en la tabla de subsidio en que rango esta el Salario Gravable decimal subsidioAlEmpleo = tablaSubsidio.Subsidio; //7.1 proporcional para el periodo de 14 dias //version 30.4 isr304 = Utils.TruncateDecimales((isr / (decimal)factor304) * nomina.Dias_Laborados); subsidio304 = Utils.TruncateDecimales((subsidioAlEmpleo / (decimal)factor304) * nomina.Dias_Laborados); baseGravable = (decimal)holdBaseGravable; //8) Resta del 6) - 7) = ISR o Subsidio decimal isrOSubsidio = 0; if (isr > subsidioAlEmpleo) { isrOSubsidio = (isr - subsidioAlEmpleo); //version 30.4 isrOSubsidio = (isr304 - subsidio304); } else { isrOSubsidio = (subsidioAlEmpleo - isr); //version 30.4 isrOSubsidio = (subsidio304 - isr304); } //9) Neto a pagar Salario Gravable - 8) decimal netoPagar = 0; esISR = isr > subsidioAlEmpleo; if (esISR) { netoPagar = baseGravable - (isrOSubsidio); } else { netoPagar = baseGravable + (isrOSubsidio); } esISR = isr > subsidioAlEmpleo; var item = new IsrSubsidio() { BaseGravable = baseGravable, BaseGravableMensual = (decimal)nuevaBaseGravable, LimiteInferior = limiteInferior, Base = _base, Tasa = porcentaje, IsrAntesDeSub = isr304, Subsidio = subsidio304,//subsidioAlEmpleo NetoAPagar = Utils.TruncateDecimales(netoPagar), ResultadoIsrOSubsidio = Common.Utils.Utils.TruncateDecimales(isrOSubsidio), IdTablaIsr = tablaIsr.IdISR, IdTablaSubsidio = tablaSubsidio.IdSubsidio, Tablaisr = incluirTablas ? tablaisrcompleta : null, Tablasubsidio = incluirTablas ? tablasubsidiocompleta : null, EsISR = esISR }; return(item); }
/// <summary> /// Método que realiza el cálculo del IRS/SUBSIDIO Retorna un objeto "IsrSubsidio" con los valores del cálculo. /// tipoTarifa: Diario, semanal, quincenal, etc.. /// 1.- Usado en Detalle de la nomina /// 2.- Fininiquito - /// 3.- finiquito F /// 4.- ultimo sueldo /// 5- en este mismo archivo linea 96 /// </summary> /// <param name="nomina"></param> /// <param name="baseGravable"></param> /// <param name="diasPeriodo"></param> /// <param name="tipoTarifa"></param> /// <returns></returns> public static IsrSubsidio CalculoIsrSubsidioFin(NOM_Nomina nomina, decimal baseGravable, decimal SD, int diasPeriodo, int tipoTarifa, bool incluirTablas = false) { ////ASimilados a salario //if (tipoTarifa == 16) //Asimilado a Salarios - tipo Tarifa viene con el valor de Periodicidad de Pago //{ // if (diasPeriodo > 15)//Aqui habria que asegurarse de que tarifa quieren aplicar para el calculo // { // tipoTarifa = 5;//Lo cambiamos al tipo de tarifa mensual // } // else if (diasPeriodo == 15) // { // tipoTarifa = 4; //Lo cambiamos al tipo de tarifa quincenal // } // else // { // tipoTarifa = 2; //Lo cambiamos al tipo de tarifa semanal // } //} if (baseGravable <= 0) { return(null); } if (tipoTarifa <= 0) { return(null); } bool esISR = false; double variableMensual = 30.40; double nuevaBaseGravable = 0.00; double holdBaseGravable = 0.00; decimal subsidio14 = 0; decimal isr14 = 0; //Regla 14 dias - para nominas catorcenales if (diasPeriodo == 14) { //Se obtiene el sueldo mensual nuevaBaseGravable = ((double)SD * variableMensual); holdBaseGravable = (double)baseGravable; baseGravable = (decimal)nuevaBaseGravable; tipoTarifa = 5;//mensual } List <C_NOM_Tabla_ISR> tablaisrcompleta = null; List <C_NOM_Tabla_Subsidio> tablasubsidiocompleta = null; var tablaIsr = NominasDao.GeTablaIsrByTipoNomina(tipoTarifa, baseGravable); var tablaSubsidio = NominasDao.GetTablaSubsidioByTipoNomina(tipoTarifa, baseGravable); if (tablaIsr == null || tablaSubsidio == null) { return(null); } if (incluirTablas) { tablaisrcompleta = NominasDao.GetAllTablaIsr(tipoTarifa); tablasubsidiocompleta = NominasDao.GetAllTablaSubsidios(tipoTarifa); } //1) Buscar el rango de limite inferior decimal limiteInferior = tablaIsr.Limite_Inferior; //2) Restar Ingreso - Limite Inferior = BASE decimal _base = baseGravable - limiteInferior; //3) Tomar el porcentaje del Rango % decimal porcentaje = tablaIsr.Porcentaje; //4) Multiplicar el % por la BASE decimal resultado = _base * (porcentaje / 100); //5)Tomar la cuota fija del rango decimal cuotaFija = tablaIsr.Cuota_Fija; //6 Sumar 4) + 5) = ISR decimal isr = resultado + cuotaFija; // 7) buscar en la tabla de subsidio en que rango esta el Salario Gravable decimal subsidioAlEmpleo = tablaSubsidio.Subsidio; //7.1 proporcional para el periodo de 14 dias if (diasPeriodo == 14) { isr14 = (isr / (decimal)variableMensual) * diasPeriodo; subsidio14 = (subsidioAlEmpleo / (decimal)variableMensual) * diasPeriodo; baseGravable = (decimal)holdBaseGravable; } //8) Resta del 6) - 7) = ISR o Subsidio decimal isrOSubsidio = 0; if (isr > subsidioAlEmpleo) { isrOSubsidio = (isr - subsidioAlEmpleo); if (diasPeriodo == 14) { isrOSubsidio = (isr14 - subsidio14); } } else { isrOSubsidio = (subsidioAlEmpleo - isr); if (diasPeriodo == 14) { isrOSubsidio = (subsidio14 - isr14); } } //9) Neto a pagar Salario Gravable - 8) decimal netoPagar = 0; esISR = isr > subsidioAlEmpleo; if (esISR) { netoPagar = baseGravable - (isrOSubsidio); } else { netoPagar = baseGravable + (isrOSubsidio); } esISR = isr > subsidioAlEmpleo; var item = new IsrSubsidio() { BaseGravable = baseGravable, BaseGravableMensual = (decimal)nuevaBaseGravable, LimiteInferior = limiteInferior, Base = _base, Tasa = porcentaje, IsrAntesDeSub = isr, Subsidio = subsidioAlEmpleo, NetoAPagar = netoPagar, ResultadoIsrOSubsidio = Common.Utils.Utils.TruncateDecimales(isrOSubsidio), IdTablaIsr = tablaIsr.IdISR, IdTablaSubsidio = tablaSubsidio.IdSubsidio, Tablaisr = incluirTablas ? tablaisrcompleta : null, Tablasubsidio = incluirTablas ? tablasubsidiocompleta : null, EsISR = esISR }; return(item); }
//public static Task<TotalIsrSubsidio> CalculoDeIsr(NOM_Nomina nomina, decimal salarioBase, int tipoNomina, int diasPeriodo) //{ // var t = Task.Factory.StartNew(() => // { // IsrSubsidio objCalculoSubsidio; // if (tipoNomina == 16) //Asimilado // { // objCalculoSubsidio = CalculoIsrAsimilado(salarioBase, nomina.SD, diasPeriodo, 4);//5 tarifa mensual// se cambio a 4 por peticion de rodolfo y sergio // } // else // { // objCalculoSubsidio = CalculoIsrSubsidio(salarioBase, nomina.SD, diasPeriodo, tipoNomina); // } // if (objCalculoSubsidio != null) // { // //SE crea el objeto total del calculo // var totalConcepto = new TotalIsrSubsidio // { // SubsidioCausado = objCalculoSubsidio.Subsidio, // SubsidioEntregado = 0, // IsrAntesSubsidio = objCalculoSubsidio.Isr, // IsrCobrado = 0 // }; // //Si Resultado es ISR, Subsidio se guarda en Cero // if (objCalculoSubsidio.EsISR) // { // totalConcepto.IsrCobrado = objCalculoSubsidio.ResultadoIsrOSubsidio; // GuardarConcepto(nomina.IdNomina, 43, objCalculoSubsidio.ResultadoIsrOSubsidio, 0, 0, 0, 0); // GuardarConcepto(nomina.IdNomina, 144, 0, 0, 0, 0, 0); // } // else //Si Resultado es Subsidio, ISR se guarda en Cero // { // totalConcepto.SubsidioEntregado = objCalculoSubsidio.ResultadoIsrOSubsidio; // GuardarConcepto(nomina.IdNomina, 144, (objCalculoSubsidio.ResultadoIsrOSubsidio), 0, 0, 0, 0); // GuardarConcepto(nomina.IdNomina, 43, 0, 0, 0, 0, 0); // } // return totalConcepto; // } // else // { // var totalConcepto = new TotalIsrSubsidio // { // SubsidioCausado = 0, // SubsidioEntregado = 0, // IsrAntesSubsidio = 0, // IsrCobrado = 0 // }; // return totalConcepto; // } // }); // return t; //} //usado para el calculo del isr de la nomina - 2 metodo nomina - son 2 porque ultimo se fuerza a que sea la tabla mensual //usando para el calculo isr del asimilado - 1 public static TotalIsrSubsidio CalculoDeIsr(NOM_Nomina nomina, decimal salarioBase, int tipoNomina, int diasPeriodo, bool anualOK, int eje, decimal exento) { decimal isra = 0, saldo = 0; IsrSubsidio objCalculoSubsidio; if (tipoNomina == 16) //Asimilado { objCalculoSubsidio = CalculoIsrAsimilado(salarioBase, nomina.SD, diasPeriodo, 4); //5 tarifa mensual// se cambio a 4 por peticion de rodolfo y sergio } else { //objCalculoSubsidio = CalculoIsrSubsidioFin(nomina, salarioBase, nomina.SD, diasPeriodo, tipoNomina); objCalculoSubsidio = CalculoIsrSubsidio304(nomina, salarioBase, nomina.SD, diasPeriodo, tipoNomina);//factor } if (objCalculoSubsidio != null) { //SE crea el objeto total del calculo var totalConcepto = new TotalIsrSubsidio { SubsidioCausado = objCalculoSubsidio.Subsidio, //GetSubsidioCausadoByTipoNomina(tipoNomina,salarioBase), SubsidioEntregado = 0, IsrAntesSubsidio = objCalculoSubsidio.IsrAntesDeSub, IsrCobrado = 0 }; //Si Resultado es ISR, Subsidio se guarda en Cero if (objCalculoSubsidio.EsISR) { totalConcepto.IsrCobrado = objCalculoSubsidio.ResultadoIsrOSubsidio; GuardarConcepto(nomina.IdNomina, 43, objCalculoSubsidio.ResultadoIsrOSubsidio, 0, 0, 0, 0); GuardarConcepto(nomina.IdNomina, 144, 0, 0, 0, 0, 0); } else //Si Resultado es Subsidio, ISR se guarda en Cero { totalConcepto.SubsidioEntregado = objCalculoSubsidio.ResultadoIsrOSubsidio; GuardarConcepto(nomina.IdNomina, 144, (objCalculoSubsidio.ResultadoIsrOSubsidio), 0, 0, 0, 0); GuardarConcepto(nomina.IdNomina, 43, 0, 0, 0, 0, 0); } if (anualOK) { CalculoAnual Canual = new CalculoAnual(); NominasDao.EliminarCalculoAnual(nomina.IdEmpleado, nomina.IdPeriodo); Canual = GetCalculoAnual(nomina.IdEmpleado, eje, nomina.IdEmpresaFiscal, salarioBase, objCalculoSubsidio.EsISR ? objCalculoSubsidio.ResultadoIsrOSubsidio : 0, objCalculoSubsidio.Subsidio, exento); isra = Canual.ResultadoIsrOSubsidio > 0 ? Math.Abs(Canual.ResultadoIsrOSubsidio) : 0; saldo = Canual.ResultadoIsrOSubsidio < 0 ? Math.Abs(Canual.ResultadoIsrOSubsidio) : 0; if (isra > 0) { GuardarConcepto(nomina.IdNomina, 154, isra, 0, 0, 0, 0); totalConcepto.IsrCobrado += isra; } NOM_CalculoAnual itemCalculo = new NOM_CalculoAnual(); itemCalculo.id = 0; itemCalculo.idEmpleado = nomina.IdEmpleado; itemCalculo.idEmpresa = (int)nomina.IdEmpresaFiscal; itemCalculo.idEjercicio = eje; itemCalculo.idPeriodo = nomina.IdPeriodo; itemCalculo.idNomina = nomina.IdNomina; itemCalculo.baseGravable = Canual.BaseGravable; itemCalculo.Exento = Canual.Exento; itemCalculo.subCausado = Canual.Subsidio; itemCalculo.isrAntes = Canual.IsrAntesDeSub; itemCalculo.isrPagado = Canual.isrPagado; itemCalculo.isrRetener = isra; itemCalculo.saldoFavor = saldo; itemCalculo.status = true; _nominasDao.AddCalculoAnual(itemCalculo); } return(totalConcepto); } else { var totalConcepto = new TotalIsrSubsidio { SubsidioCausado = 0, SubsidioEntregado = 0, IsrAntesSubsidio = 0, IsrCobrado = 0 }; return(totalConcepto); } }
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); }
private static bool relativoPatronal = false;//Relativo Patron = 0 dias laborados de un colaborador que aun esta dado de alta public static TotalConcepto CuotasImss(decimal salarioMinimoGeneral, decimal uma, decimal?primaRiesgo, NOM_Nomina nomina = null, NOM_Finiquito finiquito = null, bool usarUMA = true, int diasDelPeriodo = 0, int diasIncapacidad = 0, int permisosSinGoce = 0) { NOM_Cuotas_IMSS resultadoCuotas; //Inicializar las variables relativoPatronal = false; _sbc = 0; // Salario Base de Cotizacion _zonaSalarial = 0; _smgv = 0; // Salario Minimo General Vigente _factorVeces = 3; _cuotaAdicional = 0; _diasLaborados = 0; _excedente = 0; _excedentePatron = 0; _excedenteObrero = 0; _prestacionesDineroPatron = 0; _prestacionesDineroObrero = 0; _cuotaFijaPatron = 0; _pencionadosBeneficiadosPatron = 0; _pencionadosBeneficiadosObrero = 0; _invalidezVidaPatron = 0; _invalidezVidaObrero = 0; _guarderiasPatron = 0; _seguroRetiroPatron = 0; _cesantiaVejezPatron = 0; _cesantiaVejezObrero = 0; _infonavitPatron = 0; _riesgoTrabajoPatron = 0; _totalPatron = 0; _totalObrero = 0; _SDI = 0; _idNomina = 0; _idFiniquito = 0; _SD = 0; resultadoCuotas = CuotasImss2(salarioMinimoGeneral, uma, primaRiesgo, nomina, finiquito, usarUMA, diasDelPeriodo, permisosSinG: permisosSinGoce); if (diasDelPeriodo == diasIncapacidad) { resultadoCuotas.CesantiaVejez_Patron = 0; resultadoCuotas.Cuota_Fija_Patron = 0; resultadoCuotas.Excedente_Patron = 0; resultadoCuotas.GuarderiasPrestaciones_Patron = 0; resultadoCuotas.InvalidezVida_Patron = 0; resultadoCuotas.Pensionados_Patron = 0; resultadoCuotas.PrestacionesDinero_Patron = 0; resultadoCuotas.RiesgoTrabajo_Patron = 0; resultadoCuotas.TotalPatron = (resultadoCuotas.SeguroRetiro_Patron + resultadoCuotas.Infonavit_Patron); resultadoCuotas.TotalObrero = 0; } //A) Si dias de incapacidad es de 1 a 3 - se toman como faltas //queda igual como vienen los datos de la nomina en diasLaborados //B) Si dias de incapacidad es > 3 y < a los dias del periodo - el patron paga los dias restantes //if(diasIncapacidad >3 && diasIncapacidad < diasDelPeriodo) //{ // //para calcular nuevamente anexando los dias de incapacidad, // //y esto es lo que será pagado por el patron // nomina.Dias_Laborados += diasIncapacidad; // var nuevoCalculo = CuotasImss2(salarioMinimoGeneral, uma, primaRiesgo, nomina, finiquito, usarUMA, diasDelPeriodo); // //Ese nuevo calculo se actualiza el registro solo del lado del patron // resultadoCuotas.TotalPatron = nuevoCalculo.TotalPatron; // resultadoCuotas.Cuota_Fija_Patron = nuevoCalculo.Cuota_Fija_Patron; // resultadoCuotas.Excedente_Patron = nuevoCalculo.Excedente_Patron; // resultadoCuotas.PrestacionesDinero_Patron = nuevoCalculo.PrestacionesDinero_Patron; // resultadoCuotas.Pensionados_Patron = nuevoCalculo.Pensionados_Patron; // resultadoCuotas.InvalidezVida_Patron = nuevoCalculo.InvalidezVida_Patron; // resultadoCuotas.GuarderiasPrestaciones_Patron = nuevoCalculo.GuarderiasPrestaciones_Patron; // resultadoCuotas.SeguroRetiro_Patron = nuevoCalculo.SeguroRetiro_Patron; // resultadoCuotas.CesantiaVejez_Patron = nuevoCalculo.CesantiaVejez_Patron; // resultadoCuotas.Infonavit_Patron = nuevoCalculo.Infonavit_Patron; // resultadoCuotas.RiesgoTrabajo_Patron = nuevoCalculo.RiesgoTrabajo_Patron; //} //C) Si los dias de incapacidad es los mismos dias que el periodo - el patro paga toda la cuota imss //queda igual, ya que si el dias laborados es cero, todo lo paga el patron como relativoPatronal //Guarda los datos en la Tabla Cuotas Imss _nominasDao.AddCuotasImss(resultadoCuotas); if (relativoPatronal != true) { _totalObrero = resultadoCuotas.TotalObrero; //Guardar el concepto en detalle de la nomina MDeducciones.Imss(_totalObrero, idNomina: _idNomina, idFiniquito: _idFiniquito); } else { _totalObrero = 0; } //Objeto utilizado en el metodo del procesado para la sumatoria de la nomina con los demas conceptos var totalConcepto = new TotalConcepto { Total = _totalObrero, ImpuestoSobreNomina = 0, TotalObligaciones = 0 }; return(totalConcepto); }
/// <summary> /// Metodo que genera las cuotas imss - /// NOM_Nomina - para obetener los datos de la nomina como Id, SD, SDI, dias laborados, /// </summary> /// <param name="nomina"></param> /// <param name="zsalarial"></param> /// <param name="primaRiesgo"></param> /// <param name="finiquito"></param> private static NOM_Cuotas_IMSS CuotasImss2(decimal salarioMinimoGeneral, decimal uma, decimal?primaRiesgo, NOM_Nomina nomina = null, NOM_Finiquito finiquito = null, bool usarUMA = true, int diasDelPeriodo = 0, int permisosSinG = 0) { //Relativo Patron = 0 dias laborados de un colaborador que aun esta dado de alta //PARAMETROS DE CONFIGURACION _usarUMAParaCalculo = usarUMA; //A) FACTOR VECES SALARIO MINIMO var factorSalarioMinimoGeneralVigente = _nominasDao.GetValorParametrosConfig(ParametrosDeConfiguracion.FSMGV); //para obtener el numero de veces del Salario minimo if (factorSalarioMinimoGeneralVigente != null) { if (factorSalarioMinimoGeneralVigente != null) { _factorVeces = (int)factorSalarioMinimoGeneralVigente.ValorInt;//al momento del desarrollo es 3 } } //validacion if (nomina == null && finiquito == null) { return(null); } //si ambos objetos contienen datos //la prioridad es nomina - entonces finiquito seteamos a null if (nomina != null) { finiquito = null; } //Anteriormente se obtenia los dias Laborados del finiquito, pero se cambio a que sean los dias del periodo -> solitud por alondra _diasLaborados = nomina?.Dias_Laborados ?? diasDelPeriodo;//finiquito.DiasLaborados;// aqui cambiar por los dias de periodicidad de pago en el contrato - incidencias _zonaSalarial = _usarUMAParaCalculo == true ? uma : salarioMinimoGeneral; _SDI = nomina?.SDI ?? finiquito.SDI; _idNomina = nomina?.IdNomina ?? 0; //si el metodo es ejecutado desde el procesado de la nomina, se toma el idNomina _idFiniquito = finiquito?.IdFiniquito ?? 0; //si el metodo es ejecuta desde el procesado del finiquito, se toma el id del finiquito sino se inicializa a cero _SD = nomina?.SD ?? finiquito.SD; _sbc = nomina?.SBC ?? finiquito.SBC; // Salario Base de Cotizacion var tablaImss = _nominasDao.GeTablaImss(); //Regla PS - se concidera los Permiso sin Goce para el calculo de las cuotas if (nomina != null && permisosSinG > 0) { //validamos si los dias de PS son igual que los dias del periodo //es decir que tiene Permisos sin goce en todo los dias de la nomina if (permisosSinG == diasDelPeriodo) { _diasLaborados = 0;//se consideran como faltas y el pago de las cuotas las pagará el patron } else { _diasLaborados += permisosSinG;//? si son 15 dias de PS se calculará la parte obrera y patron ? es decir, lo no absorvera el patron el total? } } //Si los dias laborados es igual a cero //entonces se toma el dia del periodo, para el cálculo de los relativos que se cobrará al patron if (_diasLaborados == 0) { _diasLaborados = diasDelPeriodo; relativoPatronal = true; } //1) Cuota fija #region CUOTA FIJA //1 Especie - Cuota Fija 20.400 0.000 var itemCutoaFija = tablaImss.FirstOrDefault(x => x.IdIMSS == 1); var cuotaFija = _diasLaborados * _zonaSalarial; if (itemCutoaFija != null) { _cuotaFijaPatron = cuotaFija * (itemCutoaFija.Patron / 100); } #endregion //Excedentes #region EXCEDENTES //se busca el registro en la bd para obtener los porcentajes Patron-Obrero var itemExcedente = tablaImss.FirstOrDefault(x => x.IdIMSS == 2); if (itemExcedente != null) { _smgv = _zonaSalarial * _factorVeces; // Salario Minimo General Vigente o UMA decimal R1P = 0; decimal R2O = 0; if (_smgv > _sbc) { R1P = 0; } else { R1P = ((_sbc - _smgv) * (itemExcedente.Patron / 100)) * _diasLaborados; R2O = ((_sbc - _smgv) * (itemExcedente.Obrero / 100)) * _diasLaborados; } _excedentePatron = R1P; _excedenteObrero = R2O; // decimal R2P = 0; //decimal R2O = 0; // //Calcular Excedente Patron // R2P = R1P * (itemExcedente.Patron / 100); // _excedentePatron = R2P * _diasLaborados; // if (_excedentePatron < 0) // { // _excedentePatron = 0; // } // //Calcular Exedente Obrero // R2O = R1P * (itemExcedente.Obrero / 100); // _excedenteObrero = R2O * _diasLaborados; // if (_excedenteObrero < 0) // { // _excedenteObrero = 0; // } } #endregion //3) Prestaciones en Dinero #region PRESTACIONES EN DINERO var itemPrestacionesDinero = tablaImss.FirstOrDefault(x => x.IdIMSS == 3); if (itemPrestacionesDinero != null) { _prestacionesDineroPatron = (_sbc * (itemPrestacionesDinero.Patron / 100)) * _diasLaborados; _prestacionesDineroObrero = (_sbc * (itemPrestacionesDinero.Obrero / 100)) * _diasLaborados; } #endregion //4) Pensionados y Beneficiados #region PENSIONADOS Y BENEFICIADOS var itemPensionados = tablaImss.FirstOrDefault(x => x.IdIMSS == 4); if (itemPensionados != null) { _pencionadosBeneficiadosPatron = (_sbc * (itemPensionados.Patron / 100)) * _diasLaborados; _pencionadosBeneficiadosObrero = (_sbc * (itemPensionados.Obrero / 100)) * _diasLaborados; } #endregion //5) Invalidez y Vida #region INVALIDEZ Y VIDA var itemIvalidez = tablaImss.FirstOrDefault(x => x.IdIMSS == 5); if (itemIvalidez != null) { _invalidezVidaPatron = (_sbc * (itemIvalidez.Patron / 100)) * _diasLaborados; _invalidezVidaObrero = (_sbc * (itemIvalidez.Obrero / 100)) * _diasLaborados; } #endregion //6) Guarderia #region GUARDERÍA var itemGuardería = tablaImss.FirstOrDefault(x => x.IdIMSS == 6); if (itemGuardería != null) { _guarderiasPatron = (_sbc * (itemGuardería.Patron / 100)) * _diasLaborados; } #endregion //7) Seguro de Retiro #region SEGURO DE RETIRO var itemSeguro = tablaImss.FirstOrDefault(x => x.IdIMSS == 7); if (itemSeguro != null) { _seguroRetiroPatron = (_sbc * (itemSeguro.Patron / 100)) * _diasLaborados; } #endregion //8) Cesantía y Vejez #region CESANTÍA Y VEJEZ var itemCesantia = tablaImss.FirstOrDefault(x => x.IdIMSS == 8); if (itemCesantia != null) { _cesantiaVejezPatron = (_sbc * (itemCesantia.Patron / 100)) * _diasLaborados; _cesantiaVejezObrero = (_sbc * (itemCesantia.Obrero / 100)) * _diasLaborados; } #endregion //9) Infonavit #region INFONAVIT var itemInfonavit = tablaImss.FirstOrDefault(x => x.IdIMSS == 9); if (itemInfonavit != null) { _infonavitPatron = (_sbc * (itemInfonavit.Patron / 100)) * _diasLaborados; } #endregion //10) Riesgo de Trabajo #region RIESGO DE TRABAJO var riesgoTrabajo = primaRiesgo ?? 0; _riesgoTrabajoPatron = (_sbc * ((decimal)riesgoTrabajo / 100)) * _diasLaborados; #endregion //Sumatoria #region TOTAL PATRON, TOTAL OBRERO //Si el Salario Diario es menor o igual al SMG las cuotas del obrero lo pagará el patron if (_SD <= salarioMinimoGeneral) { _totalPatron = _cuotaFijaPatron + _excedentePatron + _prestacionesDineroPatron + _pencionadosBeneficiadosPatron + _invalidezVidaPatron + _guarderiasPatron + _seguroRetiroPatron + _cesantiaVejezPatron + _infonavitPatron + _riesgoTrabajoPatron + _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero + _invalidezVidaObrero + _cesantiaVejezObrero; _totalObrero = 0; } else { _totalObrero = _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero + _invalidezVidaObrero + _cesantiaVejezObrero; _totalPatron = _cuotaFijaPatron + _excedentePatron + _prestacionesDineroPatron + _pencionadosBeneficiadosPatron + _invalidezVidaPatron + _guarderiasPatron + _seguroRetiroPatron + _cesantiaVejezPatron + _infonavitPatron + _riesgoTrabajoPatron; _totalObrero = _excedenteObrero + _prestacionesDineroObrero + _pencionadosBeneficiadosObrero + _invalidezVidaObrero + _cesantiaVejezObrero; } #endregion //Si el Salario diario es igual o menor al salario minimo // las cuota las paga el patron. // O si los dias laborados es cero, pero el colaborar esta activo las cuotas las paga el patron if (_SD <= salarioMinimoGeneral || relativoPatronal == true) { var cuotasImss = new NOM_Cuotas_IMSS() { IdCuota = 0, IdNomina = nomina?.IdNomina ?? 0, IdFiniquito = finiquito?.IdFiniquito ?? 0, Cuota_Fija_Patron = Utils.TruncateDecimales(_cuotaFijaPatron), Excedente_Patron = Utils.TruncateDecimales((_excedentePatron + _excedenteObrero)), Excedente_Obrero = 0, PrestacionesDinero_Patron = Utils.TruncateDecimales((_prestacionesDineroPatron + _prestacionesDineroObrero)), PrestacionesDinero_Obrero = 0, Pensionados_Patron = Utils.TruncateDecimales((_pencionadosBeneficiadosPatron + _pencionadosBeneficiadosObrero)), Pensionados_Obrero = 0, InvalidezVida_Patron = Utils.TruncateDecimales((_invalidezVidaPatron + _invalidezVidaObrero)), InvalidezVida_Obrero = 0, GuarderiasPrestaciones_Patron = Utils.TruncateDecimales(_guarderiasPatron), SeguroRetiro_Patron = Utils.TruncateDecimales(_seguroRetiroPatron), CesantiaVejez_Patron = Utils.TruncateDecimales((_cesantiaVejezPatron + _cesantiaVejezObrero)), CesantiaVejez_Obrero = 0, Infonavit_Patron = Utils.TruncateDecimales(_infonavitPatron), RiesgoTrabajo_Patron = Utils.TruncateDecimales(_riesgoTrabajoPatron), TotalPatron = Utils.TruncateDecimales(_totalPatron), TotalObrero = Utils.TruncateDecimales(_totalObrero) }; // _nominasDao.AddCuotasImss(cuotasImss); return(cuotasImss); } else { var cuotasImss = new NOM_Cuotas_IMSS() { IdCuota = 0, IdNomina = nomina?.IdNomina ?? 0, IdFiniquito = finiquito?.IdFiniquito ?? 0, Cuota_Fija_Patron = Utils.TruncateDecimales(_cuotaFijaPatron), Excedente_Patron = Utils.TruncateDecimales(_excedentePatron), Excedente_Obrero = Utils.TruncateDecimales(_excedenteObrero), PrestacionesDinero_Patron = Utils.TruncateDecimales(_prestacionesDineroPatron), PrestacionesDinero_Obrero = Utils.TruncateDecimales(_prestacionesDineroObrero), Pensionados_Patron = Utils.TruncateDecimales(_pencionadosBeneficiadosPatron), Pensionados_Obrero = Utils.TruncateDecimales(_pencionadosBeneficiadosObrero), InvalidezVida_Patron = Utils.TruncateDecimales(_invalidezVidaPatron), InvalidezVida_Obrero = Utils.TruncateDecimales(_invalidezVidaObrero), GuarderiasPrestaciones_Patron = Utils.TruncateDecimales(_guarderiasPatron), SeguroRetiro_Patron = Utils.TruncateDecimales(_seguroRetiroPatron), CesantiaVejez_Patron = Utils.TruncateDecimales(_cesantiaVejezPatron), CesantiaVejez_Obrero = Utils.TruncateDecimales(_cesantiaVejezObrero), Infonavit_Patron = Utils.TruncateDecimales(_infonavitPatron), RiesgoTrabajo_Patron = Utils.TruncateDecimales(_riesgoTrabajoPatron), TotalPatron = Utils.TruncateDecimales(_totalPatron), TotalObrero = Utils.TruncateDecimales(_totalObrero) }; // _nominasDao.AddCuotasImss(cuotasImss); return(cuotasImss); } //if (relativoPatronal != true) //{ // //Guardar el concepto en detalle de la nomina // MDeducciones.Imss(_totalObrero, idNomina: _idNomina, idFiniquito: _idFiniquito); //} //else //{ // _totalObrero = 0; //} ////Obeto utilizado en el metodo del procesado para la sumatoria de la nomina con los demas conceptos //var totalConcepto = new TotalConcepto //{ // Total = _totalObrero, // ImpuestoSobreNomina = 0, // TotalObligaciones = 0 //}; //return totalConcepto; }
public static void GenerarPercepciones(NOM_Nomina nomina, bool isImpuesSobreNomina = false, decimal porcentaje = 0) { }
/// <summary> /// Prestamo Fonacot = 26 /// </summary> /// <param name="nomina"></param> /// <returns></returns> public static List <NOM_Nomina_Detalle> PrestamoFonacot(NOM_Nomina nomina, NOM_PeriodosPago periodoPago) { return(CalculoDeFonacot(nomina, periodoPago)); }
/// <summary> /// Prestamo Infonavit = 25 /// </summary> /// <param name="nomina"></param> /// <param name="periodoPago"></param> /// <returns></returns> public static NOM_Nomina_Detalle PrestamoInfonavit(NOM_Nomina nomina, NOM_PeriodosPago periodoPago, int dias) { return(CalculoDeInfonavit(nomina, periodoPago, dias)); }
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); }
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); //} }
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); }
//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); }
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); }