public virtual IList <EntregaDistribucion> GetEntregasPorOrdenManual() { var salidas = Detalles.Where(e => e.Linea != null); var llegada = Detalles.Last(); if (llegada.Linea == null) { llegada = null; } var det = Detalles.Where(e => e.Linea == null && e.Manual.HasValue) .OrderBy(e => e.Manual.Value).ToList(); if (salidas.Any()) { det.Insert(0, salidas.First()); } det.AddRange(Detalles.Where(e => e.Linea == null && !e.Manual.HasValue) .OrderBy(e => e.Programado)); if (llegada != null && Detalles.Count > 1) { det.Add(llegada); } return(det.ToList()); }
public virtual IList <EntregaDistribucion> GetEntregasPorOrdenReal() { if (Tipo == Tipos.Desordenado) { var salidas = Detalles.Where(e => e.Linea != null); var llegada = Detalles.Last(); if (llegada.Linea == null) { llegada = null; } var det = Detalles.Where(e => e.Linea == null && e.Estado != EntregaDistribucion.Estados.Cancelado) .OrderBy(e => e.FechaMin).ToList(); if (salidas.Any()) { det.Insert(0, salidas.First()); } det.AddRange(Detalles.Where(e => e.Linea == null && e.Estado == EntregaDistribucion.Estados.Cancelado) .OrderBy(e => e.FechaMin)); if (llegada != null && Detalles.Count > 1) { det.Add(llegada); } return(det.ToList()); } return(Detalles.ToList()); }
private DateTime GetMaxDate() { var lastDetalle = Detalles.Last(); var maxDate = lastDetalle.Programado.Value; if (lastDetalle.Automatico.HasValue && maxDate < lastDetalle.Automatico.Value) { maxDate = lastDetalle.Automatico.Value; } return(maxDate); }
public virtual IList <EntregaDistribucion> GetEntregasOrdenadas() { if (Tipo == Tipos.Desordenado) { var salida = Detalles.First(); var llegada = Detalles.Last(); if (llegada.Linea == null) { llegada = null; } var det = Detalles.Where(e => e.Linea == null).OrderBy(e => e.ManualOEntrada).ToList(); det.Insert(0, salida); if (llegada != null && Detalles.Count > 1) { det.Add(llegada); } return(det.ToList()); } return(Detalles.ToList()); }
private int GetCompleted() { var firstDetalle = Detalles.First(); var lastDetalle = Detalles.Last(); if (lastDetalle.Automatico.HasValue) { return(100); } var totalTime = lastDetalle.Programado.Subtract(firstDetalle.Programado).TotalMinutes; lastDetalle = null; foreach (var detalle in Detalles) { if (lastDetalle != null) { var duracion = detalle.Programado.Subtract(lastDetalle.Programado).TotalMinutes; var parcial = !detalle.Automatico.HasValue && lastDetalle.Automatico.HasValue ? (DateTime.UtcNow.Subtract(lastDetalle.Automatico.Value).TotalMinutes * 100) / duracion : 0; if (parcial > 100) { parcial = 100; } detalle.Duracion = Convert.ToInt32(duracion); detalle.PorcentajeDelTotal = totalTime == 0 ? 0 : Convert.ToInt32((duracion / totalTime) * 100); detalle.Completado = detalle.Automatico.HasValue; detalle.PorcentajeParcial = detalle.Automatico.HasValue ? 100 : Math.Min(90, Convert.ToInt32(parcial)); } lastDetalle = detalle; } return(Convert.ToInt32(Detalles.Select(d => (d.PorcentajeParcial / 100) * d.PorcentajeDelTotal).Sum())); }
private void RecalculateTimes(ViajeDistribucion distribucion) { var firstDetalle = Detalles.First(); var lastDetalle = Detalles.Last(); var totalTime = lastDetalle.Programado.Subtract(firstDetalle.Programado).TotalMinutes; if (totalTime == 0) { lastDetalle = null; foreach (var detalle in Detalles) { if (lastDetalle != null) { var distancia = Distancias.Loxodromica(lastDetalle.Latitud, lastDetalle.Longitud, detalle.Latitud, detalle.Longitud) / 1000; var velocidad = distribucion.Vehiculo.VelocidadPromedio > 0 ? distribucion.Vehiculo.VelocidadPromedio: distribucion.Vehiculo.TipoCoche.VelocidadPromedio > 0?distribucion.Vehiculo.TipoCoche.VelocidadPromedio:40; var tiempo = TimeSpan.FromHours(distancia / velocidad); detalle.Programado = lastDetalle.Programado.Add(tiempo) + TimeSpan.FromMinutes(10); } lastDetalle = detalle; } } }
protected override void AutoCloseTicket(DateTime date) { // Si pasaron mas de EndMarginMinutes horas desde la hora final del ticket, lo cierro. var maxdate = GetMaxDate(); var close = maxdate.AddMinutes(EndMarginMinutes) < date; // Si el ultimo evento del ciclo ya fue procesado y está configurado como automático, cierro el ticket. var ultimoDetalle = Detalles.Last(); close |= ultimoDetalle.Automatico.HasValue && ultimoDetalle.EstadoLogistico.Modo; close |= ultimoDetalle.Manual.HasValue && !ultimoDetalle.EstadoLogistico.Modo; if (close) { Ticket.FechaFin = date; Ticket.Estado = Ticket.Estados.Cerrado; Ticket.UserField3 += "(auto cerrado " + EndMarginMinutes + " min)"; DaoFactory.TicketDAO.SaveOrUpdate(Ticket); SaveMessage(MessageCode.CicloLogisticoCerrado.GetMessageCode(), Ticket.FechaFin.Value); ClearGeocercasCache(); } }
public virtual void AgregarBaseFinal() { for (var i = 1; i < Detalles.Count; i++) { if (Detalles[i].Descripcion.Equals(Detalles[0].Descripcion)) { Detalles.RemoveAt(i); } } var baseFinal = new EntregaDistribucion() { Linea = Detalles[0].Linea, Descripcion = Detalles[0].Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = Detalles.Count, Viaje = Detalles[0].Viaje }; var ultimo = Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(baseFinal.ReferenciaGeografica.Latitude, baseFinal.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { var distancia = directions.Distance / 1000.0; var duracion = directions.Duration; var fecha = Detalles.Last().Programado.Add(duracion); baseFinal.Programado = fecha; baseFinal.ProgramadoHasta = fecha; baseFinal.KmCalculado = distancia; } Detalles.Add(baseFinal); }