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); }