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); } } }
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 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); }
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); }