public ActionResult GenerarPlanilla(int?ID) { #region declaracion de variables //correo electronico General utilities = new General(); List <IngresosDeduccionesVoucher> ListaIngresosVoucher = new List <IngresosDeduccionesVoucher>(); List <IngresosDeduccionesVoucher> ListaDeduccionesVoucher = new List <IngresosDeduccionesVoucher>(); ComprobantePagoModel oComprobantePagoModel = new ComprobantePagoModel(); IngresosDeduccionesVoucher ingresosColaborador = new IngresosDeduccionesVoucher(); IngresosDeduccionesVoucher deduccionesColaborador = new IngresosDeduccionesVoucher(); //enviar resultados al lado del cliente iziToast response = new iziToast(); int errores = 0; //procesar planilla empleados decimal totalPagarEmpleado = 0; decimal totalIngresosEmpleado = 0; decimal totalDeduccionesEmpleado = 0; decimal SalarioBase = 0; decimal bonos = 0, comisiones = 0, otrosIngresos = 0, deduccionesPorInstitucionesFinancieras = 0, DeduccionesExtraordinarias = 0; #endregion // INCIA PROCESO DE GENERACIÓN DE PLANILLAS try { #region CREAR ARCHIVO EXCEL DE LA PLANILLA tbCatalogoDePlanillas oNombrePlanilla = ID != null?db.tbCatalogoDePlanillas.Where(X => X.cpla_IdPlanilla == ID).FirstOrDefault() : null; string nombrePlanilla = oNombrePlanilla != null ? oNombrePlanilla.cpla_DescripcionPlanilla : "General"; string nombreDocumento = $"Planilla {nombrePlanilla} {Convert.ToString(DateTime.Now.Year)}-{Convert.ToString(DateTime.Now.Month)}-{Convert.ToString(DateTime.Now.Day)} {Convert.ToString(DateTime.Now.Hour)}-{Convert.ToString(DateTime.Now.Minute)}.xlsx"; string nombreDocumento2 = nombreDocumento; string pathFile = AppDomain.CurrentDomain.BaseDirectory + nombreDocumento2; string direccion = pathFile; SLDocument oSLDocument = new SLDocument(); System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Add("Nombres", typeof(string)); dt.Columns.Add("Apellidos", typeof(string)); dt.Columns.Add("Sueldo base", typeof(decimal)); dt.Columns.Add("Bonos", typeof(decimal)); dt.Columns.Add("Comisiones", typeof(decimal)); dt.Columns.Add("Deducciones extras", typeof(decimal)); dt.Columns.Add("Deducciones Cooperativas", typeof(decimal)); dt.Columns.Add("IHSS", typeof(decimal)); dt.Columns.Add("ISR", typeof(decimal)); dt.Columns.Add("AFP", typeof(decimal)); dt.Columns.Add("RAP", typeof(decimal)); dt.Columns.Add("TOTAL A PAGAR", typeof(decimal)); #endregion using (ERP_GMEDINAEntities db = new ERP_GMEDINAEntities()) { List <tbCatalogoDePlanillas> oIDSPlanillas = new List <tbCatalogoDePlanillas>(); using (var dbContextTransaccion = db.Database.BeginTransaction()) { //ID DE TODAS LAS PLANILLAS, PARA PROCESARLAS 1 POR 1 if (ID != null) { oIDSPlanillas = db.tbCatalogoDePlanillas.Where(X => X.cpla_IdPlanilla == ID).ToList(); } else { oIDSPlanillas = db.tbCatalogoDePlanillas.ToList(); } //PROCESAR LAS PLANILLAS 1 POR 1 foreach (var iter in oIDSPlanillas) { try { //OBTENER PLANILLA ACTUAL tbCatalogoDePlanillas oPlanilla = db.tbCatalogoDePlanillas.Find(iter.cpla_IdPlanilla); //OBTENER LOS INGRESOS DE LA PLANILLA ACTUAL List <V_PlanillaIngresos> oIngresos = db.V_PlanillaIngresos.Where(x => x.cpla_IdPlanilla == oPlanilla.cpla_IdPlanilla).ToList(); //OBTENER LAS DEDUCCIONES DE LA PLANILLA ACTUAL List <V_PlanillaDeducciones> oDeducciones = db.V_PlanillaDeducciones.Where(x => x.cpla_IdPlanilla == oPlanilla.cpla_IdPlanilla).ToList(); //OBTNER LA LISTA DE EMPLEADOS QUE PERTENECEN A LA PLANILLA ACTUAL List <tbEmpleados> oEmpleados = db.tbEmpleados.Where(emp => emp.cpla_IdPlanilla == oPlanilla.cpla_IdPlanilla).ToList(); //================== PROCESAR PLANILLA COLABORADOR POR COLABORADOR ============================== foreach (var empleadoActual in oEmpleados) { try { //INFORMACION DEL COLABORADOR ACTUAL V_InformacionColaborador InformacionDelEmpleadoActual = db.V_InformacionColaborador.Where(x => x.emp_Id == empleadoActual.emp_Id).FirstOrDefault(); //EL SALARIO BASE SalarioBase = InformacionDelEmpleadoActual.SalarioBase; ListaIngresosVoucher.Add(new IngresosDeduccionesVoucher { concepto = "Salario base", monto = SalarioBase }); //VARIABLES NECESARIAS PARA PROCESAR LA PLANILLA DEL COLABORADOR ACTUAL bonos = 0; comisiones = 0; otrosIngresos = 0; deduccionesPorInstitucionesFinancieras = 0; DeduccionesExtraordinarias = 0; //OBTENER LAS DEDUCCIONES EXTRAS DEL COLABORADOR ACTUAL (SI LAS TIENE Y NO HA TERMINADO DE PAGARLAS) List <V_DeduccionesExtrasColaboradores> oDeduccionesExtrasColaborador = db.V_DeduccionesExtrasColaboradores.Where(DEX => DEX.emp_Id == empleadoActual.emp_Id && DEX.dex_MontoRestante > 0 && DEX.dex_Activo == true).ToList(); //VERIFICAR SI LA LISTA DE DEDUCCIONES EXTRAS DEL COLABORADOR NO VIENE NULA if (oDeduccionesExtrasColaborador.Count > 0) { //SI TIENE DEDUCCIONES EXTRAS, HAY QUE IR SUMANDOLAS TODAS foreach (var oDeduccionesExtrasColaboradorIterador in oDeduccionesExtrasColaborador) { DeduccionesExtraordinarias += oDeduccionesExtrasColaboradorIterador.dex_Cuota; //CÓDIGO PARA RESTAR LA CUOTA PAGADA DE LA CANTIDAD RESTANTE DE LA DEDUCCIÓN oDeduccionesExtrasColaboradorIterador.dex_MontoRestante = oDeduccionesExtrasColaboradorIterador.dex_MontoRestante - oDeduccionesExtrasColaboradorIterador.dex_Cuota; //db.Entry(oDeduccionesExtrasColaboradorIterador).State = EntityState.Modified; ListaDeduccionesVoucher.Add(new IngresosDeduccionesVoucher { concepto = oDeduccionesExtrasColaboradorIterador.dex_ObservacionesComentarios, monto = oDeduccionesExtrasColaboradorIterador.dex_Cuota }); } //db.SaveChanges(); } //OBTENER LAS DEDUCCIONES POR INSTITUCIONES FINANCIERAS DEL COLABORADOR ACTUAL List <V_DeduccionesInstitucionesFinancierasColaboradres> oDeduInstiFinancieras = db.V_DeduccionesInstitucionesFinancierasColaboradres.Where(x => x.emp_Id == empleadoActual.emp_Id && x.deif_Activo == true).ToList(); //VERIFICAR SI LA LISTA DE DEDUCCIONES POR INSTITUCIONES FINANCIERAS DEL COLABORADOR NO VIENE NULA if (oDeduInstiFinancieras.Count > 0) { //SI TIENE DEDUCCIONES DE INSTITUCIONES FINANCIERAS, HAY QUE IR SUMANDOLAS TODAS foreach (var oDeduInstiFinancierasIterador in oDeduInstiFinancieras) { deduccionesPorInstitucionesFinancieras += oDeduInstiFinancierasIterador.deif_Monto; //CÓDIGO PARA RESTAR LA CUOTA PAGADA DE LA CANTIDAD RESTANTE DE LA DEDUCCIÓN oDeduInstiFinancierasIterador.deif_Activo = false; //db.Entry(oDeduInstiFinancierasIterador).State = EntityState.Modified; ListaDeduccionesVoucher.Add(new IngresosDeduccionesVoucher { concepto = $"{oDeduInstiFinancierasIterador.insf_DescInstitucionFinanc} {oDeduInstiFinancierasIterador.deif_Comentarios}", monto = oDeduInstiFinancierasIterador.deif_Monto }); } //db.SaveChanges(); } //OBTENER LOS BONOS DEL COLABORADOR SI LOS TIENE List <V_BonosColaborador> oBonosColaboradores = db.V_BonosColaborador.Where(x => x.emp_Id == empleadoActual.emp_Id && x.cb_Activo == true && x.cb_Pagado == false).ToList(); if (oBonosColaboradores.Count > 0) { //SI TIENE BONOS, HAY QUE IR SUMANDOLAS TODAS foreach (var oBonosColaboradoresIterador in oBonosColaboradores) { bonos += oBonosColaboradoresIterador.cb_Monto; //CÓDIGO PARA RESTAR LA CUOTA PAGADA DE LA CANTIDAD RESTANTE DE LA DEDUCCIÓN oBonosColaboradoresIterador.cb_Pagado = true; //db.Entry(oBonosColaboradoresIterador).State = EntityState.Modified; ListaIngresosVoucher.Add(new IngresosDeduccionesVoucher { concepto = oBonosColaboradoresIterador.cin_DescripcionIngreso, monto = oBonosColaboradoresIterador.cb_Monto }); } //db.SaveChanges(); } //OBTENER LAS COMISIONES DEL COLABORADOR SI LOS TIENE List <V_ComisionesColaborador> oComisionesColaboradores = db.V_ComisionesColaborador.Where(x => x.emp_Id == empleadoActual.emp_Id && x.cc_Activo == true && x.cc_Pagado == false).ToList(); if (oComisionesColaboradores.Count > 0) { //SI TIENE BONOS, HAY QUE IR SUMANDOLAS TODAS foreach (var oComisionesColaboradoresIterador in oComisionesColaboradores) { comisiones += oComisionesColaboradoresIterador.cc_Monto; //CÓDIGO PARA RESTAR LA CUOTA PAGADA DE LA CANTIDAD RESTANTE DE LA DEDUCCIÓN oComisionesColaboradoresIterador.cc_Pagado = true; //db.Entry(oComisionesColaboradoresIterador).State = EntityState.Modified; ListaIngresosVoucher.Add(new IngresosDeduccionesVoucher { concepto = oComisionesColaboradoresIterador.cin_DescripcionIngreso, monto = oComisionesColaboradoresIterador.cc_Monto }); } //db.SaveChanges(); } totalIngresosEmpleado = SalarioBase + bonos + comisiones; totalDeduccionesEmpleado = DeduccionesExtraordinarias - deduccionesPorInstitucionesFinancieras; totalPagarEmpleado = totalIngresosEmpleado - totalDeduccionesEmpleado; //REGISTRO EN LA HOJA DE EXCEL dt.Rows.Add(empleadoActual.tbPersonas.per_Nombres, empleadoActual.tbPersonas.per_Apellidos, SalarioBase, bonos, comisiones, DeduccionesExtraordinarias, deduccionesPorInstitucionesFinancieras, 0, 0, 0, 0, totalPagarEmpleado); #region Enviar comprobante de pago por email oComprobantePagoModel.EmailAsunto = "Comprobante de pago"; oComprobantePagoModel.NombreColaborador = empleadoActual.tbPersonas.per_Nombres + " " + empleadoActual.tbPersonas.per_Apellidos; oComprobantePagoModel.idColaborador = empleadoActual.emp_Id; oComprobantePagoModel.EmailDestino = empleadoActual.tbPersonas.per_CorreoElectronico; oComprobantePagoModel.PeriodoPago = "1/11/2019 - 30/11/2019"; oComprobantePagoModel.Ingresos = ListaIngresosVoucher; oComprobantePagoModel.Deducciones = ListaDeduccionesVoucher; oComprobantePagoModel.totalIngresos = totalIngresosEmpleado; oComprobantePagoModel.totalDeducciones = totalDeduccionesEmpleado; oComprobantePagoModel.NetoPagar = totalPagarEmpleado; //Enviar comprobante de pago try { if (!utilities.SendEmail(oComprobantePagoModel)) { errores++; } else { ListaDeduccionesVoucher = new List <IngresosDeduccionesVoucher>(); ListaIngresosVoucher = new List <IngresosDeduccionesVoucher>(); } } catch (Exception ex) { errores++; } #endregion } //CATCH FOR EACH EMPLEADO POR EMPLEADO catch (Exception ex) { // AGREGAR EL EMPLEADO ACTUAL AL QUE FALLÓ LA GENERACIÓN DE SU PLANILLA dt.Rows.Add(empleadoActual.tbPersonas.per_Nombres + ' ' + empleadoActual.tbPersonas.per_Apellidos, "Ocurrió un error al generar la planilla de este empleado." ); errores++; } } db.SaveChanges(); dbContextTransaccion.Commit(); } //CATCH FOR EACH DE LAS PLANILLAS catch (Exception ex) { // SI ALGO FALLA, HACER UN ROLLBACK dbContextTransaccion.Rollback(); errores++; dt.Rows.Add("Ocurrió un error al generar la planilla de xxyy."); } } } } response.Response = $"El proceso de generación de planilla se realizó, con {errores} errores"; response.Encabezado = "Exito"; response.Tipo = "success"; try { oSLDocument.ImportDataTable(1, 1, dt, true); oSLDocument.SaveAs(direccion); } catch (Exception ex) { response.Response = "Planilla generada, error al crear documento excel."; response.Encabezado = "Advertencia"; response.Tipo = "warning"; } //=========================================================================== } // CATCH DEL PROCESO DE GENERACIÓN DE PLANILLAS catch (Exception ex) { response.Response = "El proceso de generación de planillas falló, contacte al adminstrador."; response.Encabezado = "Error"; response.Tipo = "error"; } return(new JsonResult { Data = response, JsonRequestBehavior = JsonRequestBehavior.AllowGet }); }
public async Task <ActionResult> GenerarPlanilla(int?ID, bool?enviarEmail, DateTime fechaInicio, DateTime fechaFin, List <ViewModelTasasDeCambio> monedas, int tmon_IdMonedaDeduccionesDePlanilla) { #region declaracion de instancias // helper General utilities = new General(); // instancias para el comprobante de pago List <IngresosDeduccionesVoucher> ListaIngresosVoucher = new List <IngresosDeduccionesVoucher>(); List <IngresosDeduccionesVoucher> ListaDeduccionesVoucher = new List <IngresosDeduccionesVoucher>(); ComprobantePagoModel oComprobantePagoModel = new ComprobantePagoModel(); IngresosDeduccionesVoucher ingresosColaborador = new IngresosDeduccionesVoucher(); IngresosDeduccionesVoucher deduccionesColaborador = new IngresosDeduccionesVoucher(); // instancias para el reporte final ReportePlanillaViewModel oPlanillaEmpleado; List <ReportePlanillaViewModel> reporte = new List <ReportePlanillaViewModel>(); ViewModelListaErrores oError; List <ViewModelListaErrores> listaErrores = new List <ViewModelListaErrores>(); // instancia para resultado del proceso en izitoast General.iziToast response = new General.iziToast(); int errores = 0; string codigoDePlanillaGenerada = String.Empty; #endregion #region inicia proceso de generación de planilla try { using (ERP_GMEDINAEntities db = new ERP_GMEDINAEntities()) { List <tbCatalogoDePlanillas> oIDSPlanillas = new List <tbCatalogoDePlanillas>(); List <int> planillasConColaboradores = db.V_ColaboradoresPorPlanilla.Where(x => x.CantidadColaboradores > 0).Select(x => x.cpla_IdPlanilla).ToList(); // seleccionar las planillas que se van a generar if (ID != null) { oIDSPlanillas = db.tbCatalogoDePlanillas .Where(X => X.cpla_IdPlanilla == ID) .ToList(); } else { oIDSPlanillas = db.tbCatalogoDePlanillas .Where(x => x.cpla_Activo == true && planillasConColaboradores.Contains(x.cpla_IdPlanilla)) .ToList(); } if (oIDSPlanillas != null) { // procesar todas las planillas seleccionadas foreach (var iter in oIDSPlanillas) { codigoDePlanillaGenerada = $"PLANI_{Function.DatetimeNow().Year}{Function.DatetimeNow().Month}{Function.DatetimeNow().Day}_{Function.DatetimeNow().Hour}{Function.DatetimeNow().Minute}{Function.DatetimeNow().Second}"; try { // planilla actual del foreach tbCatalogoDePlanillas oPlanilla = db.tbCatalogoDePlanillas .Find(iter.cpla_IdPlanilla); // ingresos de la planilla actual List <V_PlanillaIngresos> oIngresos = db.V_PlanillaIngresos .Where(x => x.cpla_IdPlanilla == oPlanilla.cpla_IdPlanilla) .ToList(); // deducciones de la planilla actual List <V_PlanillaDeducciones> oDeducciones = db.V_PlanillaDeducciones .Where(x => x.cpla_IdPlanilla == oPlanilla.cpla_IdPlanilla) .ToList(); // empleados de la planilla actual List <tbEmpleados> oEmpleados = db.tbEmpleados .Where(emp => emp.cpla_IdPlanilla == oPlanilla.cpla_IdPlanilla && emp.emp_Estado == true) .ToList(); int contador = 1, idHistorialPago = 0, idDetalleDeduccionHisotorialesContador = 1, idDetalleIngresoHisotorialesContador = 1; string identidadEmpleado = string.Empty, NombresEmpleado = string.Empty; // procesar planilla empleado por empleado foreach (var empleadoActual in oEmpleados) { using (var dbContextTransaccion = db.Database.BeginTransaction()) { try { #region variables reporte view model string codColaborador = string.Empty, nombreColaborador = string.Empty, tipoPlanilla = string.Empty; decimal SalarioBase = 0, salarioHora = 0, totalAFP = 0, totalISR = 0, totalSalario = 0; int horasTrabajadas = 0, horasExtrasTrabajadas = 0, cantidadUnidadesBonos = 0; decimal?totalComisiones = 0, totalHorasExtras = 0, totalHorasPermiso = 0, totalBonificaciones = 0, totalIngresosIndivuales = 0, totalVacaciones = 0, totalIngresosEmpleado = 0, colaboradorDeducciones = 0, totalInstitucionesFinancieras = 0, totalOtrasDeducciones = 0, adelantosSueldo = 0, totalDeduccionesEmpleado = 0, totalDeduccionesIndividuales = 0, netoAPagarColaborador = 0; oPlanillaEmpleado = new ReportePlanillaViewModel(); oError = new ViewModelListaErrores(); string moneda = db.tbSueldos.Where(x => x.emp_Id == empleadoActual.emp_Id && x.sue_Estado == true).Select(x => x.tbTipoMonedas.tmon_Descripcion).FirstOrDefault(); // variables para insertar en los historiales de pago IEnumerable <object> listHistorialPago = null; string MensajeError = ""; List <tbHistorialDeduccionPago> lisHistorialDeducciones = new List <tbHistorialDeduccionPago>(); List <tbHistorialDeIngresosPago> lisHistorialIngresos = new List <tbHistorialDeIngresosPago>(); #endregion V_InformacionColaborador InformacionDelEmpleadoActual = null; decimal resultSeptimoDia = 0; int userId = (int)Session["UserLogin"]; //Procesar Ingresos await Task.Run(() => Ingresos.ProcesarIngresos(userId, fechaInicio, fechaFin, ListaIngresosVoucher, listaErrores, ref errores, db, empleadoActual, ref SalarioBase, out horasTrabajadas, ref salarioHora, ref totalSalario, ref totalComisiones, out horasExtrasTrabajadas, ref cantidadUnidadesBonos, ref totalHorasExtras, ref totalHorasPermiso, ref totalBonificaciones, ref totalIngresosIndivuales, ref totalVacaciones, out totalIngresosEmpleado, lisHistorialIngresos, out InformacionDelEmpleadoActual, out resultSeptimoDia)); //Procesar Deducciones await Task.Run(() => Deducciones.ProcesarDeducciones(tmon_IdMonedaDeduccionesDePlanilla, monedas, userId, fechaInicio, fechaFin, ListaDeduccionesVoucher, listaErrores, ref errores, db, oDeducciones, empleadoActual, SalarioBase, totalIngresosEmpleado, ref colaboradorDeducciones, ref totalAFP, ref totalInstitucionesFinancieras, ref totalOtrasDeducciones, ref adelantosSueldo, out totalDeduccionesEmpleado, ref totalDeduccionesIndividuales, out netoAPagarColaborador, lisHistorialDeducciones, InformacionDelEmpleadoActual)); //ISR TimeSpan tDias = fechaFin - fechaInicio; totalISR = CalculoISR.CalcularISR(db, empleadoActual, totalSalario, totalISR, tDias.Days + 1); idHistorialPago = GuardarEnHistorialDePago.GuardarHistorialDePago(fechaInicio, fechaFin, listaErrores, ref errores, codigoDePlanillaGenerada, db, ref contador, ref idDetalleDeduccionHisotorialesContador, ref idDetalleIngresoHisotorialesContador, empleadoActual, totalSalario, totalComisiones, horasExtrasTrabajadas, cantidadUnidadesBonos, totalHorasExtras, totalHorasPermiso, totalBonificaciones, totalIngresosIndivuales, totalVacaciones, totalISR, totalAFP, adelantosSueldo, totalDeduccionesIndividuales, netoAPagarColaborador, ref listHistorialPago, ref MensajeError, lisHistorialDeducciones, lisHistorialIngresos, InformacionDelEmpleadoActual, resultSeptimoDia); // guardar cambios en la bbdd db.SaveChanges(); dbContextTransaccion.Commit(); //EnviarComprobanteDePago await Task.Run(() => EnviarComprobanteDePago.EnviarComprobanteDePagoColaborador(moneda, enviarEmail, fechaInicio, fechaFin, utilities, ref ListaIngresosVoucher, ref ListaDeduccionesVoucher, oComprobantePagoModel, listaErrores, ref errores, db, empleadoActual, totalIngresosEmpleado, totalDeduccionesEmpleado, netoAPagarColaborador, InformacionDelEmpleadoActual)); #region crear registro de la planilla del colaborador para el reporte await Task.Run(() => ReportePlanilla.ReporteColaboradorPlanilla(moneda, ref oPlanillaEmpleado, empleadoActual, SalarioBase, horasTrabajadas, salarioHora, totalSalario, totalComisiones, horasExtrasTrabajadas, totalHorasExtras, totalHorasPermiso, totalBonificaciones, totalIngresosIndivuales, totalVacaciones, totalIngresosEmpleado, totalISR, colaboradorDeducciones, totalAFP, totalInstitucionesFinancieras, totalOtrasDeducciones, adelantosSueldo, totalDeduccionesEmpleado, totalDeduccionesIndividuales, netoAPagarColaborador, InformacionDelEmpleadoActual)); reporte.Add(oPlanillaEmpleado); oPlanillaEmpleado = null; identidadEmpleado = InformacionDelEmpleadoActual.per_Identidad; NombresEmpleado = InformacionDelEmpleadoActual.per_Nombres; #endregion } #endregion // catch por si hubo un error al generar la planilla de un empleado catch (Exception ex) { // si hay un error, hacer un rollback dbContextTransaccion.Rollback(); // mensaje del error en el registro del colaborador errores++; listaErrores.Add(new ViewModelListaErrores { Identidad = identidadEmpleado, NombreColaborador = NombresEmpleado, Error = "Error al procesar planilla del colaborador.", PosibleSolucion = "Verifique información registrada al colaborador y vuelva a intentarlo." }); } } // termina transaccion } } // catch si se produjo un error al procesar una sola planilla catch (Exception ex) { listaErrores.Add(new ViewModelListaErrores { Identidad = $"Planilla {iter.cpla_DescripcionPlanilla}", NombreColaborador = "", Error = $"Ocurrió un error al procesar la planilla {iter.cpla_DescripcionPlanilla}" }); errores++; } } // for each idsPlanillas } // if idsPlanilla != null } // using entities model // enviar resultado al cliente response.Response = $"El proceso de generación de planilla se realizó, con {errores} errores"; response.Encabezado = "Exito"; response.Tipo = errores == 0 ? "success" : "warning"; } // catch se produjo un error fatal en el proceso generar planilla catch (Exception ex) { response.Response = ""; response.Encabezado = "Error"; response.Tipo = "error"; listaErrores.Add(new ViewModelListaErrores { Identidad = $"Planilla", NombreColaborador = "", Error = $"El proceso de generación de planillas falló, contacte al adminstrador.", PosibleSolucion = "Vuelva a intentarlo" }); } // retornar resultado del proceso return(Json(new { Data = reporte, listaDeErrores = listaErrores, Response = response }, JsonRequestBehavior.AllowGet)); }