protected void SaveMessage(string messageCode, DateTime fecha, ViajeDistribucion viaje, EntregaDistribucion entrega) { SaveMessage(messageCode, string.Empty, null, fecha, viaje, entrega); }
protected override void OnExecute(Timer timer) { STrace.Trace(ComponentName, "Inicio de la tarea"); var inicio = DateTime.UtcNow; var empresas = DaoFactory.EmpresaDAO.GetList().Where(e => e.GeneraRutaInversa); STrace.Trace(GetType().FullName, string.Format("Procesando empresas. Cantidad: {0}", empresas.Count())); try { foreach (var empresa in empresas) { var vehiculos = DaoFactory.CocheDAO.FindList(new[] { empresa.Id }, new[] { -1 }) .Where(c => c.Dispositivo != null); var clientes = DaoFactory.ClienteDAO.GetList(new[] { empresa.Id }, new[] { -1 }).Select(c => c.Id).ToList(); var vehiculosPendientes = vehiculos.Count(); STrace.Trace(GetType().FullName, string.Format("Vehículos a procesar: {0}", vehiculosPendientes)); var eventosEntradas = DaoFactory.LogMensajeDAO.GetByVehiclesAndCode(vehiculos.Select(v => v.Id).ToArray(), MessageCode.InsideGeoRefference.GetMessageCode(), Desde, Hasta, 1); var eventosSalidas = DaoFactory.LogMensajeDAO.GetByVehiclesAndCode(vehiculos.Select(v => v.Id).ToArray(), MessageCode.OutsideGeoRefference.GetMessageCode(), Desde.AddDays(-7), Hasta, 1); foreach (var vehiculo in vehiculos) { STrace.Trace(GetType().FullName, string.Format("Procesando vehículo: {0}", vehiculo.Id)); var entradas = eventosEntradas.Where(ev => ev.Coche.Id == vehiculo.Id && ev.Fecha > Desde && ev.Fecha < Hasta && ev.IdPuntoDeInteres.HasValue); STrace.Trace(GetType().FullName, string.Format("Entradas a procesar: {0}", entradas.Count())); var i = 1; foreach (var entrada in entradas) { STrace.Trace(GetType().FullName, string.Format("Procesando entrada: {0}/{1}", i, entradas.Count())); var ptoFin = DaoFactory.PuntoEntregaDAO.FindByClientesAndGeoreferencia(clientes, entrada.IdPuntoDeInteres.Value); if (ptoFin == null) { continue; } var salidas = eventosSalidas.Where(ev => ev.Coche.Id == vehiculo.Id && ev.Fecha > entrada.Fecha.AddDays(-7) && ev.Fecha < entrada.Fecha.AddSeconds(-1) && ev.IdPuntoDeInteres.HasValue) .OrderByDescending(s => s.Fecha); foreach (var salida in salidas) { var ptoInicio = DaoFactory.PuntoEntregaDAO.FindByClientesAndGeoreferencia(clientes, salida.IdPuntoDeInteres.Value); if (ptoInicio != null) { if (ptoInicio == ptoFin) { break; } var codigo = salida.Fecha.AddHours(-3).ToString("yyyyMMdd") + "|" + vehiculo.Interno + "|" + ptoInicio.Codigo + "-" + ptoFin.Codigo; var viaje = new ViajeDistribucion { Alta = DateTime.UtcNow, Codigo = codigo.Length <= 32 ? codigo : codigo.Substring(0, 32), Empresa = empresa, Estado = ViajeDistribucion.Estados.Cerrado, Fin = entrada.Fecha, Inicio = salida.Fecha, InicioReal = salida.Fecha, Linea = vehiculo.Linea, NumeroViaje = 1, RegresoABase = false, Tipo = ViajeDistribucion.Tipos.Desordenado, Vehiculo = vehiculo }; var entrega1 = new EntregaDistribucion { Cliente = ptoInicio.Cliente, PuntoEntrega = ptoInicio, Descripcion = ptoInicio.Descripcion, Estado = EntregaDistribucion.Estados.Visitado, Orden = 1, Programado = salida.Fecha, ProgramadoHasta = salida.Fecha, Viaje = viaje, Salida = salida.Fecha }; viaje.Detalles.Add(entrega1); var fechaFin = entrada.Fecha; var kms = 0.0; var origen = new LatLon(ptoInicio.ReferenciaGeografica.Latitude, ptoInicio.ReferenciaGeografica.Longitude); var destino = new LatLon(ptoFin.ReferenciaGeografica.Latitude, ptoFin.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { var duracion = directions.Duration; kms = directions.Distance / 1000.0; fechaFin = salida.Fecha.Add(duracion); } var entrega2 = new EntregaDistribucion { Cliente = ptoFin.Cliente, PuntoEntrega = ptoFin, Descripcion = ptoFin.Descripcion, Estado = EntregaDistribucion.Estados.Visitado, Orden = 2, Programado = fechaFin, ProgramadoHasta = fechaFin, Viaje = viaje, Entrada = entrada.Fecha, KmCalculado = kms }; viaje.Detalles.Add(entrega2); DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viaje); break; } } i++; } STrace.Trace(GetType().FullName, string.Format("Vehículos a procesar: {0}", --vehiculosPendientes)); } } STrace.Trace(GetType().FullName, "Tarea finalizada."); var fin = DateTime.UtcNow; var duration = fin.Subtract(inicio).TotalMinutes; DaoFactory.DataMartsLogDAO.SaveNewLog(inicio, fin, duration, DataMartsLog.Moludos.GeneracionInversa, "Generación inversa finalizada exitosamente"); } catch (Exception ex) { AddError(ex); } finally { ClearData(); } }
public ResumenDeRutasVo(ViajeDistribucion viaje, Boolean estadoVerKm) { Id = viaje.Id; Viaje = viaje; var dao = new DAOFactory(); Ruta = viaje.Codigo; Vehiculo = viaje.Vehiculo != null ? viaje.Vehiculo.Interno + " - " + viaje.Vehiculo.Patente + (viaje.Vehiculo.Dispositivo == null ? " (Sin dispositivo)" : string.Empty) + (viaje.Vehiculo.Estado == Coche.Estados.EnMantenimiento ? " (En Taller)" : string.Empty) + (viaje.Vehiculo.Estado == Coche.Estados.Inactivo ? " (Inactivo)" : string.Empty) + (viaje.Vehiculo.Estado == Coche.Estados.Revisar ? " (Revisar)" : string.Empty) : "Ninguno"; Inicio = viaje.InicioReal.HasValue ? viaje.InicioReal.Value.ToDisplayDateTime() : (DateTime?)null; Fin = viaje.Estado == ViajeDistribucion.Estados.Cerrado ? viaje.Fin.ToDisplayDateTime() : (DateTime?)null; Recepcion = viaje.Recepcion.HasValue ? viaje.Recepcion.Value.ToDisplayDateTime() : (DateTime?)null; Entregas = viaje.EntregasTotalCount; Realizados = viaje.EntregasCompletadosCount; Visitados = viaje.EntregasVisitadosCount; Rechazados = viaje.EntregasNoCompletadosCount; EnSitio = viaje.EntregasEnSitioCount; EnZona = viaje.EntregasEnZonaCount; var total = Realizados + Visitados; PorcVisitados = Entregas > 0 ? Convert.ToDouble(total) / Convert.ToDouble(Entregas) : 0.00; Estado = CultureManager.GetLabel(ViajeDistribucion.Estados.GetLabelVariableName(viaje.Estado)); var kms = 0.0; var recorrido = new TimeSpan(0); if (viaje.Vehiculo != null && viaje.InicioReal.HasValue) { switch (viaje.Estado) { case ViajeDistribucion.Estados.EnCurso: if (estadoVerKm) { kms = dao.CocheDAO.GetDistance(viaje.Vehiculo.Id, viaje.InicioReal.Value, DateTime.UtcNow); recorrido = new TimeSpan(0, 0, (int)DateTime.UtcNow.Subtract(viaje.InicioReal.Value).TotalSeconds); } break; case ViajeDistribucion.Estados.Cerrado: if (estadoVerKm) { if (viaje.InicioReal.Value < DateTime.Today) { var dmViaje = dao.DatamartViajeDAO.GetRecords(viaje.Id).FirstOrDefault(); if (dmViaje != null) { kms = dmViaje.KmTotales; } } else { kms = dao.CocheDAO.GetDistance(viaje.Vehiculo.Id, viaje.InicioReal.Value, viaje.Fin); } recorrido = new TimeSpan(0, 0, (int)viaje.Fin.Subtract(viaje.InicioReal.Value).TotalSeconds); } break; } } Kms = kms; Recorrido = recorrido; }
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); }
public String CrearViajeDistribucion( String DistritoCodigo, String BaseLineaCodigo, String CodigoViajeUnico, String[] CodigoclienteOrigen, String[] NombreClienteOrigen, String[] CodigoSubclienteOrigen, String[] NombreSubclienteOrigen, String[] GeoposicionSubclienteOrigen, String FechaYHoraDePosicionamiento, String DominioVehiculo, String CodigoLegajoChofer, String CodigoFleteroTransportista, String TipodelDocumentoPtoVtaNroDocumento, String[] CodigoClienteDestino, String[] NombreClienteDestino, String[] CodigoSubClienteDestino, String[] NombreSubClienteDestino, String[] GeoposicionSubClienteDestino) { String Resultado = "0"; bool error = false; Exception errorCause = null; var address = HttpContext.Current.Request.UserHostAddress; var vehiculoNoexiste = false; var empleadonoexiste = false; string IPPERMITIDAS = ConfigurationManager.AppSettings["WebServiceIPPERMITIDAS"].ToString(); bool permitido = false; foreach (var item in IPPERMITIDAS.Split(';')) { if (address.ToString().Equals(item.ToString())) { permitido = true; break; } } if (!permitido) { Resultado = "La direccion de internet publica " + address + " no tiene permisos. Comuniquese con soporte tecnico "; return(Resultado); } try { string filePath = HttpContext.Current.Server.MapPath("~"); StringBuilder sb = new StringBuilder(); sb.AppendLine("======================================================================="); sb.AppendLine("REQUEST HORA " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString()); sb.AppendLine("IP PUBLICA: " + address.ToString()); sb.AppendLine("======================================================================="); File.AppendAllText(filePath + "LOGIP.txt", sb.ToString()); } catch (Exception ex) { } try { DAOFactory _DAOFactory = new DAOFactory(); ViajeDistribucion EditObject = new ViajeDistribucion(); var empreasa = -1; var linea = -1; EditObject.Empresa = !String.IsNullOrEmpty(DistritoCodigo) ? _DAOFactory.EmpresaDAO.FindByCodigo(DistritoCodigo) : null; EditObject.Linea = !String.IsNullOrEmpty(BaseLineaCodigo) ? _DAOFactory.LineaDAO.FindByCodigo(EditObject.Empresa.Id, BaseLineaCodigo) : null; if (EditObject.Linea != null) { linea = EditObject.Linea.Id; } EditObject.Transportista = !String.IsNullOrEmpty(CodigoFleteroTransportista) ? _DAOFactory.TransportistaDAO.FindByCodigo(EditObject.Empresa.Id, linea, CodigoFleteroTransportista) : null; /*EditObject.CentroDeCostos = cbCentroDeCosto.Selected > 0 ? DAOFactory.CentroDeCostosDAO.FindById(cbCentroDeCosto.Selected) : null; * EditObject.SubCentroDeCostos = cbSubCentroDeCosto.Selected > 0 * ? DAOFactory.SubCentroDeCostosDAO.FindById(cbSubCentroDeCosto.Selected) * : null; * EditObject.TipoCoche = cbTipoVehiculo.Selected > 0 ? DAOFactory.TipoCocheDAO.FindById(cbTipoVehiculo.Selected) : null;*/ EditObject.Vehiculo = !String.IsNullOrEmpty(DominioVehiculo) ? _DAOFactory.CocheDAO.FindByPatente(EditObject.Empresa.Id, DominioVehiculo.Trim()) : null; if (EditObject.Vehiculo == null) { Resultado = Resultado + "\n El vehiculo " + DominioVehiculo + " no existe"; vehiculoNoexiste = true; } EditObject.Empleado = !String.IsNullOrEmpty(CodigoLegajoChofer) ? _DAOFactory.EmpleadoDAO.FindByLegajo(EditObject.Empresa.Id, linea, CodigoLegajoChofer) : null; if (EditObject.Empleado == null) { Resultado = Resultado + "\nEl empleado con codigo de legajo " + CodigoLegajoChofer + " no existe"; empleadonoexiste = true; } /* EditObject.TipoCicloLogistico = cbTipoCicloLogistico.Selected > 0 ? DAOFactory.TipoCicloLogisticoDAO.FindById(cbTipoCicloLogistico.Selected) : null;*/ EditObject.Codigo = CodigoViajeUnico + "_" + DateTime.Now.ToString("ddMMyyyyHHmmssfff"); EditObject.NumeroViaje = 0; EditObject.Tipo = ViajeDistribucion.Tipos.RecorridoFijo; EditObject.Desvio = 100; EditObject.RegresoABase = false; EditObject.ProgramacionDinamica = false; EditObject.Inicio = DateTime.ParseExact(FechaYHoraDePosicionamiento, "ddMMyyyyHHmmssfff", null); EditObject.Comentario = TipodelDocumentoPtoVtaNroDocumento; EditObject.Umbral = 0; EditObject.Estado = ViajeDistribucion.Estados.Pendiente; EditObject.Alta = DateTime.UtcNow; EditObject.Fin = DateTime.MaxValue; _DAOFactory.ViajeDistribucionDAO.SaveOrUpdate(EditObject); for (int a = 0; a < CodigoclienteOrigen.Count(); a++) { //CodigoclienteOrigen var cliente = _DAOFactory.ClienteDAO.FindByCode(new int[] { EditObject.Empresa.Id }, new int[] { linea }, CodigoclienteOrigen[a]); if (cliente == null) { Resultado = Resultado + "\nEl cliente con codigo de origen " + CodigoclienteOrigen[a] + " no existe y se lo va a dar de alta"; cliente = new Cliente(); cliente.Empresa = EditObject.Empresa; cliente.Linea = EditObject.Linea; cliente.Codigo = CodigoclienteOrigen[a]; cliente.Descripcion = NombreClienteOrigen[a]; cliente.DescripcionCorta = NombreClienteOrigen[a]; _DAOFactory.ClienteDAO.SaveOrUpdate(cliente); } var puntoentrega = _DAOFactory.PuntoEntregaDAO.FindByCode(new int[] { EditObject.Empresa.Id }, new int[] { linea }, new int[] { cliente.Id }, CodigoSubclienteOrigen[a]); if (puntoentrega == null) { Resultado = Resultado + "\nEl codigo de subcliente origen " + CodigoSubclienteOrigen[a] + " no existe y se lo va a dar de alta"; ReferenciaGeografica direccion = new ReferenciaGeografica(); direccion.Empresa = EditObject.Empresa; direccion.Linea = EditObject.Linea; direccion.TipoReferenciaGeografica = _DAOFactory.TipoReferenciaGeograficaDAO.FindByCodigo(new int[] { EditObject.Empresa.Id }, new int[] { linea }, "CL"); direccion.Codigo = CodigoclienteOrigen[a]; direccion.Descripcion = NombreSubclienteOrigen[a]; direccion.Vigencia = new Vigencia(); direccion.Vigencia.Inicio = DateTime.UtcNow; var now = DateTime.UtcNow; var newDireccion = new Direccion { Vigencia = new Vigencia { Inicio = now }, Altura = -1, Calle = "", Descripcion = NombreSubclienteOrigen[a], IdCalle = -1, IdEntrecalle = -1, IdEsquina = -1, IdMapa = -1, Latitud = double.Parse(GeoposicionSubclienteOrigen[a].ToString().Split(';')[0]), Longitud = double.Parse(GeoposicionSubclienteOrigen[a].ToString().Split(';')[1]), Pais = "Argentina", Partido = "", Provincia = "" }; Poligono newPoligono = new Poligono { Vigencia = new Vigencia { Inicio = now } }; PointF point = new PointF(float.Parse(GeoposicionSubclienteOrigen[a].ToString().Split(';')[0]), float.Parse(GeoposicionSubclienteOrigen[a].ToString().Split(';')[0])); List <PointF> points = new List <PointF>(); points.Add(point); IEnumerable <PointF> pointenum = points as IEnumerable <PointF>; newPoligono.AddPoints(pointenum); direccion.AddHistoria(newDireccion, newPoligono, now); _DAOFactory.ReferenciaGeograficaDAO.SaveOrUpdate(direccion); puntoentrega = new PuntoEntrega(); puntoentrega.Cliente = cliente; puntoentrega.Codigo = CodigoSubclienteOrigen[a]; puntoentrega.Descripcion = NombreSubclienteOrigen[a]; puntoentrega.ReferenciaGeografica = direccion; _DAOFactory.PuntoEntregaDAO.SaveOrUpdate(puntoentrega); } var kms = 0; var entrega = new EntregaDistribucion() { Cliente = cliente, PuntoEntrega = puntoentrega, Descripcion = CodigoSubclienteOrigen[a], Orden = EditObject.Detalles.Count(), Estado = EntregaDistribucion.Estados.Pendiente, Programado = EditObject.Inicio.AddHours(a), ProgramadoHasta = EditObject.Inicio.AddHours(a), Viaje = EditObject, KmCalculado = kms }; _DAOFactory.EntregaDistribucionDAO.SaveOrUpdate(entrega); EditObject.Detalles.Add(entrega); //CodigoClienteDestino var clientedestino = _DAOFactory.ClienteDAO.FindByCode(new int[] { EditObject.Empresa.Id }, new int[] { linea }, CodigoClienteDestino[a]); if (clientedestino == null) { Resultado = Resultado + "\nEl cliente con codigo de destino " + CodigoClienteDestino[a] + " no existe y se lo va a dar de alta"; clientedestino = new Cliente(); clientedestino.Empresa = EditObject.Empresa; clientedestino.Linea = EditObject.Linea; clientedestino.Codigo = CodigoClienteDestino[a]; clientedestino.Descripcion = NombreClienteDestino[a]; clientedestino.DescripcionCorta = NombreClienteDestino[a]; _DAOFactory.ClienteDAO.SaveOrUpdate(clientedestino); } puntoentrega = _DAOFactory.PuntoEntregaDAO.FindByCode(new int[] { EditObject.Empresa.Id }, new int[] { linea }, new int[] { clientedestino.Id }, CodigoSubClienteDestino[a]); if (puntoentrega == null) { Resultado = Resultado + "\nEl codigo de subcliente destino " + CodigoSubClienteDestino[a] + " no existe y se lo va a dar de alta"; ReferenciaGeografica direccion = new ReferenciaGeografica(); direccion.Empresa = EditObject.Empresa; direccion.Linea = EditObject.Linea; direccion.TipoReferenciaGeografica = _DAOFactory.TipoReferenciaGeograficaDAO.FindByCodigo(new int[] { EditObject.Empresa.Id }, new int[] { linea }, "CL"); direccion.Codigo = CodigoClienteDestino[a]; direccion.Descripcion = NombreSubClienteDestino[a]; direccion.Vigencia = new Vigencia(); direccion.Vigencia.Inicio = DateTime.UtcNow; var now = DateTime.UtcNow; var newDireccion = new Direccion { Vigencia = new Vigencia { Inicio = now }, Altura = -1, Calle = "", Descripcion = NombreSubclienteOrigen[a], IdCalle = -1, IdEntrecalle = -1, IdEsquina = -1, IdMapa = -1, Latitud = double.Parse(GeoposicionSubClienteDestino[a].ToString().Split(';')[0]), Longitud = double.Parse(GeoposicionSubClienteDestino[a].ToString().Split(';')[1]), Pais = "Argentina", Partido = "", Provincia = "" }; Poligono newPoligono = new Poligono { Vigencia = new Vigencia { Inicio = now } }; PointF point = new System.Drawing.PointF(float.Parse(GeoposicionSubClienteDestino[a].ToString().Split(';')[0]), float.Parse(GeoposicionSubClienteDestino[a].ToString().Split(';')[1])); List <PointF> points = new List <PointF>(); points.Add(point); IEnumerable <PointF> pointenum = points as IEnumerable <PointF>; newPoligono.AddPoints(pointenum); direccion.AddHistoria(newDireccion, newPoligono, now); _DAOFactory.ReferenciaGeograficaDAO.SaveOrUpdate(direccion); puntoentrega = new PuntoEntrega(); puntoentrega.Cliente = clientedestino; puntoentrega.Codigo = CodigoSubClienteDestino[a]; puntoentrega.Descripcion = NombreSubClienteDestino[a]; puntoentrega.ReferenciaGeografica = direccion; _DAOFactory.PuntoEntregaDAO.SaveOrUpdate(puntoentrega); } entrega = new EntregaDistribucion() { Cliente = clientedestino, PuntoEntrega = puntoentrega, Descripcion = CodigoSubClienteDestino[a], Orden = EditObject.Detalles.Count(), Estado = EntregaDistribucion.Estados.Pendiente, Programado = EditObject.Inicio.AddHours(a), ProgramadoHasta = EditObject.Inicio.AddHours(a), Viaje = EditObject }; EditObject.Detalles.Add(entrega); _DAOFactory.EntregaDistribucionDAO.SaveOrUpdate(entrega); } EditObject.Recorrido.Clear(); /* ReferenciaGeografica refgeo = null; * PuntoEntrega refentrega = null; * Recorrido trayecto = new Recorrido(); * trayecto.Desvio = 100; * trayecto.Empresa = EditObject.Empresa; * trayecto.Codigo = ""; * trayecto.Nombre = ""; * int orden = 0; * trayecto.Linea = EditObject.Linea; * var nombreRecorrido = ""; * foreach (var item in EditObject.Detalles) * { * nombreRecorrido = nombreRecorrido.Replace(item.PuntoEntrega.Descripcion + "_", "") + item.PuntoEntrega.Descripcion + "_"; * } * Recorrido buscarrecorrido = _DAOFactory.RecorridoDAO.FindAll().Where(x => x.Nombre.Equals(nombreRecorrido)).FirstOrDefault(); * if (buscarrecorrido == null) * { * foreach (var item in EditObject.Detalles) * { * if (refgeo != null) * { * var origen = new LatLon(refgeo.Latitude, refgeo.Longitude); * var destino = new LatLon(item.ReferenciaGeografica.Latitude, item.ReferenciaGeografica.Longitude); * var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); * var posiciones = directions.Legs.SelectMany(l => l.Steps.SelectMany(s => s.Points)).ToList(); * RecorridoDistribucion last = null; * var codigoentrega = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 3); * var codigopuntoentrega = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 3); * if (refentrega.Codigo.Length > 4) * { * codigoentrega = refentrega.Codigo.Substring(refentrega.Codigo.Length - 3, 3); * } * if (item.PuntoEntrega.Codigo.Length > 4) * { * codigopuntoentrega = item.PuntoEntrega.Codigo.Substring(item.PuntoEntrega.Codigo.Length - 3, 3); * } * trayecto.Codigo = trayecto.Codigo.Replace(codigoentrega + "_", "") + codigoentrega + "_" + codigopuntoentrega + "_"; * trayecto.Nombre = trayecto.Nombre.Replace(refentrega.Descripcion + "_", "") + refentrega.Descripcion + "_" + item.PuntoEntrega.Descripcion + "_"; * * for (var i = 0; i < posiciones.Count; i++) * { * var det = new RecorridoDistribucion { Latitud = posiciones[i].Latitud, Longitud = posiciones[i].Longitud, Distribucion = EditObject, Orden = orden }; * det.Distancia = last == null ? 0 : Logictracker.Utils.Distancias.Loxodromica(last.Latitud, last.Longitud, det.Latitud, det.Longitud) / 1000.0; * EditObject.Recorrido.Add(det); * last = det; * trayecto.Detalles.Add( * new DetalleRecorrido() * { * Latitud = posiciones[i].Latitud, * Longitud = posiciones[i].Longitud, * Recorrido = trayecto, * Distancia = det.Distancia, * Orden = orden * } * ); * orden++; * } * refgeo = item.ReferenciaGeografica; * refentrega = item.PuntoEntrega; * } * else * { * refgeo = item.ReferenciaGeografica; * refentrega = item.PuntoEntrega; * } * } * _DAOFactory.RecorridoDAO.SaveOrUpdate(trayecto); * } * else * { * foreach (var item in buscarrecorrido.Detalles) * { * var det = new RecorridoDistribucion { Latitud = item.Latitud, Longitud = item.Longitud, Distribucion = EditObject, Orden = item.Orden }; * det.Distancia = item.Distancia; * EditObject.Recorrido.Add(det); * } * * }*/ _DAOFactory.ViajeDistribucionDAO.SaveOrUpdate(EditObject); } catch (Exception ex) { Resultado = Resultado + "\nError desconocido "; string filePath = HttpContext.Current.Server.MapPath("~"); StringBuilder sb = new StringBuilder(); sb.AppendLine("======================================================================="); sb.AppendLine("IP PUBLICA: " + address.ToString()); sb.AppendLine(ex.Message); sb.AppendLine(ex.StackTrace.ToString()); sb.AppendLine("======================================================================="); File.AppendAllText(filePath + "LOGIP.txt", sb.ToString()); error = true; } /* * Respuesta Código de Respuesta - N(3) * (en caso de que la recepción fuera correcta deberá devolvernos un 0, sino un código de error según lo determinen uds. * qué datos son obligatorios para dar de alta el viaje en la plataforma. * Habrá alertas por datos faltantes o Chofer/Fletero inexistentes) * Descripcion Descripción Respuesta - C(40) (según el atributo anterior. * Si hubo errores y/o aletas deberá especificar en que atributos se produjo) */ return(Resultado); }
private static IList <ViajeDistribucion> GetViajeDistribucionList() { var viajeDistribucionList = new List <ViajeDistribucion>(); var distribucion = new ViajeDistribucion() { Id = 1, Codigo = "UNITTEST1", Estado = 0, Empresa = new Empresa() { Id = 1 }, Linea = new Linea() { Id = 10 }, Detalles = new List <EntregaDistribucion>() { new EntregaDistribucion() { Id = 1, Programado = new DateTime(2014, 04, 15, 9, 5, 23), ProgramadoHasta = new DateTime(2014, 04, 16, 9, 5, 23), Estado = 0, Descripcion = "descripcion", Orden = 0, Linea = new Linea() { ReferenciaGeografica = new ReferenciaGeografica() } } } }; viajeDistribucionList.Add(distribucion); distribucion = new ViajeDistribucion() { Id = 2, Codigo = "UNITTEST2", Estado = 3, Empresa = new Empresa() { Id = 1 }, Linea = new Linea() { Id = 10 }, Detalles = new List <EntregaDistribucion>() { new EntregaDistribucion() { Id = 1, Programado = new DateTime(2014, 04, 15, 9, 5, 23), ProgramadoHasta = new DateTime(2014, 04, 16, 9, 5, 23), Estado = 0, Descripcion = "descripcion", Orden = 0, Linea = new Linea() { ReferenciaGeografica = new ReferenciaGeografica() } } } }; viajeDistribucionList.Add(distribucion); distribucion = new ViajeDistribucion() { Id = 1, Codigo = "UNITTEST3", Estado = 9, Empresa = new Empresa() { Id = 1 }, Linea = new Linea() { Id = 10 }, Detalles = new List <EntregaDistribucion>() { new EntregaDistribucion() { Id = 1, Programado = new DateTime(2014, 04, 15, 9, 5, 23), ProgramadoHasta = new DateTime(2014, 04, 16, 9, 5, 23), Estado = 0, Descripcion = "descripcion", Orden = 0, Linea = new Linea() { ReferenciaGeografica = new ReferenciaGeografica() } } } }; viajeDistribucionList.Add(distribucion); return(viajeDistribucionList); }
private void ProcessViaje(ViajeDistribucion viaje) { var kmProductivos = 0.0; var kmImproductivos = 0.0; var detalles = viaje.Detalles.Where(d => d.Linea == null); DateTime?ultima = null; DateTime?primera = null; var primeraEntrada = detalles.Min(e => e.Entrada); var primeraSalida = detalles.Min(e => e.Salida); var ultimaEntrada = detalles.Max(e => e.Entrada); var ultimaSalida = detalles.Max(e => e.Salida); if (primeraSalida.HasValue && primeraEntrada.HasValue) { primera = primeraEntrada <= primeraSalida ? primeraEntrada : primeraSalida; } else if (primeraEntrada.HasValue) { primera = primeraEntrada; } else if (primeraSalida.HasValue) { primera = primeraSalida; } if (ultimaSalida.HasValue && ultimaEntrada.HasValue) { ultima = ultimaSalida >= ultimaEntrada ? ultimaSalida : ultimaEntrada; } else if (ultimaSalida.HasValue) { ultima = ultimaSalida; } else if (ultimaEntrada.HasValue) { ultima = ultimaEntrada; } if (primera.HasValue && ultima.HasValue) { if (primera == ultima) // TODOS KMS IMPRODUCTIVOS { var dm = DaoFactory.DatamartDAO.GetMobilesKilometers(viaje.InicioReal.Value, viaje.Fin, new List <int> { viaje.Vehiculo.Id }).FirstOrDefault(); kmImproductivos += dm != null ? dm.Kilometers : 0.0; } else { // PRIMER TRAMO IMPRODUCTIVO var dm = DaoFactory.DatamartDAO.GetMobilesKilometers(viaje.InicioReal.Value, primera.Value, new List <int> { viaje.Vehiculo.Id }).FirstOrDefault(); kmImproductivos += dm != null ? dm.Kilometers : 0.0; // SEGUNDO TRAMO PRODUCTIVO dm = DaoFactory.DatamartDAO.GetMobilesKilometers(primera.Value, ultima.Value, new List <int> { viaje.Vehiculo.Id }).FirstOrDefault(); kmProductivos += dm != null ? dm.Kilometers : 0.0; // TERCER TRAMO IMPRODUCTIVO dm = DaoFactory.DatamartDAO.GetMobilesKilometers(ultima.Value, viaje.Fin, new List <int> { viaje.Vehiculo.Id }).FirstOrDefault(); kmImproductivos += dm != null ? dm.Kilometers : 0.0; } } else if (!primera.HasValue && !ultima.HasValue) // TODOS KMS IMPRODUCTIVOS { var dm = DaoFactory.DatamartDAO.GetMobilesKilometers(viaje.InicioReal.Value, viaje.Fin, new List <int> { viaje.Vehiculo.Id }).FirstOrDefault(); kmImproductivos += dm != null ? dm.Kilometers : 0.0; } var kmProgramados = viaje.Detalles.Sum(d => d.KmCalculado); var kmTotales = kmProductivos + kmImproductivos; if (kmTotales <= 0) { STrace.Error(GetType().FullName, string.Format("Viaje con kilometros en 0 - Id: {0}", viaje.Id)); } var costoViaje = viaje.Vehiculo.CocheOperacion != null ? viaje.Vehiculo.CocheOperacion.CostoKmUltimoMes * kmTotales : 0.0; var completadas = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.Completado); var noCompletadas = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.NoCompletado); var visitadas = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.Visitado); var sinVisitar = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.SinVisitar); var enSitio = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.EnSitio); var enZona = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.EnZona); var entregas = detalles.Where(d => d.Entrada.HasValue && d.Salida.HasValue) .Select(d => d.Salida.Value.Subtract(d.Entrada.Value)); var totalEntregas = entregas.Any() ? entregas.Sum(e => e.TotalHours) : 0.0; var entregaMaxima = entregas.Any() ? entregas.Max(d => d.TotalHours) : 0.0; var entregaMinima = entregas.Any() ? entregas.Min(d => d.TotalHours) : 0.0; var entregaPromedio = entregas.Any() ? totalEntregas / (double)entregas.Count() : 0.0; var sumDm = DaoFactory.DatamartDAO.GetSummarizedDatamart(viaje.InicioReal.Value, viaje.Fin, viaje.Vehiculo.Id); var hsDetenido = sumDm.HsDetenido; var velocidadMax = sumDm.MaxSpeed; var velocidadPromedio = sumDm.AverageSpeed; var dmViaje = new DatamartViaje { Empresa = viaje.Empresa, Linea = viaje.Linea, Vehiculo = viaje.Vehiculo, Viaje = viaje, Inicio = viaje.InicioReal.Value, Fin = viaje.Fin, Duracion = viaje.Fin.Subtract(viaje.InicioReal.Value).TotalMinutes, KmImproductivos = kmImproductivos, KmProductivos = kmProductivos, KmProgramados = kmProgramados.Value, KmTotales = kmTotales, EntregaMaxima = entregaMaxima, EntregaMinima = entregaMinima, EntregaPromedio = entregaPromedio, VelocidadMaxima = velocidadMax, VelocidadPromedio = velocidadPromedio, EntregasTotales = detalles.Count(), EntregasCompletadas = completadas, EntregasNoCompletadas = noCompletadas, EntregasNoVisitadas = sinVisitar, EntregasVisitadas = visitadas, EntregasEnSitio = enSitio, EntregasEnZona = enZona, HorasDetenido = hsDetenido, HorasEnEntrega = totalEntregas, Costo = costoViaje }; DaoFactory.DatamartViajeDAO.SaveOrUpdate(dmViaje); }
public void Parse(out int rutas, out int entregas, out string observaciones) { const int vigencia = 12; var te = new TimeElapsed(); var rows = ParseExcelFile(Llfile.FilePath, true); STrace.Trace(Component, string.Format("Archivo parseado en {0} segundos", te.getTimeElapsed().TotalSeconds)); te.Restart(); PreBufferRows(rows); STrace.Trace(Component, string.Format("PreBufferRows en {0} segundos", te.getTimeElapsed().TotalSeconds)); var listViajes = new List <ViajeDistribucion>(rows.Count); var listPuntos = new List <PuntoEntrega>(); var listReferencias = new List <ReferenciaGeografica>(); rutas = 0; entregas = 0; observaciones = string.Empty; STrace.Trace(Component, "Cantidad de filas: " + rows.Count); var filas = 0; foreach (var row in rows) { filas++; STrace.Trace(Component, string.Format("Procesando fila: {0}/{1}", filas, rows.Count)); var stringFecha = row[Properties.DistribucionMusimundo.Fecha].ToString().Trim(); var fecha = new DateTime(Convert.ToInt32(stringFecha.Substring(0, 4)), Convert.ToInt32(stringFecha.Substring(4, 2)), Convert.ToInt32(stringFecha.Substring(6, 2)), Convert.ToInt32(stringFecha.Substring(8, 2)), 0, 0).AddHours(-3); var patente = row[Properties.DistribucionMusimundo.Patente].ToString().Trim(); var codigoPedido = row[Properties.DistribucionMusimundo.Factura].ToString().Trim(); var numeroViaje = Convert.ToInt32(row[Properties.DistribucionMusimundo.TM].ToString().Trim()); //var secuencia = Convert.ToInt32(row[GetColumnByValue(Fields.Secuencia.Value)]); var codigoViaje = string.Format("{0}|{1}|{2}", stringFecha.Substring(0, 8), patente, numeroViaje); var strLat = row[Properties.DistribucionMusimundo.Coord1].ToString().Trim().Replace('.', ','); var strLon = row[Properties.DistribucionMusimundo.Coord2].ToString().Trim().Replace('.', ','); var latitud = Convert.ToDouble(strLat); var longitud = Convert.ToDouble(strLon); var importe = row[Properties.DistribucionMusimundo.Importe].ToString().Trim() != "" ? Convert.ToDouble(row[Properties.DistribucionMusimundo.Importe].ToString().Trim()) : 0.0; var nombre = row[Properties.DistribucionMusimundo.Direccion].ToString().Trim(); var vehiculo = _cochesBuffer.SingleOrDefault(v => v.Patente.Contains(patente)); var chofer = vehiculo != null && !vehiculo.IdentificaChoferes ? vehiculo.Chofer : null; var oLinea = vehiculo != null && vehiculo.Linea != null ? vehiculo.Linea : Linea; if (oLinea == null) { observaciones = "Valor inválido para el campo LINEA"; continue; } TipoServicioCiclo tipoServicio = null; var tipoServ = _tiposServicioBuffer.SingleOrDefault(ts => ts.Linea == null || ts.Linea.Id == oLinea.Id); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } if (listViajes.Count == 0 || codigoViaje != listViajes.Last().Codigo) { var byCode = _viajesBuffer.SingleOrDefault(v => v.Codigo == codigoViaje); if (byCode != null) { continue; } } ViajeDistribucion viaje; if (listViajes.Count > 0 && codigoViaje == listViajes.Last().Codigo) { viaje = listViajes.Last(); } else { #region viaje = new ViajeDistribucion() viaje = new ViajeDistribucion { Empresa = vehiculo.Empresa, Linea = oLinea, Vehiculo = vehiculo, Empleado = chofer, Codigo = codigoViaje, Estado = ViajeDistribucion.Estados.Pendiente, Inicio = fecha, Fin = fecha, NumeroViaje = Convert.ToInt32(numeroViaje), Tipo = ViajeDistribucion.Tipos.Desordenado, Alta = DateTime.UtcNow, RegresoABase = true }; #endregion listViajes.Add(viaje); rutas++; } viaje.Fin = fecha; if (viaje.Detalles.Count == 0) { //el primer elemento es la base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fecha, ProgramadoHasta = fecha, Viaje = viaje }; viaje.Detalles.Add(origen); var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = viaje.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, Viaje = viaje }; viaje.Detalles.Add(llegada); } var puntoEntrega = _puntosBuffer.SingleOrDefault(p => p.Codigo == codigoPedido); if (puntoEntrega == null) { #region var puntoDeInteres = new ReferenciaGeografica() var empresaGeoRef = viaje.Vehiculo != null && viaje.Vehiculo.Empresa == null ? null : Cliente.Empresa == null ? null : Empresa; var lineaGeoRef = viaje.Vehiculo != null && viaje.Vehiculo.Linea != null ? viaje.Vehiculo.Linea : Cliente.Linea ?? oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoPedido, Descripcion = codigoPedido, 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 }; #endregion #region var posicion = new Direccion() var posicion = GetNewDireccion(latitud, longitud); #endregion #region var poligono = new Poligono() var poligono = new Poligono { Radio = 100, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); #endregion puntoDeInteres.AddHistoria(posicion, poligono, DateTime.UtcNow); listReferencias.Add(puntoDeInteres); #region puntoEntrega = new PuntoEntrega() puntoEntrega = new PuntoEntrega { Cliente = Cliente, Codigo = codigoPedido, Descripcion = codigoPedido, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Importe = importe, Nombre = nombre }; #endregion listPuntos.Add(puntoEntrega); } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != latitud || puntoEntrega.ReferenciaGeografica.Longitude != longitud)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; #region var posicion = new Direccion() var posicion = GetNewDireccion(latitud, longitud); #endregion #region var poligono = new Poligono() var poligono = new Poligono { Radio = 100, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); #endregion puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } #region puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end var end = fecha.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } #endregion puntoEntrega.ReferenciaGeografica.Linea = oLinea; listReferencias.Add(puntoEntrega.ReferenciaGeografica); puntoEntrega.Nombre = nombre; puntoEntrega.Importe = importe; listPuntos.Add(puntoEntrega); } #region var entrega = new EntregaDistribucion() var entrega = new EntregaDistribucion { Cliente = Cliente, PuntoEntrega = puntoEntrega, Descripcion = nombre.Length > 128 ? nombre.Substring(0, 128) : nombre, Estado = EntregaDistribucion.Estados.Pendiente, //Orden = secuencia, Orden = viaje.Detalles.Count - 1, Programado = fecha, ProgramadoHasta = fecha.AddMinutes(Empresa.MarginMinutes), TipoServicio = tipoServicio, Viaje = viaje }; #endregion viaje.Detalles.Add(entrega); entregas++; } foreach (var viajeDistribucion in listViajes) { if (viajeDistribucion.Detalles.Count > 0) { var dirBase = viajeDistribucion.Detalles.First().ReferenciaGeografica; var coche = viajeDistribucion.Vehiculo; var velocidadPromedio = coche != null && coche.VelocidadPromedio > 0 ? coche.VelocidadPromedio : coche != null && coche.TipoCoche.VelocidadPromedio > 0 ? coche.TipoCoche.VelocidadPromedio : 20; var hora = viajeDistribucion.Inicio; foreach (var detalle in viajeDistribucion.Detalles) { var distancia = GeocoderHelper.CalcularDistacia(dirBase.Latitude, dirBase.Longitude, detalle.ReferenciaGeografica.Latitude, detalle.ReferenciaGeografica.Longitude); var horas = distancia / velocidadPromedio; var demora = detalle.TipoServicio != null ? detalle.TipoServicio.Demora : 0; detalle.Programado = hora.AddHours(horas).AddMinutes(demora); detalle.ProgramadoHasta = detalle.Programado.AddMinutes(Empresa.MarginMinutes); detalle.KmCalculado = distancia; dirBase = detalle.ReferenciaGeografica; hora = detalle.Programado; } } var maxDate = viajeDistribucion.Detalles.Max(d => d.Programado); viajeDistribucion.Fin = maxDate; var ultimo = viajeDistribucion.Detalles.Last(e => e.Linea != null); ultimo.Programado = maxDate; ultimo.ProgramadoHasta = maxDate.AddMinutes(Empresa.MarginMinutes); ultimo.Orden = viajeDistribucion.Detalles.Count - 1; } STrace.Trace(Component, "Guardando referencias geográficas: " + listReferencias.Count); te.Restart(); foreach (var referenciaGeografica in listReferencias) { DaoFactory.ReferenciaGeograficaDAO.Guardar(referenciaGeografica); } STrace.Trace(Component, string.Format("Referencias guardadas en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando puntos de entrega: " + listPuntos.Count); te.Restart(); foreach (var puntoEntrega in listPuntos) { DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); } STrace.Trace(Component, string.Format("Puntos guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando Viajes: " + listViajes.Count); te.Restart(); foreach (var viajeDistribucion in listViajes) { DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viajeDistribucion); } STrace.Trace(Component, string.Format("Viajes guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); }