//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); }
public static CalculoAnual GetCalculoAnualconPrevision(int idEmpleado, int idEjercicio, decimal sd, decimal sdi, int?idempresa, decimal gravadoextra, decimal uma) { decimal resultadoA = 0; int[] ltnom = { 2, 3, 4, 5, 6 }; var item = new CalculoAnual() { BaseGravable = 0, Cuotafija = 0, LimiteInferior = 0, Base = 0, Tasa = 0, IsrAntesDeSub = 0, Subsidio = 0, marginal = 0, ResultadoIsrOSubsidio = 0, isrPagado = 0 }; using (var ctx = new RHEntities()) { int tLeft = 0, diasPeriocidad = 0; decimal sueldoPeriocidad = 0, sueldoPeriocidadPremio = 0; var Anominas = (from n in ctx.NOM_Nomina join cf in ctx.NOM_CFDI_Timbrado on new { n.IdPeriodo, n.IdNomina } equals new { cf.IdPeriodo, cf.IdNomina } where n.IdEmpleado == idEmpleado && n.IdEjercicio == idEjercicio && n.IdEmpresaFiscal == idempresa && n.IdEmpresaFiscal != 0 && cf.Cancelado == false select n).ToList(); // var Anominas = ctx.NOM_Nomina.Where(x => x.IdEmpleado == idEmpleado && x.IdEjercicio == idEjercicio && x.IdEmpresaFiscal==idempresa && x.IdEmpresaFiscal!=0).ToList(); if (Anominas.Count > 0) { var Lnominas = Anominas.Select(x => x.IdNomina).ToList(); var cper = (from n in Anominas join p in ctx.NOM_PeriodosPago on n.IdPeriodo equals p.IdPeriodoPago where ltnom.Contains(p.IdTipoNomina) orderby n.IdPeriodo ascending select p.IdPeriodoPago); if (cper.Count() == 0) { return(item = new CalculoAnual()); } int per = cper.Last(); //Anominas.Where(x=> x.).Select(x => x.IdPeriodo).Last(); DateTime fechafinPeriodo = ctx.NOM_PeriodosPago.Where(x => x.IdPeriodoPago == per).Select(x => x.Fecha_Fin).FirstOrDefault(); int periodicidad = ctx.Empleado_Contrato.Where(x => x.IdEmpleado == idEmpleado && x.FechaBaja == null).Select(x => x.IdPeriodicidadPago).FirstOrDefault(); var TisrpagadoA = ctx.NOM_Nomina_Detalle.Where(x => x.IdConcepto == 43 && Lnominas.Contains(x.IdNomina)).Select(x => x.Total).Sum(); var TsaldoAnual = ctx.NOM_Nomina_Detalle.Where(x => x.IdConcepto == 143 && Lnominas.Contains(x.IdNomina)).Select(x => x.Total).DefaultIfEmpty(0).Sum(); var TsubcausadoA = ctx.NOM_Nomina.Where(x => Lnominas.Contains(x.IdNomina)).Select(x => x.SubsidioCausado).Sum(); var TgravadoA = ctx.NOM_Nomina_Detalle.Where(x => Lnominas.Contains(x.IdNomina)).Select(x => x.GravadoISR).Sum(); item.Exento = ctx.NOM_Nomina_Detalle.Where(x => Lnominas.Contains(x.IdNomina)).Select(x => x.ExentoISR).Sum(); var conceptosE = ctx.NOM_Empleado_Conceptos.Where(x => x.IdEmpleado == idEmpleado); int dQuedan = Utils.GetDaysleft(fechafinPeriodo); // para calculo anual de años pasados if (fechafinPeriodo.Year == DateTime.Now.Year) { bool asist = conceptosE.Any(x => x.IdConcepto == 40); bool punt = conceptosE.Any(x => x.IdConcepto == 8); // Bloque para generar prevision de nomina switch (periodicidad) { case 2: diasPeriocidad = 7; break; case 3: diasPeriocidad = 14; break; case 4: diasPeriocidad = 15; break; case 5: diasPeriocidad = 30; break; } tLeft = dQuedan / diasPeriocidad; sueldoPeriocidadPremio = sdi * diasPeriocidad; sueldoPeriocidad = sd * diasPeriocidad; //lo siguente calcula el valance de los dias que faltan cuando las quincenas son de 16 dias y no de 15 //refiriendoce a los meses que tienen 31 dias, ya qye al calcular "sueldoPeriocidad" se toma en cuenta el valor absoluto de la periodicidad (diasPeriocidad). var modbalance = dQuedan % diasPeriocidad; var difgrabado = sd * modbalance; //calculo probicional de aguinaldo para grabado anual //var aguinaldo = sd * 15; //var limiteExentoAguinaldo = uma * 30m; //var grabadoAguinaldo = (aguinaldo > limiteExentoAguinaldo && limiteExentoAguinaldo > 0) ? aguinaldo - limiteExentoAguinaldo : 0; // Verifica si tiene derecho a premio asistencia y puntualidad. if (asist) { sueldoPeriocidad = sueldoPeriocidad + (sueldoPeriocidadPremio * 0.10M); } if (punt) { sueldoPeriocidad = sueldoPeriocidad + (sueldoPeriocidadPremio * 0.10M); } //ISR del sueldo nominal mas sus premios. var isrPeriocidad = CalculoIsrSubsidio304especial(diasPeriocidad, sueldoPeriocidad, sd, 0, Anominas.Select(x => x.TipoTarifa).FirstOrDefault(), false); //calculo especial de isr para los dias extras que faltan cuando los meses tiene 31 dias (simepre por que diciembre tiene 31 dias) var isrDiasFaltantes = CalculoIsrSubsidio304especial(modbalance, (sd * modbalance), sd, 0, Anominas.Select(x => x.TipoTarifa).FirstOrDefault(), false); // Verificacion si genera ISR o Subsidio. if (isrPeriocidad.EsISR) { decimal isrPrevision = isrPeriocidad.ResultadoIsrOSubsidio * tLeft; //se le suma el proporcional del impuesto de los dias faltantes isrPrevision += isrDiasFaltantes.ResultadoIsrOSubsidio; TisrpagadoA += isrPrevision; } decimal subPrevision = isrPeriocidad.Subsidio * tLeft; //se le suma el proporcional del impuesto de los dias faltantes si existe if (isrDiasFaltantes != null) { subPrevision += isrDiasFaltantes.Subsidio; } TsubcausadoA += subPrevision; TgravadoA = tLeft > 0 ? TgravadoA + ((sueldoPeriocidad * tLeft) + difgrabado /*+ grabadoAguinaldo*/) : TgravadoA; //#######################################################################//// } // Anexamos si hay algun gravado que no se tome de las nominas TgravadoA += gravadoextra; // Guardamos valores para presentar en reporte. item.BaseGravable = TgravadoA; item.Subsidio = TsubcausadoA; // Se calcula ISR del total gravado con prevision. var isrTgravadoA = CalculoIsrSubsidioAnual(TgravadoA); // Guardamos valores para presentar en reporte. item.Tasa = isrTgravadoA.Tasa; item.Base = isrTgravadoA.Base; item.LimiteInferior = isrTgravadoA.LimiteInferior; item.IsrAntesDeSub = isrTgravadoA.ResultadoIsrOSubsidio; item.Cuotafija = isrTgravadoA.BaseGravableMensual; item.marginal = isrTgravadoA.NetoAPagar; item.isrPagado = TisrpagadoA; //Comparacion en caso de que subsidio causado en el año es mayor al ISR anual no se cobra ni se repone valor al empleado. if (isrTgravadoA.ResultadoIsrOSubsidio < TsubcausadoA) { return(item); } resultadoA = isrTgravadoA.ResultadoIsrOSubsidio - TsubcausadoA; resultadoA += TsaldoAnual; resultadoA -= TisrpagadoA; item.ResultadoIsrOSubsidio = resultadoA; } /* var datos = ctx.NOM_Nomina.Where(x=> x.SBCotizacionDelProcesado>0 && x.Dias_Laborados!=0); * datos.ToList().ForEach(c => c.SubsidioCausado = CalculoIsrSubsidio304especial(c.Dias_Laborados, c.SBCotizacionDelProcesado, c.SD, 0, c.TipoTarifa, false).Subsidio); * datos.ToList().ForEach(c => c.ISRantesSubsidio = CalculoIsrSubsidio304especial(c.Dias_Laborados, c.SBCotizacionDelProcesado, c.SD, 0, c.TipoTarifa, false).IsrAntesDeSub); * ctx.SaveChanges();*/ } 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 CalculoAnual GetCalculoAnual(int idEmpleado, int idEjercicio, int?idempresa, decimal baseg, decimal isr, decimal sub, decimal exento) { decimal resultadoA = 0; int[] ltnom = { 2, 3, 4, 5, 6 }; var item = new CalculoAnual() { BaseGravable = 0, Cuotafija = 0, LimiteInferior = 0, Base = 0, Tasa = 0, IsrAntesDeSub = 0, Subsidio = 0, marginal = 0, ResultadoIsrOSubsidio = 0, isrPagado = 0 }; using (var ctx = new RHEntities()) { var Anominas = (from n in ctx.NOM_Nomina join cf in ctx.NOM_CFDI_Timbrado on new { n.IdPeriodo, n.IdNomina } equals new { cf.IdPeriodo, cf.IdNomina } where n.IdEmpleado == idEmpleado && n.IdEjercicio == idEjercicio && n.IdEmpresaFiscal == idempresa && n.IdEmpresaFiscal != 0 && cf.Cancelado == false select n).ToList(); if (Anominas.Count > 0) { var Lnominas = Anominas.Select(x => x.IdNomina).ToList(); var cper = (from n in Anominas join p in ctx.NOM_PeriodosPago on n.IdPeriodo equals p.IdPeriodoPago where ltnom.Contains(p.IdTipoNomina) orderby n.IdPeriodo ascending select p.IdPeriodoPago); if (cper.Count() == 0) { return(item = new CalculoAnual()); } var TisrpagadoA = ctx.NOM_Nomina_Detalle.Where(x => x.IdConcepto == 43 && Lnominas.Contains(x.IdNomina)).Select(x => x.Total).Sum(); var TsaldoAnual = ctx.NOM_Nomina_Detalle.Where(x => x.IdConcepto == 143 && Lnominas.Contains(x.IdNomina)).Select(x => x.Total).DefaultIfEmpty(0).Sum(); var TsubcausadoA = ctx.NOM_Nomina.Where(x => Lnominas.Contains(x.IdNomina)).Select(x => x.SubsidioCausado).Sum(); var TgravadoA = ctx.NOM_Nomina_Detalle.Where(x => Lnominas.Contains(x.IdNomina)).Select(x => x.GravadoISR).Sum(); var TexentoA = ctx.NOM_Nomina_Detalle.Where(x => Lnominas.Contains(x.IdNomina)).Select(x => x.ExentoISR).Sum(); TgravadoA += baseg; TexentoA += exento; TisrpagadoA += isr; TsubcausadoA += sub; // Guardamos valores para presentar en reporte. item.BaseGravable = TgravadoA; item.Exento = TexentoA; item.Subsidio = TsubcausadoA; // Se calcula ISR del total gravado con prevision. var isrTgravadoA = CalculoIsrSubsidioAnual(TgravadoA); // Guardamos valores para presentar en reporte. item.Tasa = isrTgravadoA.Tasa; item.Base = isrTgravadoA.Base; item.LimiteInferior = isrTgravadoA.LimiteInferior; item.IsrAntesDeSub = isrTgravadoA.ResultadoIsrOSubsidio; item.Cuotafija = isrTgravadoA.BaseGravableMensual; item.marginal = isrTgravadoA.NetoAPagar; item.isrPagado = TisrpagadoA; //Comparacion en caso de que subsidio causado en el año es mayor al ISR anual no se cobra ni se repone valor al empleado. if (isrTgravadoA.ResultadoIsrOSubsidio < TsubcausadoA) { return(item); } resultadoA = isrTgravadoA.ResultadoIsrOSubsidio - TsubcausadoA; resultadoA += TsaldoAnual; resultadoA -= TisrpagadoA; item.ResultadoIsrOSubsidio = resultadoA; } } return(item); }