private void ProcessEntradaBase(GeofenceEvent data)
        {
            // Obtengo el estado a procesar
            var detalle = GetDetalle(data, Estado.Evento.LlegaAPlanta);

            if (detalle == null)
            {
                return;
            }

            // Si ya hay una fecha para sale de planta de menos de 5 minutos antes, tomo esta entrada como una "entrada-salida"
            var salida = Detalles.Where(d => d.EstadoLogistico.EsPuntoDeControl == Estado.Evento.SaleDePlanta && d.Automatico.HasValue).FirstOrDefault();

            if (salida != null && data.Date.Subtract(salida.Automatico.Value) < TimeSpan.FromMinutes(InOutGecercaMinutes))
            {
                return;
            }

            if (!detalle.Automatico.HasValue)
            {
                // Guardo la fecha del evento
                detalle.Automatico = data.Date;
                DaoFactory.DetalleTicketDAO.SaveOrUpdate(detalle);

                Ticket.FechaFin    = data.Date;
                Ticket.BaseLlegada = DaoFactory.LineaDAO.GetList(new[] { Ticket.Empresa != null ? Ticket.Empresa.Id : Ticket.Linea.Empresa.Id })
                                     .Where(lin => lin.ReferenciaGeografica != null && lin.ReferenciaGeografica.Id == data.Id)
                                     .FirstOrDefault();
                DaoFactory.TicketDAO.SaveOrUpdate(Ticket);

                SaveMessage(MessageCode.EstadoLogisticoCumplido.GetMessageCode(), detalle.EstadoLogistico.Descripcion, data);
                SaveMessageAtraso(data, detalle);
            }
        }
        private void ProcessEntradaObra(GeofenceEvent data)
        {
            // Obtengo el estado a procesar
            var detalle = GetDetalle(data, Estado.Evento.LlegaAObra);

            if (detalle == null)
            {
                return;
            }

            if (!detalle.Automatico.HasValue)
            {
                // Guardo la fecha del evento
                detalle.Automatico = data.Date;
                DaoFactory.DetalleTicketDAO.SaveOrUpdate(detalle);

                SaveMessage(MessageCode.EstadoLogisticoCumplido.GetMessageCode(), detalle.EstadoLogistico.Descripcion, data);
                SaveMessageAtraso(data, detalle);
            }
            else
            {
                var salida = Detalles.Where(d => d.EstadoLogistico.EsPuntoDeControl == Estado.Evento.SaleDeObra && d.Automatico.HasValue).FirstOrDefault();
                if (salida != null)
                {
                    // Si ya hay una fecha para el evento de salida, la borro: la salida siempre es la ultima.
                    salida.Automatico = null;
                    DaoFactory.DetalleTicketDAO.SaveOrUpdate(salida);
                }
            }
        }
Beispiel #3
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());
        }
Beispiel #4
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());
 }
        private void ProcessSalidaBase(GeofenceEvent data)
        {
            // Obtengo el estado a procesar
            var detalle = GetDetalle(data, Estado.Evento.SaleDePlanta);

            if (detalle == null)
            {
                return;
            }

            if (!detalle.Automatico.HasValue)
            {
                // Guardo la fecha del evento
                detalle.Automatico = data.Date;
                DaoFactory.DetalleTicketDAO.SaveOrUpdate(detalle);

                if (!Ticket.FechaDescarga.HasValue)
                {
                    Ticket.FechaDescarga = data.Date;
                }

                DaoFactory.TicketDAO.SaveOrUpdate(Ticket);

                SaveMessage(MessageCode.EstadoLogisticoCumplido.GetMessageCode(), detalle.EstadoLogistico.Descripcion, data);
                SaveMessageAtraso(data, detalle);
            }
            else
            {
                // Si ya hay una fecha para el mismo evento analizo si la anterior es una "posicion loca"
                var entrada = Detalles.Where(d => d.EstadoLogistico.EsPuntoDeControl == Estado.Evento.LlegaAPlanta && d.Automatico.HasValue).FirstOrDefault();
                if (entrada != null && entrada.Automatico.Value.Subtract(detalle.Automatico.Value) < TimeSpan.FromMinutes(InOutGecercaMinutes))
                {
                    // Si el evento anterior era por una "posicion loca" guardo el nuevo horario
                    // y elimino el otro valor.
                    detalle.Automatico = data.Date;
                    entrada.Automatico = null;
                    DaoFactory.DetalleTicketDAO.SaveOrUpdate(detalle);
                    DaoFactory.DetalleTicketDAO.SaveOrUpdate(entrada);

                    if (!Ticket.FechaDescarga.HasValue)
                    {
                        Ticket.FechaDescarga = data.Date;
                    }
                    DaoFactory.TicketDAO.SaveOrUpdate(Ticket);

                    SaveMessage(MessageCode.EstadoLogisticoCumplido.GetMessageCode(), detalle.EstadoLogistico.Descripcion + " (Corrección)", data);
                    SaveMessageAtraso(data, detalle);
                }
            }
        }
        protected override void Process(ManualEvent data)
        {
            var detalle = Detalles.Where(d => d.EstadoLogistico.Mensaje.Codigo == data.Mensaje && !d.Manual.HasValue).FirstOrDefault();

            if (detalle == null)
            {
                return;
            }

            detalle.Manual = data.Date;

            DaoFactory.DetalleTicketDAO.SaveOrUpdate(detalle);
            DaoFactory.TicketDAO.SaveOrUpdate(Ticket);

            SaveMessage(MessageCode.EstadoLogisticoCumplido.GetMessageCode(), detalle.EstadoLogistico.Descripcion + " (Manual)", data);
        }
        private DetalleTicket GetDetalle(IEvent data, short evento)
        {
            // Obtengo el estado a procesar
            var detalle = Detalles.Where(d => d.EstadoLogistico.EsPuntoDeControl == evento).FirstOrDefault();

            // Si no hay estados de este tipo descarto el evento
            if (detalle == null)
            {
                return(null);
            }

            // Si la fecha del evento no corresponde al rango horario que determinan los otros eventos, descarto el evento
            if (data.Date < GetPrevMaxDate(detalle) || data.Date > GetPostMinDate(detalle))
            {
                return(null);
            }

            return(detalle);
        }
Beispiel #8
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());
 }
        private DateTime GetPostMinDate(DetalleTicket detalle)
        {
            var detallesPrevios = Detalles.Where(d => d.Programado > detalle.Programado && d.Automatico.HasValue);

            return(detallesPrevios.Count() > 0 ? detallesPrevios.Min(d => d.Automatico.Value) : DateTime.MaxValue);
        }