private static List <InformeTrazabilidad> TrazabilidadMarcacionesProcess(ContextService db, bool insert = false, int?IdAgente = null, DateTime?FechaInicio = null, DateTime?FechaFin = null, bool?totalizar = false) { long index = InformeTrazabilidad.Max(); List <InformeTrazabilidad> model = new List <InformeTrazabilidad>(); var listAgenda = db.Marcacions.Get(p => p.Fecha >= FechaInicio && p.Fecha <= FechaFin && (IdAgente == null || p.IdAgente == IdAgente)).OrderBy(p => p.Fecha).ToList(); var listAgente = listAgenda.Select(p => p.IdAgente).Distinct(); foreach (var currentIdAgente in listAgente) { var list = listAgenda.Where(p => p.IdAgente == currentIdAgente).ToList(); list.ForEach(p => p.Ubicacion = String.Format("{0}|{1}|{2}", p.HoraInicio.HasValue ? p.HoraInicio.Value.ToString("HH:mm") : p.HoraFin.HasValue ? p.HoraFin.Value.ToString("HH:mm") : p.Fecha.ToString("HH:mm"), p.Latitud, p.Longitud)); list.ForEach(p => p.Reportes = 1); foreach (var item in list) { model.Add(new InformeTrazabilidad() { IdInformeTrazabilidad = index, IdAgente = currentIdAgente, Fecha = item.Fecha.Date, HoraEntrada = item.HoraInicio.HasValue ? item.HoraInicio.Value.ToString("HH:mm") : item.HoraFin.HasValue ? item.HoraFin.Value.ToString("HH:mm") : string.Empty, Tiempo = "0 min.", HoraSalida = item.HoraFin.HasValue ? item.HoraFin.Value.ToString("HH:mm") : item.HoraInicio.HasValue ? item.HoraInicio.Value.ToString("HH:mm") : string.Empty, Distancia = 0.00D, EsMovimiento = false, Minutos = 0.00D, Ubicacion = item.Ubicacion.Replace(',', '.'), Latitud = item.Latitud ?? 0, Longitud = item.Longitud ?? 0, TipoTabla = Constantes.TipoEntradaTrazabilidad.Tabla, Tipo = item.Tipo, IdMarcacion = item.IdMarcacion }); index++; } } if (totalizar.HasValue && !totalizar.Value) { foreach (var item in model.Where(p => !p.EsMovimiento)) { item.Direccion = Process.RutaOptima.GetAddress(item.Latitud, item.Longitud); } } if (insert) { model.ForEach(p => db.InformeTrazabilidads.Insert(p)); db.Save(); } return(model); }
private static List <InformeTrazabilidad> TrazabilidadAgendasProcess(ContextService db, bool insert = false, int?IdAgente = null, DateTime?FechaInicio = null, DateTime?FechaFin = null) { long index = InformeTrazabilidad.Max(); List <InformeTrazabilidad> model = new List <InformeTrazabilidad>(); var listAgenda = db.Agendas.Get(p => p.FechaInicioGestion.HasValue && p.FechaInicioGestion >= FechaInicio && p.FechaInicioGestion <= FechaFin && p.EstadoAgenda == "V" && (IdAgente == null || p.IdAgente == IdAgente)).OrderBy(p => p.FechaInicioGestion).ToList(); var listAgente = listAgenda.Select(p => p.IdAgente).Distinct(); foreach (var currentIdAgente in listAgente) { var list = listAgenda.Where(p => p.IdAgente == currentIdAgente).ToList(); list.ForEach(p => p.Ubicacion = String.Format("{0}|{1}|{2}", p.FechaInicioGestion.Value.ToString("HH:mm"), p.Latitud, p.Longitud)); list.ForEach(p => p.Reportes = 1); foreach (var item in list) { string titulo = String.Empty; string tiempo = String.Empty; double TotalMinutes = 0; if (item.FechaFinGestion == null || item.FechaInicioGestion.Value.ToString("HH:mm") == item.FechaFinGestion.Value.ToString("HH:mm")) { titulo = item.FechaInicioGestion.Value.ToString("HH:mm"); } else { titulo = String.Format("{0} - {1}", item.FechaInicioGestion.Value.ToString("HH:mm"), item.FechaFinGestion.Value.ToString("HH:mm")); var dif = item.FechaFinGestion.Value - item.FechaInicioGestion.Value; TotalMinutes = dif.TotalMinutes; if (dif.Hours > 0) { tiempo = String.Format("{0} H.", dif.Hours); } if (dif.Minutes > 0) { if (!String.IsNullOrEmpty(tiempo)) { tiempo += ", "; } tiempo += String.Format("{0} Min.", dif.Minutes); } if (!String.IsNullOrEmpty(tiempo)) { titulo = String.Format("{0} ({1})", titulo, tiempo); } } model.Add(new InformeTrazabilidad() { IdInformeTrazabilidad = index, IdAgente = currentIdAgente, Fecha = item.FechaInicioGestion.Value.Date, HoraEntrada = item.FechaInicioGestion.Value.ToString("HH:mm"), Tiempo = !String.IsNullOrEmpty(tiempo) ? tiempo : "0 min.", HoraSalida = item.FechaFinGestion.HasValue ? item.FechaFinGestion.Value.ToString("HH:mm") : string.Empty, Distancia = 0.00D, EsMovimiento = false, Minutos = TotalMinutes, Ubicacion = item.Ubicacion.Replace(',', '.'), Direccion = item.DireccionTrazabilidad, Latitud = item.Latitud ?? 0, Longitud = item.Longitud ?? 0, TipoTabla = Constantes.TipoEntradaTrazabilidad.Tabla, Tipo = Constantes.TipoEntradaTrazabilidad.Gestion, IdRuta = item.IdRuta, IdAgenda = item.IdAgenda }); index++; } } if (insert) { model.ForEach(p => db.InformeTrazabilidads.Insert(p)); db.Save(); } return(model); }
private static List <InformeTrazabilidad> TrazabilidadUbicacionesProcess(ContextService db, bool insert = false, int?IdAgente = null, DateTime?FechaInicio = null, DateTime?FechaFin = null, bool?totalizar = false) { long index = InformeTrazabilidad.Max(); List <InformeTrazabilidad> model = new List <InformeTrazabilidad>(); var listUbicacion = db.AgenteUbicaciones.Get(p => p.Fecha >= FechaInicio && p.Fecha <= FechaFin && (IdAgente == null || p.IdAgente == IdAgente)).OrderBy(p => p.Fecha).ToList(); var listAgente = listUbicacion.Select(p => p.IdAgente).Distinct(); db.ParametroHelper.Load(); foreach (var currentIdAgente in listAgente) { var list = listUbicacion.Where(p => p.IdAgente == currentIdAgente).ToList(); foreach (var item in list) { item.Ubicacion = String.Format("{0}|{1}|{2}", item.Fecha.ToString("HH:mm"), item.Latitud, item.Longitud); } foreach (var item in list) { item.Reportes = 1; } for (int i = list.Count - 1; i > 0; i--) { var actual = list[i]; var anterior = list[i - 1]; if (actual.Latitud == anterior.Latitud && actual.Longitud == anterior.Longitud) { if (actual.FechaHasta == null) { anterior.FechaHasta = actual.Fecha; } else { anterior.FechaHasta = actual.FechaHasta; } anterior.Reportes += actual.Reportes; list.Remove(actual); } else { var distance = Ubicacion.Distance(actual.Longitud ?? 0, actual.Latitud ?? 0, anterior.Longitud ?? 0, anterior.Latitud ?? 0); anterior.Distancia += distance; if (distance < db.ParametroHelper.RoutedDistance)//0.050) { if (actual.FechaHasta == null) { anterior.FechaHasta = actual.Fecha; } else { anterior.FechaHasta = actual.FechaHasta; } anterior.Reportes += actual.Reportes; list.Remove(actual); } } } foreach (var item in list) { if (item.FechaHasta != null && item.Fecha.ToString("yyyy-MM-dd HH:mm") == item.FechaHasta.Value.ToString("yyyy-MM-dd HH:mm")) { item.FechaHasta = item.Fecha; } if (item.Reportes == 1 || item.FechaHasta == null || item.Fecha == item.FechaHasta || (item.FechaHasta.Value - item.Fecha).TotalMinutes < db.ParametroHelper.MinutosIntervaloTrackingPosition) { item.EsMovimiento = true; } } for (int i = list.Count - 1; i > 0; i--) { var actual = list[i]; var anterior = list[i - 1]; if (actual.EsMovimiento && anterior.EsMovimiento)//if (actual.Reportes == 1 && anterior.Reportes == 1) { if (actual.FechaHasta == null) { anterior.FechaHasta = actual.Fecha; } else { anterior.FechaHasta = actual.FechaHasta; } anterior.Distancia += actual.Distancia; //anterior.Reportes += actual.Reportes; anterior.Ubicacion = String.Format("{0}~{1}", anterior.Ubicacion, actual.Ubicacion); list.Remove(actual); } } for (int i = 0; i < list.Count; i++) { AgenteUbicacion anterior = null; AgenteUbicacion siguiente = null; AgenteUbicacion actual = list[i]; if (actual.EsMovimiento) { if (i - 1 >= 0) { anterior = list[i - 1]; } if (i + 1 < list.Count) { siguiente = list[i + 1]; } if (anterior != null) { actual.Fecha = anterior.FechaHasta ?? anterior.Fecha; //actual.Ubicacion = String.Format("{0}~{1}", anterior.Ubicacion, actual.Ubicacion); var array = anterior.Ubicacion.Split('~'); actual.Ubicacion = String.Format("{0}~{1}", array[array.Count() - 1], actual.Ubicacion); } if (siguiente != null) { var array = siguiente.Ubicacion.Split('~'); actual.FechaHasta = siguiente.Fecha; //actual.Ubicacion = String.Format("{0}~{1}", actual.Ubicacion, siguiente.Ubicacion); actual.Ubicacion = String.Format("{0}~{1}", actual.Ubicacion, array[0]); } } } for (int i = 0; i < list.Count; i++) { AgenteUbicacion siguiente = null; AgenteUbicacion actual = list[i]; if (!actual.EsMovimiento) { if (i + 1 < list.Count) { siguiente = list[i + 1]; } if (siguiente != null && !siguiente.EsMovimiento) { var distance = Ubicacion.Distance(actual.Longitud ?? 0, actual.Latitud ?? 0, siguiente.Longitud ?? 0, siguiente.Latitud ?? 0); var movimiento = new AgenteUbicacion() { IdAgente = actual.IdAgente, Fecha = actual.FechaHasta ?? actual.Fecha, FechaHasta = siguiente.Fecha, Distancia = distance, Latitud = actual.Latitud, Longitud = actual.Longitud, Ubicacion = String.Format("{0}|{1}|{2}~{3}|{4}|{5}", actual.Fecha.ToString("HH:mm"), actual.Latitud, actual.Longitud, siguiente.Fecha.ToString("HH:mm"), siguiente.Latitud, siguiente.Longitud), EsMovimiento = true }; list.Insert(i + 1, movimiento); } } } foreach (var item in list) { string titulo = String.Empty; string tiempo = String.Empty; double TotalMinutes = 0; if (item.FechaHasta == null || item.Fecha.ToString("HH:mm") == item.FechaHasta.Value.ToString("HH:mm")) { titulo = item.Fecha.ToString("HH:mm"); } else { titulo = String.Format("{0} - {1}", item.Fecha.ToString("HH:mm"), item.FechaHasta.Value.ToString("HH:mm")); var dif = item.FechaHasta.Value - item.Fecha; TotalMinutes = dif.TotalMinutes; if (dif.Hours > 0) { tiempo = String.Format("{0} H.", dif.Hours); } if (dif.Minutes > 0) { if (!String.IsNullOrEmpty(tiempo)) { tiempo += ", "; } tiempo += String.Format("{0} Min.", dif.Minutes); } if (!String.IsNullOrEmpty(tiempo)) { titulo = String.Format("{0} ({1})", titulo, tiempo); } } model.Add(new InformeTrazabilidad() { IdInformeTrazabilidad = index, IdAgente = currentIdAgente, Fecha = item.Fecha.Date, HoraEntrada = item.Fecha.ToString("HH:mm"), Tiempo = !String.IsNullOrEmpty(tiempo) ? tiempo : "0 min.", HoraSalida = item.FechaHasta != null ? item.FechaHasta.Value.ToString("HH:mm") : item.Fecha.ToString("HH:mm"), Distancia = item.Distancia, EsMovimiento = item.EsMovimiento, Minutos = TotalMinutes, Ubicacion = item.Ubicacion.Replace(',', '.'), Latitud = item.Latitud ?? 0, Longitud = item.Longitud ?? 0, TipoTabla = Constantes.TipoEntradaTrazabilidad.Tabla, Tipo = item.EsMovimiento ? Constantes.TipoEntradaTrazabilidad.EnMovimiento : Constantes.TipoEntradaTrazabilidad.Detenido }); index++; } } if (totalizar.HasValue && !totalizar.Value) { foreach (var item in model.Where(p => !p.EsMovimiento)) { item.Direccion = Process.RutaOptima.GetAddress(item.Latitud, item.Longitud); } } if (insert) { db.AgenteUbicaciones.DeleteInformeTrazabilidad(FechaInicio.Value, FechaFin.Value); foreach (var item in model) { db.InformeTrazabilidads.Insert(item); } db.Save(); } return(model); }