public async Task <ActionResult> Index(DateTime?startDate = null, DateTime?endDate = null, string clienteId = null, string aduana = "0") { //Cargar aduanas var aduanas = AduanasRepositorio.RecuperarAduanasHinojosa(); ViewBag.Aduanas = new SelectList(aduanas, "ClaveAduana", "NombreCorto"); //En caso de que el usuario no sea administrador se establece el clienteId con el id del cliente logueado if (User.IsInRole("Administrador")) { clienteId = clienteId ?? "0"; int idClienteNumero = Convert.ToInt32(clienteId); ViewBag.NombreCliente = (await Catalogos.RecuperarPorId(idClienteNumero.ToString())).Nom1; } else { clienteId = ClienteId; ViewBag.NombreCliente = NombreCliente; } //En el caso de que el rol sea administrador hay que cargar los clientes en la vista if (User.IsInRole("Administrador")) { //Catalogos.Configuration.AutoDetectChangesEnabled = false; ViewBag.CatalogoClientes = new SelectList((await Catalogos.Recuperar()).Select(s => new { IdCli = s.IdCli, Nom1 = s.Nom1 }).OrderBy(o => o.Nom1).ToList(), "IdCli", "Nom1"); } IEnumerable <Partida> resultados = new List <Partida>(); if (startDate != null && endDate != null) { //Busqueda de resultados var Resultados = new MabeReportSource(clienteId, startDate.Value, endDate.Value); Resultados.TraficoPath = ConfigurationManager.AppSettings["RutaTrafico"].ToString(); Resultados.SorfPath = ConfigurationManager.AppSettings["RutaSORF"].ToString(); resultados = await Resultados.GetReportAsync(); var referencias = resultados.Select(s => "'" + s.Referencia + "'"); //TODO: VERIFICAR POSIBLES ATAQUES DE SQL INJECTION!!! string referenciascadena = ""; string consultaObservaciones = "SELECT * FROM EdicionesReportes WHERE ReporteId = 'Operaciones' AND Campo='Observaciones' AND ClienteId = @ClienteId "; string consultaFechasDeSalidaEditadas = "SELECT * FROM EdicionesReportes WHERE ReporteId = 'Operaciones' AND Campo='FechaSalida' AND ClienteId = @ClienteId "; if (referencias.Count() > 0) { referenciascadena = referencias.Aggregate((previo, siguiente) => previo + "," + siguiente); //Se agregan las observaciones consultaObservaciones += " AND IdentificadorRegistro IN(" + referenciascadena + ")"; var observaciones = ReportesDb.ObservacionesReportes//.Where(o => o.ClienteId == clienteId && referencias.Any(a=> a == o.IdentificadorRegistro) ) .SqlQuery(consultaObservaciones, new SqlParameter("@ClienteId", clienteId)) .ToArray(); if (observaciones != null && observaciones.Count() > 0) { resultados = resultados.GroupJoin(observaciones, itemReporte => itemReporte.Referencia, itemObservaciones => itemObservaciones.IdentificadorRegistro, (itemReporte, observacionesList) => { var observacion = observacionesList.FirstOrDefault(); if (observacion != null) { itemReporte.Observaciones = observacion.Valor; } return(itemReporte); }); } //Se agregan las fechas de salida editadas consultaFechasDeSalidaEditadas += " AND IdentificadorRegistro IN(" + referenciascadena + ")"; var fechasDeSalidas = ReportesDb.ObservacionesReportes//.Where(o => o.ClienteId == clienteId && referencias.Any(a=> a == o.IdentificadorRegistro) ) .SqlQuery(consultaFechasDeSalidaEditadas, new SqlParameter("@ClienteId", clienteId)) .ToArray(); if (fechasDeSalidas != null && fechasDeSalidas.Count() > 0) { resultados = resultados.GroupJoin(fechasDeSalidas, itemReporte => itemReporte.Referencia, itemFechaDeSalidaEditada => itemFechaDeSalidaEditada.IdentificadorRegistro, (itemReporte, fechaDeSalidaList) => { var fechaSalidaItem = fechaDeSalidaList.FirstOrDefault(); if (fechaSalidaItem != null) { itemReporte.FechaSalida = (DateTime?)Convert.ChangeType(fechaSalidaItem.Valor, Type.GetType(fechaSalidaItem.TipoNet)); } return(itemReporte); }); } if (!string.IsNullOrEmpty(aduana)) { resultados = resultados.Where(w => w.Aduana == aduana); } } } return(View(resultados)); }