private void ProcessDistribucionPorGps(ViajeDistribucion distribucion) { var entregas = distribucion.Detalles; var mensajes = new List <string> { MessageCode.EstadoLogisticoCumplidoManual.GetMessageCode(), MessageCode.EstadoLogisticoCumplidoManualNoRealizado.GetMessageCode(), MessageCode.EstadoLogisticoCumplidoManualRealizado.GetMessageCode() }; var confirmaciones = DaoFactory.MensajeDAO.GetMensajesDeConfirmacion(new[] { distribucion.Empresa.Id }, new int[] { }).Select(m => m.Codigo); var rechazos = DaoFactory.MensajeDAO.GetMensajesDeRechazo(new[] { distribucion.Empresa.Id }, new int[] { }).Select(m => m.Codigo); mensajes.AddRange(confirmaciones); mensajes.AddRange(rechazos); EntregaDistribucion anterior = null; if (distribucion.Tipo == ViajeDistribucion.Tipos.Desordenado) { entregas = distribucion.GetEntregasPorOrdenReal(); } var orden = 0; foreach (var entrega in entregas) { var te = new TimeElapsed(); var tiempoRecorrido = new TimeSpan(0); var kms = 0.0; if (anterior != null && (entrega.Estado.Equals(EntregaDistribucion.Estados.Completado) || entrega.Estado.Equals(EntregaDistribucion.Estados.Visitado))) { if (entrega.EntradaOManualExclusiva.HasValue && anterior.SalidaOManualExclusiva.HasValue) { tiempoRecorrido = entrega.EntradaOManualExclusiva.Value.Subtract(anterior.SalidaOManualExclusiva.Value); if (tiempoRecorrido.TotalMinutes < 0) { tiempoRecorrido = new TimeSpan(0); } } if (entrega.Viaje.Vehiculo != null && anterior.FechaMin < entrega.FechaMin && entrega.FechaMin < DateTime.MaxValue) { var dm = DaoFactory.DatamartDAO.GetMobilesKilometers(anterior.FechaMin, entrega.FechaMin, new List <int> { entrega.Viaje.Vehiculo.Id }).FirstOrDefault(); kms = dm != null ? dm.Kilometers : 0.0; //kms = DaoFactory.CocheDAO.GetDistance(entrega.Viaje.Vehiculo.Id, anterior.FechaMin, entrega.FechaMin); } } var tiempoEntrega = entrega.Salida.HasValue && entrega.Entrada.HasValue ? entrega.Salida.Value.Subtract(entrega.Entrada.Value) : new TimeSpan(); var desvio = entrega.Entrada.HasValue ? entrega.Entrada.Value.Subtract(entrega.Programado) : new TimeSpan(); var eventos = entrega.EventosDistri.Where(e => mensajes.Contains(e.LogMensaje.Mensaje.Codigo)); var evento = eventos.Any() ? eventos.OrderBy(e => e.Fecha).FirstOrDefault() : null; var distancia = evento != null?Distancias.Loxodromica(evento.LogMensaje.Latitud, evento.LogMensaje.Longitud, entrega.ReferenciaGeografica.Latitude, entrega.ReferenciaGeografica.Longitude) : (double?)null; var registro = new DatamartDistribucion { Empresa = entrega.Viaje.Empresa, Linea = entrega.Linea, Vehiculo = entrega.Viaje.Vehiculo, CentroDeCostos = entrega.Viaje.CentroDeCostos, Viaje = entrega.Viaje, Detalle = entrega, Fecha = entrega.Viaje.Inicio, Ruta = entrega.Viaje.Codigo.Trim(), Entrega = entrega.Descripcion.Trim().Length > 50 ? entrega.Descripcion.Trim().Substring(0, 50) : entrega.Descripcion.Trim(), IdEstado = entrega.Estado, Estado = CultureManager.GetLabel(EntregaDistribucion.Estados.GetLabelVariableName(entrega.Estado)), Km = kms, Recorrido = tiempoRecorrido.TotalMinutes, TiempoEntrega = tiempoEntrega.TotalSeconds > 0 ? tiempoEntrega.TotalMinutes : 0.0, Entrada = entrega.Entrada, Salida = entrega.Salida, Manual = entrega.Manual, Programado = entrega.Programado, Desvio = desvio.TotalMinutes, Orden = orden, Importe = 0.0f, PuntoEntrega = entrega.PuntoEntrega, Confirmacion = entrega.MensajeConfirmacion != null ? entrega.MensajeConfirmacion.Mensaje.Descripcion : string.Empty, Cliente = entrega.PuntoEntrega != null && entrega.PuntoEntrega.Cliente != null ? entrega.PuntoEntrega.Cliente.Descripcion : string.Empty, Distancia = distancia }; DaoFactory.DatamartDistribucionDAO.Save(registro); orden++; if (entrega.Estado.Equals(EntregaDistribucion.Estados.Completado) || entrega.Estado.Equals(EntregaDistribucion.Estados.Visitado)) { anterior = entrega; } } }
public ReporteDistribucionVo(DatamartDistribucion dm, bool verConfirmacion) { Id = dm.Viaje.Id; Descripcion = dm.Entrega; IdDispositivo = dm.Viaje.Vehiculo != null && dm.Viaje.Vehiculo.Dispositivo != null ? dm.Viaje.Vehiculo.Dispositivo.Id : 0; Ruta = dm.Ruta; TipoVehiculo = dm.Viaje.Vehiculo != null && dm.Viaje.Vehiculo.TipoCoche != null ? dm.Viaje.Vehiculo.TipoCoche.Descripcion : string.Empty; Vehiculo = dm.Vehiculo != null ? dm.Vehiculo.Interno : string.Empty; Empleado = dm.Viaje.Empleado != null && dm.Viaje.Empleado.Entidad != null ? dm.Viaje.Empleado.Entidad.Descripcion : string.Empty; Fecha = dm.Fecha.ToDisplayDateTime().ToString("dd/MM/yyyy"); Orden = dm.Detalle.Orden; OrdenReal = dm.Orden; PuntoEntrega = dm.PuntoEntrega != null ? dm.PuntoEntrega.Descripcion : dm.Detalle.ReferenciaGeografica != null ? dm.Detalle.ReferenciaGeografica.Descripcion : string.Empty; Manual = dm.Manual.HasValue ? dm.Manual.Value.ToDisplayDateTime().ToString("HH:mm") : string.Empty; Entrada = dm.Entrada.HasValue ? dm.Entrada.Value.ToDisplayDateTime().ToString("HH:mm") : string.Empty; Salida = dm.Salida.HasValue ? dm.Salida.Value.ToDisplayDateTime().ToString("HH:mm") : string.Empty; var diferencia = dm.Manual.HasValue && dm.Salida.HasValue ? dm.Salida.Value.Subtract(dm.Manual.Value) : new TimeSpan(0); if (diferencia.Ticks != 0) { if (diferencia.TotalSeconds > 0) { Diferencia = diferencia.Hours.ToString("00") + ":" + diferencia.Minutes.ToString("00") + ":" + diferencia.Seconds.ToString("00"); } else { diferencia = new TimeSpan(-diferencia.Ticks); Diferencia = "- " + diferencia.Hours.ToString("00") + ":" + diferencia.Minutes.ToString("00") + ":" + diferencia.Seconds.ToString("00"); } } var duracion = new TimeSpan(0, 0, (int)dm.TiempoEntrega * 60); Duracion = dm.TiempoEntrega > 0 ? duracion.Hours.ToString("00") + ":" + duracion.Minutes.ToString("00") + ":" + duracion.Seconds.ToString("00") : string.Empty; Estado = dm.Estado; Km = dm.Km; UnreadInactive = dm.Detalle.GarminUnreadInactiveAt.HasValue ? dm.Detalle.GarminUnreadInactiveAt.Value.ToDisplayDateTime().ToString("HH:mm") : string.Empty; ReadInactive = dm.Detalle.GarminReadInactiveAt.HasValue ? dm.Detalle.GarminReadInactiveAt.Value.ToDisplayDateTime().ToString("HH:mm") : string.Empty; if (verConfirmacion && dm.Vehiculo != null) { Confirmacion = dm.Confirmacion; Horario = dm.Detalle.RecepcionConfirmacion.HasValue ? dm.Detalle.RecepcionConfirmacion.Value.ToDisplayDateTime() : (DateTime?)null; Distancia = dm.Distancia; if (dm.PuntoEntrega != null && dm.PuntoEntrega.ReferenciaGeografica != null && dm.PuntoEntrega.ReferenciaGeografica.Poligono != null) { Radio = dm.PuntoEntrega.ReferenciaGeografica.Poligono.Radio; } } }