public virtual ViajeDistribucion UpdateRoute(SosTicket ticket) { var viaje = ticket.Distribucion ?? DaoFactory.ViajeDistribucionDAO.FindByCodigo(ticket.NumeroServicio); //si el servicio fue asignado cancelado, preasignado cancelado o ambos cancelados if (ticket.EstadoServicio == SosTicket.EstadosServicio.AsignacionCancelada || ticket.EstadoServicio == SosTicket.EstadosServicio.PreAsignacionCancelada || ticket.EstadoServicio == SosTicket.EstadosServicio.AsignacionYPreAsignacionCancelada) { viaje.Estado = ViajeDistribucion.Estados.Anulado; } viaje.Inicio = ticket.HoraServicio; viaje.Vehiculo = DaoFactory.CocheDAO.FindByInterno(new[] { viaje.Empresa.Id }, new[] { -1 }, ticket.Movil.ToString()); var origen = viaje.Detalles.FirstOrDefault(e => e.Descripcion.Contains("O")); var destino = viaje.Detalles.FirstOrDefault(e => e.Descripcion.Contains("D")); origen.Programado = ticket.HoraServicio; origen.ProgramadoHasta = ticket.HoraServicio.AddHours(1); var o = new LatLon(origen.ReferenciaGeografica.Latitude, origen.ReferenciaGeografica.Longitude); var d = new LatLon(destino.ReferenciaGeografica.Latitude, destino.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(o, d, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { var duracion = directions.Duration; destino.Programado = destino.Programado.Add(duracion); destino.ProgramadoHasta = destino.ProgramadoHasta.Add(duracion); } return(viaje); }
private void Preasignar(SosTicket ticket) { var storedTicket = DaoFactory.SosTicketDAO.FindByCodigo(ticket.NumeroServicio); if (storedTicket == null) { DaoFactory.SosTicketDAO.SaveOrUpdate(ticket); } //S: 20151119303932 //O: SAN MARTIN 500, CORDOBA //D: COLON 1000, CORDOBA //Di: CORREA DE DISTRIBUCION var mensaje = string.Format("Preasignacion: {0}<br>O:{1}<br>D:{2}<br>Di:{3}", ticket.NumeroServicio, ticket.Origen.Direccion + ", " + ticket.Origen.Localidad, ticket.Destino.Direccion + ", " + ticket.Destino.Localidad, ticket.Diagnostico); var ms = new MessageSaver(DaoFactory); var lastPos = ticket.Distribucion.Vehiculo.IsLastPositionInCache() ? ticket.Distribucion.Vehiculo.RetrieveLastPosition() : null; var point = lastPos != null ? new GPSPoint(lastPos.FechaMensaje, (float)lastPos.Latitud, (float)lastPos.Longitud, (float)(lastPos.Velocidad), GPSPoint.SourceProviders.GpsProvider, (float)lastPos.Altitud) : null; ms.Save(MessageCode.ServicioPreasignado.GetMessageCode(), ticket.Distribucion.Vehiculo, DateTime.UtcNow, null, ticket.NumeroServicio); SendQuestionToGarmin(mensaje, ticket.Distribucion); }
public void HandleMessage(SosTicket ticket) { try { IntegrationService.ProcessService(ticket); } catch (Exception ex) { Logger.ErrorFormat("Error al obtener el ticket: {0} -> {1} ", ticket.NumeroServicio, ex.Message); } }
public void ProcessService(SosTicket ticket) { switch (ticket.EstadoServicio) { case SosTicket.EstadosServicio.Asignado: Asignar(ticket); break; case SosTicket.EstadosServicio.Preasignado: Preasignar(ticket); break; case SosTicket.EstadosServicio.AsignacionCancelada: CancelarAsignacion(ticket); break; case SosTicket.EstadosServicio.PreAsignacionCancelada: CancelarPreasignacion(ticket); break; case SosTicket.EstadosServicio.AsignacionYPreAsignacionCancelada: Cancelar(ticket); break; } }
private SosTicket UpdateTicket(SosTicket oldTicket, SosTicket newTicket) { oldTicket.CobroAdicional = newTicket.CobroAdicional; oldTicket.Color = newTicket.Color; oldTicket.Diagnostico = newTicket.Diagnostico; oldTicket.Marca = newTicket.Marca; oldTicket.Observacion = newTicket.Observacion; oldTicket.Operador = newTicket.Operador; oldTicket.Patente = newTicket.Patente; oldTicket.Prioridad = newTicket.Prioridad; oldTicket.EstadoServicio = newTicket.EstadoServicio; oldTicket.Origen = newTicket.Origen; oldTicket.Destino = newTicket.Destino; return(oldTicket); }
private void CancelarAsignacion(SosTicket ticket) { var storedTicket = DaoFactory.SosTicketDAO.FindByCodigo(ticket.NumeroServicio); if (storedTicket == null) { Logger.Error("No se puede cancelar un servicio no registrado"); } else { var viaje = ticket.Distribucion ?? DaoFactory.ViajeDistribucionDAO.FindByCodigo(ticket.NumeroServicio); var mensaje = string.Format("El servicio : {0}<br>Ha sido cancelado", ticket.NumeroServicio); SendMessageToGarmin(mensaje, viaje); viaje.Estado = ViajeDistribucion.Estados.Anulado; } }
private SosTicket GetTicket(SosTicket ticket) { var storedTicket = DaoFactory.SosTicketDAO.FindByCodigo(ticket.NumeroServicio); if (storedTicket == null) { ticket.Distribucion = BuildRoute(ticket); DaoFactory.SosTicketDAO.SaveOrUpdate(ticket); return(ticket); } storedTicket = UpdateTicket(storedTicket, ticket); //storedTicket.Distribucion = UpdateRoute(ticket); DaoFactory.SosTicketDAO.SaveOrUpdate(storedTicket); return(storedTicket); }
public void ConfirmaPatente(SosTicket ticket, bool confirmacionOk) { if (confirmacionOk) { ticket.EstadoServicio = (int)CodigoEstado.Llegada; DaoFactory.SosTicketDAO.SaveOrUpdate(ticket); var ms = new MessageSaver(DaoFactory); var lastPos = ticket.Distribucion.Vehiculo.IsLastPositionInCache() ? ticket.Distribucion.Vehiculo.RetrieveLastPosition() : null; var point = lastPos != null ? new GPSPoint(lastPos.FechaMensaje, (float)lastPos.Latitud, (float)lastPos.Longitud, (float)(lastPos.Velocidad), GPSPoint.SourceProviders.GpsProvider, (float)lastPos.Altitud) : null; ms.Save(MessageCode.LlegadaServicio.GetMessageCode(), ticket.Distribucion.Vehiculo, DateTime.UtcNow, null, ticket.NumeroServicio); UpdateToSos(ticket.Distribucion.Vehiculo.Interno, ticket.Distribucion.Codigo, ticket.EstadoServicio, ticket.Diagnostico); } else { var msgText = "Patente erronea. Por favor, informe los 3 digitos de la patente del vehiculo correspondiente al servicio " + ticket.Distribucion.Codigo; SendQuestionPatenteToGarmin(msgText, ticket.Distribucion); } }
private void Asignar(SosTicket ticket) { var storedTicket = DaoFactory.SosTicketDAO.FindByCodigo(ticket.NumeroServicio); ticket.Distribucion = storedTicket == null?BuildRoute(ticket) : UpdateRoute(ticket); DaoFactory.SosTicketDAO.SaveOrUpdate(ticket); var mensaje = string.Format("Asignado: {0}<br>De {1}<br>a {2}<br>{3}", ticket.NumeroServicio, ticket.Origen.Direccion + ", " + ticket.Origen.Localidad, ticket.Destino.Direccion + ", " + ticket.Destino.Localidad, ticket.Diagnostico.Split('-')[1]); var ms = new MessageSaver(DaoFactory); var lastPos = ticket.Distribucion.Vehiculo.IsLastPositionInCache() ? ticket.Distribucion.Vehiculo.RetrieveLastPosition() : null; var point = lastPos != null ? new GPSPoint(lastPos.FechaMensaje, (float)lastPos.Latitud, (float)lastPos.Longitud, (float)(lastPos.Velocidad), GPSPoint.SourceProviders.GpsProvider, (float)lastPos.Altitud) : null; ms.Save(MessageCode.ServicioAsignado.GetMessageCode(), ticket.Distribucion.Vehiculo, DateTime.UtcNow, null, ticket.NumeroServicio); SendQuestionToGarmin(mensaje, ticket.Distribucion); }
private ViajeDistribucion BuildRoute(SosTicket service) { var empresa = DaoFactory.EmpresaDAO.FindByCodigo(CodigoEmpresa); var linea = DaoFactory.LineaDAO.FindByCodigo(empresa.Id, CodigoLinea); var cliente = DaoFactory.ClienteDAO.FindByCode(new[] { empresa.Id }, new[] { -1 }, CodigoCliente); const int vigencia = 12; var fecha = service.HoraServicio; var viaje = new ViajeDistribucion(); if (service.Distribucion == null) { //viaje viaje.Codigo = service.NumeroServicio; viaje.Empresa = empresa; viaje.Linea = linea; viaje.Estado = ViajeDistribucion.Estados.Pendiente; viaje.Tipo = ViajeDistribucion.Tipos.Desordenado; viaje.Inicio = fecha; viaje.RegresoABase = false; viaje.Fin = fecha.AddHours(1); viaje.Vehiculo = DaoFactory.CocheDAO.FindByInterno(new[] { empresa.Id }, new[] { -1 }, service.Movil.ToString()); //base al inicio var entregaBase = new EntregaDistribucion(); entregaBase.Linea = linea; entregaBase.Descripcion = linea.Descripcion; entregaBase.Estado = EntregaDistribucion.Estados.Pendiente; entregaBase.Programado = fecha; entregaBase.ProgramadoHasta = fecha.AddHours(1); entregaBase.Orden = viaje.Detalles.Count; entregaBase.Viaje = viaje; entregaBase.KmCalculado = 0; viaje.Detalles.Add(entregaBase); var nombreOrigen = service.NumeroServicio + " - A"; var nombreDestino = service.NumeroServicio + " - B"; TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa.Id }, new[] { -1 }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } #region Origen var puntoEntregaO = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { empresa.Id }, new[] { -1 }, new[] { cliente.Id }, nombreOrigen); if (puntoEntregaO == null) { var empresaGeoRef = empresa; var lineaGeoRef = linea; var puntoDeInteres = new ReferenciaGeografica { Codigo = nombreOrigen, Descripcion = nombreOrigen, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(service.Origen.Latitud, service.Origen.Longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)service.Origen.Longitud, (float)service.Origen.Latitud) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(puntoDeInteres); puntoEntregaO = new PuntoEntrega { Cliente = cliente, Codigo = nombreOrigen, Descripcion = nombreOrigen, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = service.Origen.Direccion + ", " + service.Origen.Localidad, Nombre = nombreOrigen }; } else { if (!puntoEntregaO.ReferenciaGeografica.IgnoraLogiclink && (puntoEntregaO.ReferenciaGeografica.Latitude != service.Origen.Latitud || puntoEntregaO.ReferenciaGeografica.Longitude != service.Origen.Longitud)) { puntoEntregaO.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntregaO.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(service.Origen.Latitud, service.Origen.Longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)service.Origen.Longitud, (float)service.Origen.Latitud) }); puntoEntregaO.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntregaO.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntregaO.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(puntoEntregaO.ReferenciaGeografica); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntregaO); var entregaO = new EntregaDistribucion { Cliente = cliente, PuntoEntrega = puntoEntregaO, Descripcion = nombreOrigen, Estado = EntregaDistribucion.Estados.Pendiente, Orden = viaje.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = viaje }; viaje.Detalles.Add(entregaO); #endregion #region Destino var puntoEntregaD = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { empresa.Id }, new[] { -1 }, new[] { cliente.Id }, nombreDestino); if (puntoEntregaD == null) { var empresaGeoRef = empresa; var lineaGeoRef = linea; var puntoDeInteres = new ReferenciaGeografica { Codigo = nombreDestino, Descripcion = nombreDestino, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(service.Destino.Latitud, service.Destino.Longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)service.Destino.Longitud, (float)service.Destino.Latitud) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(puntoDeInteres); puntoEntregaD = new PuntoEntrega { Cliente = cliente, Codigo = nombreDestino, Descripcion = nombreDestino, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = service.Destino.Direccion + ", " + service.Destino.Localidad, Nombre = nombreDestino }; } else { if (!puntoEntregaD.ReferenciaGeografica.IgnoraLogiclink && (puntoEntregaD.ReferenciaGeografica.Latitude != service.Destino.Latitud || puntoEntregaD.ReferenciaGeografica.Longitude != service.Destino.Longitud)) { puntoEntregaD.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntregaD.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(service.Destino.Latitud, service.Destino.Longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)service.Destino.Longitud, (float)service.Destino.Latitud) }); puntoEntregaD.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntregaD.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntregaD.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(puntoEntregaD.ReferenciaGeografica); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntregaD); var anterior = puntoEntregaO.ReferenciaGeografica; var siguiente = puntoEntregaD.ReferenciaGeografica; var o = new LatLon(anterior.Latitude, anterior.Longitude); var d = new LatLon(siguiente.Latitude, siguiente.Longitude); var directions = GoogleDirections.GetDirections(o, d, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { var duracion = directions.Duration; fecha = entregaO.Programado.Add(duracion); } var entregaD = new EntregaDistribucion { Cliente = cliente, PuntoEntrega = puntoEntregaD, Descripcion = nombreDestino, Estado = EntregaDistribucion.Estados.Pendiente, Orden = viaje.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = viaje }; viaje.Detalles.Add(entregaD); viaje.Fin = fecha; #endregion } return(viaje); }
private void CancelarPreasignacion(SosTicket ticket) { CancelarAsignacion(ticket); }