Esempio n. 1
0
        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());
        }
Esempio n. 2
0
 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());
 }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 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());
 }
Esempio n. 5
0
            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()));
            }
Esempio n. 6
0
            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;
                    }
                }
            }
Esempio n. 7
0
        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();
            }
        }
Esempio n. 8
0
        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);
        }