private static string GetPuntoEntregaPopupContent(PuntoEntrega punto) { const string html = @"<table><tr><td><img src=""{0}"" /></td><td>" + @"<div style=""font-size: 9px; color: #CCCCCC"">{1}</div>" + @"<div style=""font-size: 12px;""><b>{2}</b> ({3})</div>" + @"</td></tr></table><hr />" + "{4}: {5}<br/>{6}<br/>{7}<br/>{8}<br/>{9}"; var icon = punto.ReferenciaGeografica.Icono != null ? punto.ReferenciaGeografica.Icono.PathIcono : punto.ReferenciaGeografica.TipoReferenciaGeografica.Icono != null ? punto.ReferenciaGeografica.TipoReferenciaGeografica.Icono.PathIcono : string.Empty; return(string.Format(html, IconDir + icon, CultureManager.GetEntity("PARENTI44"), punto.Descripcion, punto.Codigo, CultureManager.GetEntity("CLIENT"), punto.Cliente.Descripcion, punto.ReferenciaGeografica.Descripcion, punto.Comentario1, punto.Comentario2, punto.Comentario3)); }
private Intercalado CalcularDirections(Intercalado intercalado, PuntoEntrega nuevoPunto) { var i = CalcularDirectionsOriginal(intercalado); i = CalcularDirectionsIntercalado(i, nuevoPunto); return(i); }
public void CalcularCostos(PuntoEntrega nuevoPunto, int radio) { if (Viajes == null) { throw new ApplicationException("Antes de intercalar hay que cargar los datos con el método Load"); } var cercanos = Viajes.Where(v => v.Detalles.Any( d => Distancias.Loxodromica(d.ReferenciaGeografica.Latitude, d.ReferenciaGeografica.Longitude, nuevoPunto.ReferenciaGeografica.Latitude, nuevoPunto.ReferenciaGeografica.Longitude) <= radio)); var result = cercanos.Select(c => CalcularIntercalado(c, nuevoPunto)) .OrderBy(i => i.CostoKmExtra); var inter = new List <Intercalado>(); foreach (var intercalado in result) { var i = CalcularDirections(intercalado, nuevoPunto); if (IsInHoras(i)) { inter.Add(i); } if (inter.Count > 5) { break; } } Intercalados = inter.OrderBy(i => i.CostoKmExtra).ToList(); }
public PuntoEntregaVo(PuntoEntrega puntoEntrega) { Id = puntoEntrega.Id; Codigo = puntoEntrega.Codigo; Descripcion = puntoEntrega.Descripcion; Nomenclado = puntoEntrega.Nomenclado; ClienteDelPunto = puntoEntrega.Cliente.Descripcion; }
private Intercalado CalcularIntercalado(ViajeDistribucion viaje, PuntoEntrega nuevoPunto) { var alPunto = viaje.Detalles.Select(e => Distancias.Loxodromica(e.ReferenciaGeografica.Latitude, e.ReferenciaGeografica.Longitude, nuevoPunto.ReferenciaGeografica.Latitude, nuevoPunto.ReferenciaGeografica.Longitude)).ToArray(); var deViaje = new List <double>(); for (int i = 1; i < viaje.EntregasTotalCountConBases; i++) { var e = viaje.Detalles[i]; var p = viaje.Detalles[i - 1]; var distancia = Distancias.Loxodromica(p.ReferenciaGeografica.Latitude, p.ReferenciaGeografica.Longitude, e.ReferenciaGeografica.Latitude, e.ReferenciaGeografica.Longitude); deViaje.Add(distancia); } var costoTotal = deViaje.Any() ? deViaje.Sum() : 0; var menorCosto = double.MaxValue; var posicion = 0; for (var i = 0; i <= viaje.EntregasTotalCountConBases; i++) { var costo = 0.0; if (i == 0) { costo += costoTotal; costo += alPunto[0]; } else if (i == viaje.EntregasTotalCountConBases) { costo += costoTotal; costo += alPunto[viaje.EntregasTotalCountConBases - 1]; } else { costo = costoTotal - deViaje[i - 1]; costo += alPunto[i - 1]; costo += alPunto[i]; } if (costo < menorCosto) { menorCosto = costo; posicion = i; } } return(new Intercalado { Id = viaje.Id, Index = posicion, CostoKm = menorCosto, CostoKmOld = costoTotal }); }
private PuntoEntrega GetNuevoPuntoEntrega(string codigoCliente, string nombreCliente) { var cliente = DaoFactory.ClienteDAO.FindById(IdClienteDefault); var georef = new ReferenciaGeografica { Codigo = codigoCliente, Descripcion = nombreCliente, Empresa = Empresa, 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 }, Icono = cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var latitud = cliente.ReferenciaGeografica.Latitude; var longitud = cliente.ReferenciaGeografica.Longitude; var posicion = GetNewDireccion(latitud, longitud); var poligono = new Poligono { Radio = 100, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); georef.AddHistoria(posicion, poligono, DateTime.UtcNow); DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(georef); var puntoEntrega = new PuntoEntrega { Cliente = cliente, Codigo = codigoCliente, Descripcion = nombreCliente, Telefono = string.Empty, Baja = false, ReferenciaGeografica = georef, Nomenclado = true, DireccionNomenclada = posicion.Descripcion, Nombre = nombreCliente }; DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); return(puntoEntrega); }
private PuntoEntrega CreatePuntoEntrega(Cliente cliente, string codigo, string descripcion, string telefono, ReferenciaGeografica rg) { var pto = new PuntoEntrega(); pto.Cliente = cliente; pto.Codigo = codigo; pto.Descripcion = descripcion; pto.Baja = false; pto.ReferenciaGeografica = rg; pto.Nomenclado = true; pto.Nombre = descripcion; return(pto); }
private void CreatePuntoEntrega(Cliente cliente) { var punto = new PuntoEntrega { Cliente = cliente, Codigo = cliente.Codigo.Truncate(32), Descripcion = cliente.Descripcion.Truncate(40), Telefono = cliente.Telefono, Baja = false, ReferenciaGeografica = cliente.ReferenciaGeografica, Nomenclado = cliente.Nomenclado, DireccionNomenclada = cliente.DireccionNomenclada }; DAOFactory.PuntoEntregaDAO.SaveOrUpdate(punto); }
private static PuntoEntrega CreatePuntoEntrega(Cliente cliente, string codigo, string descripcion, string telefono, ReferenciaGeografica rg, string direccion, string comentario1, string comentario2, string comentario3) { var punto = new PuntoEntrega { Cliente = cliente, Codigo = codigo.Truncate(32), Descripcion = descripcion.Truncate(40), Telefono = telefono, Baja = false, ReferenciaGeografica = rg, Nomenclado = true, DireccionNomenclada = direccion, Comentario1 = comentario1, Comentario2 = comentario2, Comentario3 = comentario3 }; return(punto); }
public Intercalado CambiarIndice(int idViaje, PuntoEntrega nuevoPunto, int nuevoIndice) { var viaje = Viajes.FirstOrDefault(v => v.Id == idViaje); if (viaje == null) { return(null); } var intercalado = Intercalados.FirstOrDefault(i => i.Id == idViaje); if (intercalado == null) { return(null); } intercalado.Index = nuevoIndice; CalcularDirectionsIntercalado(intercalado, nuevoPunto); return(intercalado); }
private PuntoEntrega CreatePtoDeEntrega(ImportTicket ticketInfo, Cliente cliente) { var poi = ticketInfo.DireccionPtoDeEntrega + ", " + ticketInfo.LocalidadPtoDeEntrega; bool nomenclado; var puntoDeInteres = GetGeoRef(poi, ddlTipoGeoRefPtoInteres, cliente.Codigo + "_" + ticketInfo.CodigoPtoDeEntrega, ticketInfo.DescripcionPtoDeEntrega, cliente.Linea, out nomenclado); var pto = new PuntoEntrega { Cliente = cliente, Codigo = Trunc(ticketInfo.CodigoPtoDeEntrega, 32), Descripcion = Trunc(ticketInfo.DescripcionPtoDeEntrega, 40), Telefono = "", Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = nomenclado, DireccionNomenclada = Trunc(poi, 255) }; DAOFactory.PuntoEntregaDAO.SaveOrUpdate(pto); return(pto); }
public override object Parse(int empresa, int linea, IData data) { var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa); var oCliente = DaoFactory.ClienteDAO.FindById(4186); // RESTO DE MERCADO const int vigencia = 24; var codLinea = data.AsString(Properties.DistribucionF.Centro, 4).Trim(); if (string.IsNullOrEmpty(codLinea)) { ThrowProperty("LINEA"); } var oLinea = DaoFactory.LineaDAO.FindByCodigo(empresa, codLinea); if (oLinea == null) { ThrowProperty("LINEA"); } var ruta = data.AsString(Properties.DistribucionF.Ruta, 8).Trim(); if (string.IsNullOrEmpty(ruta)) { ThrowProperty("RUTA"); } int nroViaje; if (!int.TryParse(ruta.Split(',')[1], out nroViaje)) { ThrowProperty("NUMERO_VIAJE"); } var codEntrega = data.AsString(Properties.DistribucionF.Entrega, 10).Trim(); if (string.IsNullOrEmpty(codEntrega)) { ThrowProperty("ENTREGA"); } var codCliente = data.AsString(Properties.DistribucionF.CodigoCliente, 9).Trim(); if (string.IsNullOrEmpty(codCliente)) { ThrowProperty("CODIGO_CLIENTE"); } var latitud = data.AsDouble(Properties.DistribucionF.Latitud) / 1000000.0; if (!latitud.HasValue) { ThrowProperty("LATITUD"); } var longitud = data.AsDouble(Properties.DistribucionF.Longitud) / 1000000.0; if (!longitud.HasValue) { ThrowProperty("LONGITUD"); } var fecha = data.AsString(Properties.DistribucionF.Fecha, 10).Trim(); if (string.IsNullOrEmpty(fecha)) { ThrowProperty("FECHA"); } var hora = data.AsString(Properties.DistribucionF.Hora, 8).Trim(); if (string.IsNullOrEmpty(hora)) { ThrowProperty("HORA"); } int dia, mes, anio, hr, min, seg; if (!int.TryParse(fecha.Substring(0, 2), out dia)) { ThrowProperty("DIA"); } if (!int.TryParse(fecha.Substring(3, 2), out mes)) { ThrowProperty("MES"); } if (!int.TryParse(fecha.Substring(6, 4), out anio)) { ThrowProperty("AÑO"); } if (!int.TryParse(hora.Substring(0, 2), out hr)) { ThrowProperty("HORA"); } if (hr == 0) { hr = nroViaje <= 1 ? 6 : 12; } if (!int.TryParse(hora.Substring(3, 2), out min)) { ThrowProperty("MINUTO"); } if (!int.TryParse(hora.Substring(6, 2), out seg)) { ThrowProperty("SEGUNDO"); } var gmt = new TimeSpan(-3, 0, 0); var date = new DateTime(anio, mes, dia, hr, min, seg).Subtract(gmt); var cajas = data.AsInt32(Properties.DistribucionF.Cajas); if (!cajas.HasValue) { ThrowProperty("CAJAS"); } var codigo = date.ToString("yyMMdd") + "|" + ruta; var item = GetDistribucion(empresa, linea, codigo); if (data.Operation == (int)Operation.Delete) { return(item); } if (item.Id == 0) { Coche vehiculo = null; var patente = data.AsString(Properties.DistribucionF.Patente, 10).Trim(); if (!string.IsNullOrEmpty(patente)) { vehiculo = DaoFactory.CocheDAO.GetByPatente(new[] { empresa }, new[] { oLinea.Id }, patente); } if (vehiculo == null) { var asig = DaoFactory.PreasignacionViajeVehiculoDAO.FindByCodigo(empresa, oLinea.Id, -1, ruta); if (asig != null) { vehiculo = asig.Vehiculo; } } Empleado empleado = null; var legajo = data.AsString(Properties.DistribucionF.Legajo, 10).Trim(); if (!string.IsNullOrEmpty(legajo)) { empleado = DaoFactory.EmpleadoDAO.GetByLegajo(empresa, oLinea.Id, legajo); } item.Empresa = oEmpresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Empleado = empleado; item.Inicio = date; item.Fin = date; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.NumeroViaje = Convert.ToInt32(nroViaje); } // Entregas if (item.Detalles.Count == 0) { // Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(origen); var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(llegada); } if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codCliente)) { var repetido = item.Detalles.FirstOrDefault(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codCliente); repetido.Bultos += cajas.Value; DaoFactory.EntregaDistribucionDAO.SaveOrUpdate(repetido); return(item); } TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa }, new[] { linea }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } var puntoEntrega = DaoFactory.PuntoEntregaDAO.GetByCode(new[] { empresa }, new[] { linea }, new[] { -1 }, codCliente); if (puntoEntrega == null) { var descCliente = data.AsString(Properties.DistribucionF.DescripcionCliente, 128).Trim(); if (string.IsNullOrEmpty(descCliente)) { ThrowProperty("NOMBRE_CLIENTE"); } var puntoDeInteres = new ReferenciaGeografica { Codigo = codCliente, Descripcion = descCliente, Empresa = oEmpresa, Linea = oLinea, EsFin = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = oCliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = date.Date, Fin = date.AddHours(vigencia) }, Icono = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(latitud.Value, longitud.Value); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = date.Date } }; poligono.AddPoints(new[] { new PointF((float)longitud.Value, (float)latitud.Value) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = date.Date } }); DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoDeInteres); STrace.Trace("QtreeReset", "DistribucionFV1 1"); puntoEntrega = new PuntoEntrega { Cliente = oCliente, Codigo = codCliente, Descripcion = descCliente, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = descCliente }; } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != latitud.Value || puntoEntrega.ReferenciaGeografica.Longitude != longitud.Value)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = date.Date; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = date.Date; var posicion = GetNewDireccion(latitud.Value, longitud.Value); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = date.Date } }; poligono.AddPoints(new[] { new PointF((float)longitud.Value, (float)latitud.Value) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, date.Date); } puntoEntrega.ReferenciaGeografica.Vigencia.Inicio = date.Date; var end = date.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoEntrega.ReferenciaGeografica); STrace.Trace("QtreeReset", "DistribucionFV1 2"); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); var entrega = new EntregaDistribucion { Cliente = puntoEntrega.Cliente, PuntoEntrega = puntoEntrega, Descripcion = codEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count - 1, Programado = date, ProgramadoHasta = date, TipoServicio = tipoServicio, Viaje = item, Bultos = cajas.Value }; item.Detalles.Add(entrega); var maxDate = item.Detalles.Max(d => d.Programado); item.Fin = maxDate; var ultimo = item.Detalles.Last(e => e.Linea != null); if (ultimo.Id > 0) { ultimo.Programado = maxDate; ultimo.ProgramadoHasta = maxDate; ultimo.Orden = item.Detalles.Count - 1; DaoFactory.EntregaDistribucionDAO.SaveOrUpdate(ultimo); } return(item); }
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)); }
public override object Parse(int empresa, int linea, IData data) { /* * CodigoCliente;NombreCliente;CodigoParada;NombreParada;EstadoParada;TipoParada;Latitud;Longitud * * 80;BRINKS ARGENTINA;00000;BRINKS RABANAL;;P;-34.66493700;-58.43795400; * * Observaciones: * EstadoParada: vacio=activa; I=Inactiva * TipoParada: P=Plata; O=Operativa; C=Cliente */ var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa); var oLinea = DaoFactory.LineaDAO.FindById(linea); if (oLinea == null) { ThrowProperty("LINEA"); } var codigoCliente = data[Properties.PuntoEntregaB.CodigoCliente].Trim(); if (string.IsNullOrEmpty(codigoCliente)) { ThrowProperty("CODIGO_CLIENTE"); } var descCliente = data[Properties.PuntoEntregaB.NombreCliente].Trim(); if (string.IsNullOrEmpty(descCliente)) { ThrowProperty("DESCRIPCION_CLIENTE"); } var codigoPuntoEntrega = data[Properties.PuntoEntregaB.CodigoPuntoEntrega].Trim(); if (string.IsNullOrEmpty(codigoPuntoEntrega)) { ThrowProperty("CODIGO_PUNTO_ENTREGA"); } var descPuntoEntrega = data[Properties.PuntoEntregaB.NombrePuntoEntrega].Trim(); if (string.IsNullOrEmpty(descPuntoEntrega)) { ThrowProperty("DESCRIPCION_PUNTO_ENTREGA"); } var tipo = data[Properties.PuntoEntregaB.Tipo].Trim(); if (string.IsNullOrEmpty(tipo)) { ThrowProperty("TIPO_ENTREGA"); } var latitud = data[Properties.PuntoEntregaB.Latitud].Trim(); if (string.IsNullOrEmpty(latitud)) { ThrowProperty("LATITUD"); } var longitud = data[Properties.PuntoEntregaB.Longitud].Trim(); if (string.IsNullOrEmpty(longitud)) { ThrowProperty("LONGITUD"); } latitud = latitud.Replace(',', '.'); longitud = longitud.Replace(',', '.'); var lat = Convert.ToDouble(latitud, CultureInfo.InvariantCulture); var lon = Convert.ToDouble(longitud, CultureInfo.InvariantCulture); var oCliente = DaoFactory.ClienteDAO.FindByCode(new[] { empresa }, new[] { linea }, codigoCliente); if (oCliente == null) { var referenciaGeografica = GetNewGeoRef(oEmpresa, oLinea, codigoCliente, descCliente, lat, lon, tipo); oCliente = new Cliente { Codigo = codigoCliente, Descripcion = descCliente, DescripcionCorta = descCliente.Truncate(17), Empresa = oEmpresa, Linea = oLinea, ReferenciaGeografica = referenciaGeografica, Nomenclado = true }; DaoFactory.ClienteDAO.SaveOrUpdate(oCliente); } var oPuntoEntrega = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { empresa }, new[] { linea }, new[] { oCliente.Id }, codigoPuntoEntrega); if (oPuntoEntrega == null) { var referenciaGeografica = GetNewGeoRef(oEmpresa, oLinea, codigoPuntoEntrega, descPuntoEntrega, lat, lon, tipo); oPuntoEntrega = new PuntoEntrega { Cliente = oCliente, Codigo = codigoPuntoEntrega, Descripcion = descPuntoEntrega, Nombre = descPuntoEntrega, ReferenciaGeografica = referenciaGeografica, Nomenclado = true }; } else if (!oPuntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (oPuntoEntrega.ReferenciaGeografica.Latitude != lat || oPuntoEntrega.ReferenciaGeografica.Longitude != lon)) { oPuntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; oPuntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); oPuntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); oPuntoEntrega.ReferenciaGeografica.Vigencia.Fin = DateTime.UtcNow; DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(oPuntoEntrega.ReferenciaGeografica); STrace.Trace("QtreeReset", "PuntoEntregaBV1 1"); } return(oPuntoEntrega); }
public ViajeDistribucion Parse(out int rutas, out int entregas) { const int vigencia = 12; var te = new TimeElapsed(); var rows = ParseFile(Llfile.FilePath).Rows; STrace.Trace(Component, string.Format("Archivo parseado en {0} segundos", te.getTimeElapsed().TotalSeconds)); var listPuntos = new List <PuntoEntrega>(); var listReferencias = new List <ReferenciaGeografica>(); rutas = 0; entregas = 0; var sLinea = rows[Properties.DistribucionSos.Base][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sFecha = rows[Properties.DistribucionSos.Fecha][0].ToString().Replace("\t", string.Empty).Split(':'); var sHora = rows[Properties.DistribucionSos.HoraProgramada][0].ToString().Replace("\t", string.Empty).Split(':'); var sEntrega = rows[Properties.DistribucionSos.Entrega][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sPatente = rows[Properties.DistribucionSos.Patente][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sLatO = rows[Properties.DistribucionSos.LatitudOrigen][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sLonO = rows[Properties.DistribucionSos.LongitudOrigen][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sLatD = rows[Properties.DistribucionSos.LatitudDestino][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sLonD = rows[Properties.DistribucionSos.LongitudDestino][0].ToString().Replace("\t", string.Empty).Split(':')[1]; if (string.IsNullOrEmpty(sEntrega)) { ThrowProperty("CODIGO ENTREGA", Llfile.Strategy); } if (string.IsNullOrEmpty(sPatente)) { ThrowProperty("PATENTE", Llfile.Strategy); } var linea = DaoFactory.LineaDAO.FindByCodigo(Empresa.Id, sLinea); if (linea == null) { ThrowProperty("BASE", Llfile.Strategy); } var viaje = DaoFactory.ViajeDistribucionDAO.FindByCodigo(Empresa.Id, linea.Id, sEntrega); if (viaje != null) { return(viaje); } var dia = Convert.ToInt32(sFecha[1].Substring(0, 2)); var mes = Convert.ToInt32(sFecha[1].Substring(3, 2)); var anio = Convert.ToInt32(sFecha[1].Substring(6, 4)); var hora = Convert.ToInt32(sHora[1]); var min = Convert.ToInt32(sHora[2]); var seg = Convert.ToInt32(sHora[3]); var gmt = new TimeSpan(-3, 0, 0); var fecha = new DateTime(anio, mes, dia, hora, min, seg).Subtract(gmt); var vehiculo = DaoFactory.CocheDAO.FindByPatente(Empresa.Id, sPatente); if (vehiculo == null) { ThrowProperty("VEHICULO", Llfile.Strategy); } viaje = new ViajeDistribucion { Inicio = fecha, Codigo = sEntrega, Empresa = Empresa, Linea = linea, Vehiculo = vehiculo, Tipo = ViajeDistribucion.Tipos.Desordenado, Alta = DateTime.UtcNow, RegresoABase = false, Estado = ViajeDistribucion.Estados.Pendiente }; rutas++; var origen = new EntregaDistribucion { Linea = linea, Descripcion = linea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fecha, ProgramadoHasta = fecha, Viaje = viaje }; viaje.Detalles.Add(origen); var nombreOrigen = sEntrega + " - O"; var nombreDestino = sEntrega + " - D"; TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { Empresa.Id }, new[] { linea.Id }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } sLatO = sLatO.Replace(',', '.'); sLonO = sLonO.Replace(',', '.'); var latO = Convert.ToDouble(sLatO, CultureInfo.InvariantCulture); var lonO = Convert.ToDouble(sLonO, CultureInfo.InvariantCulture); ValidateGpsPoint(nombreOrigen, nombreOrigen, (float)latO, (float)lonO); sLatD = sLatD.Replace(',', '.'); sLonD = sLonD.Replace(',', '.'); var latD = Convert.ToDouble(sLatD, CultureInfo.InvariantCulture); var lonD = Convert.ToDouble(sLonD, CultureInfo.InvariantCulture); ValidateGpsPoint(nombreOrigen, nombreOrigen, (float)latD, (float)lonD); #region Origen var puntoEntregaO = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { Empresa.Id }, new[] { linea.Id }, 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(latO, lonO); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lonO, (float)latO) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); listReferencias.Add(puntoDeInteres); puntoEntregaO = new PuntoEntrega { Cliente = Cliente, Codigo = nombreOrigen, Descripcion = nombreOrigen, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombreOrigen }; } else { if (!puntoEntregaO.ReferenciaGeografica.IgnoraLogiclink && (puntoEntregaO.ReferenciaGeografica.Latitude != latO || puntoEntregaO.ReferenciaGeografica.Longitude != lonO)) { puntoEntregaO.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntregaO.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(latO, lonO); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lonO, (float)latO) }); puntoEntregaO.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntregaO.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntregaO.ReferenciaGeografica.Vigencia.Fin = end; } listReferencias.Add(puntoEntregaO.ReferenciaGeografica); } listPuntos.Add(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); entregas++; #endregion #region Destino var puntoEntregaD = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { Empresa.Id }, new[] { linea.Id }, 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(latD, lonD); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lonD, (float)latD) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); listReferencias.Add(puntoDeInteres); puntoEntregaD = new PuntoEntrega { Cliente = Cliente, Codigo = nombreDestino, Descripcion = nombreDestino, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombreDestino }; } else { if (!puntoEntregaD.ReferenciaGeografica.IgnoraLogiclink && (puntoEntregaD.ReferenciaGeografica.Latitude != latD || puntoEntregaD.ReferenciaGeografica.Longitude != lonD)) { puntoEntregaD.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntregaD.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(latD, lonD); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lonD, (float)latD) }); puntoEntregaD.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntregaD.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntregaD.ReferenciaGeografica.Vigencia.Fin = end; } listReferencias.Add(puntoEntregaD.ReferenciaGeografica); } listPuntos.Add(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); entregas++; viaje.Fin = fecha; #endregion 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 Viaje"); te.Restart(); DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viaje); STrace.Trace(Component, string.Format("Viaje guardado en {0} segundos", te.getTimeElapsed().TotalSeconds)); return(viaje); }
public void Parse(out int rutas, out int entregas) { const char separator = '|'; const int vigencia = 12; var te = new TimeElapsed(); var rows = ParseFile(Llfile.FilePath, separator).Rows; 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; 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 patente = row.Cells[Properties.DistribucionQuilmes.Patente].ToString().Trim(); var vehiculo = _cochesBuffer.SingleOrDefault(v => v.Patente == patente); var oLinea = vehiculo != null && vehiculo.Linea != null ? vehiculo.Linea : Linea; if (oLinea == null) { ThrowProperty("LINEA", Llfile.Strategy); } var sFecha = row.Cells[Properties.DistribucionQuilmes.Fecha].ToString().Trim(); var codigo = sFecha + row.Cells[Properties.DistribucionQuilmes.Ruta].ToString().Trim(); var sHora = row.Cells[Properties.DistribucionQuilmes.Hora].ToString().Trim(); if (sHora.Length == 3) { sHora = "0" + sHora; } else if (sHora.Length != 4) { ThrowProperty("HORARIO", Llfile.Strategy); } var latitud = row.Cells[Properties.DistribucionQuilmes.Latitud].ToString().Trim(); var longitud = row.Cells[Properties.DistribucionQuilmes.Longitud].ToString().Trim(); var esBase = latitud.Trim().Equals(string.Empty) && longitud.Trim().Equals(string.Empty); var dia = Convert.ToInt32(sFecha.Substring(0, 2)); var mes = Convert.ToInt32(sFecha.Substring(2, 2)); var anio = Convert.ToInt32(sFecha.Substring(4, 2)) + 2000; var hora = Convert.ToInt32(sHora.Substring(0, 2)); var min = Convert.ToInt32(sHora.Substring(2, 2)); var gmt = new TimeSpan(-3, 0, 0); var fecha = new DateTime(anio, mes, dia, hora, min, 0).Subtract(gmt); if (listViajes.Count == 0 || codigo != listViajes.Last().Codigo) { var byCode = _viajesBuffer.SingleOrDefault(v => v.Codigo == codigo); if (byCode != null) { continue; } } ViajeDistribucion item; if (listViajes.Count > 0 && listViajes.Any(v => v.Codigo == codigo)) { item = listViajes.SingleOrDefault(v => v.Codigo == codigo); if (fecha < item.Inicio) { item.Inicio = fecha; } } else { item = new ViajeDistribucion { Codigo = codigo }; rutas++; item.Empresa = Empresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Inicio = fecha; item.Fin = fecha; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.ProgramacionDinamica = codigo.Contains("TR"); var nroViaje = row.Cells[Properties.DistribucionQuilmes.Viaje].ToString().Trim(); item.NumeroViaje = Convert.ToInt32(nroViaje); if (vehiculo != null) { item.Empleado = !vehiculo.IdentificaChoferes ? vehiculo.Chofer : null; item.CentroDeCostos = vehiculo.CentroDeCostos; item.SubCentroDeCostos = vehiculo.SubCentroDeCostos; } else { STrace.Error(Component, string.Format("Patente {0} no encontrada para el viaje: {1}", patente, codigo)); } listViajes.Add(item); } var kms = row.Cells[Properties.DistribucionQuilmes.Kms].ToString().Trim(); var distance = Convert.ToDouble(kms, CultureInfo.InvariantCulture); if (esBase) { if (codigo.Contains("TR")) { var ultimo = item.Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(oLinea.ReferenciaGeografica.Latitude, oLinea.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { distance = directions.Distance / 1000.0; var duracion = directions.Duration; fecha = item.Detalles.Last().Programado.Add(duracion); } } var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, Viaje = item, KmCalculado = distance }; item.Detalles.Add(llegada); continue; } // Entregas if (item.Detalles.Count == 0) { //Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fecha, ProgramadoHasta = fecha, Viaje = item }; item.Detalles.Add(origen); } var codigoPuntoEntrega = row.Cells[Properties.DistribucionQuilmes.CodigoCliente].ToString().Trim(); var nombre = row.Cells[Properties.DistribucionQuilmes.DescripcionCliente].ToString().Trim(); if (string.IsNullOrEmpty(codigoPuntoEntrega)) { ThrowProperty("PUNTO ENTREGA", Llfile.Strategy); } if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codigoPuntoEntrega)) { 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; } latitud = latitud.Replace(',', '.'); longitud = longitud.Replace(',', '.'); var lat = Convert.ToDouble(latitud, CultureInfo.InvariantCulture); var lon = Convert.ToDouble(longitud, CultureInfo.InvariantCulture); ValidateGpsPoint(codigo, codigoPuntoEntrega, (float)lat, (float)lon); var puntoEntrega = _puntosBuffer.SingleOrDefault(p => p.Codigo == codigoPuntoEntrega); if (puntoEntrega == null) { var empresaGeoRef = item.Vehiculo != null && item.Vehiculo.Empresa == null ? null : Cliente.Empresa == null ? null : Empresa; var lineaGeoRef = item.Vehiculo != null && item.Vehiculo.Linea == null ? null : Cliente.Linea == null ? null : oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoPuntoEntrega, Descripcion = nombre, 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(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); listReferencias.Add(puntoDeInteres); puntoEntrega = new PuntoEntrega { Cliente = Cliente, Codigo = codigoPuntoEntrega, Descripcion = nombre, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombre }; } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != lat || puntoEntrega.ReferenciaGeografica.Longitude != lon)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } listReferencias.Add(puntoEntrega.ReferenciaGeografica); } listPuntos.Add(puntoEntrega); if (codigo.Contains("TR")) { var ultimo = item.Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(puntoEntrega.ReferenciaGeografica.Latitude, puntoEntrega.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { distance = directions.Distance / 1000.0; var duracion = directions.Duration; fecha = item.Detalles.Last().Programado.Add(duracion); } } if (item.Detalles.Last().TipoServicio != null) { fecha = fecha.AddMinutes(item.Detalles.Last().TipoServicio.Demora); } var entrega = new EntregaDistribucion { Cliente = Cliente, PuntoEntrega = puntoEntrega, Descripcion = codigoPuntoEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, //Orden = Convert.ToInt32(orden, CultureInfo.InvariantCulture), Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = item, KmCalculado = distance }; item.Detalles.Add(entrega); entregas++; var lastDetail = item.Detalles.LastOrDefault(); item.Fin = lastDetail == null ? item.Inicio : lastDetail.Programado; } 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)); DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(-1, -1); DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(Empresa.Id, -1); var lineas = DaoFactory.LineaDAO.FindList(new[] { Empresa.Id }); foreach (var lin in lineas) { DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(Empresa.Id, lin.Id); } }
public override object Parse(int empresa, int linea, IData data) { var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa); var patente = data.AsString(Properties.Distribution.Coche, 32).Trim(); var vehiculo = patente != string.Empty ? DaoFactory.CocheDAO.FindByPatente(empresa, patente) : null; var oLinea = vehiculo != null && vehiculo.Linea != null ? vehiculo.Linea : DaoFactory.LineaDAO.FindById(linea); if (oLinea == null) { ThrowProperty("LINEA"); } var oCliente = DaoFactory.ClienteDAO.GetList(new[] { empresa }, new[] { -1 }).FirstOrDefault(); if (oCliente == null) { ThrowProperty("CLIENTE"); } const int vigencia = 12; var sFecha = data.AsString(Properties.Distribution.Fecha, 6).Trim(); var codigo = sFecha + data.AsString(Properties.Distribution.Codigo, 8).Trim(); var item = GetDistribucion(empresa, oLinea.Id, codigo); if (data.Operation == (int)Operation.Delete) { return(item); } var sHora = data.AsString(Properties.Distribution.Horario, 4).Trim(); if (sHora.Length == 3) { sHora = "0" + sHora; } else if (sHora.Length != 4) { ThrowProperty("HORARIO"); } var latitud = data.AsString(Properties.Distribution.Latitud, 10).Trim(); var longitud = data.AsString(Properties.Distribution.Longitud, 10).Trim(); var esBase = latitud.Trim().Equals(string.Empty) && longitud.Trim().Equals(string.Empty); //var orden = data.AsString(Properties.Distribution.Orden, 2).Trim(); // HACE FALTA AGREGAR EL CAMPO AL MAPEO var dia = Convert.ToInt32(sFecha.Substring(0, 2)); var mes = Convert.ToInt32(sFecha.Substring(2, 2)); var anio = Convert.ToInt32(sFecha.Substring(4, 2)) + 2000; var hora = Convert.ToInt32(sHora.Substring(0, 2)); var min = Convert.ToInt32(sHora.Substring(2, 2)); var gmt = new TimeSpan(-3, 0, 0); var fecha = new DateTime(anio, mes, dia, hora, min, 0).Subtract(gmt); if (item.Id == 0) { item.Empresa = oEmpresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Inicio = fecha; item.Fin = fecha; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.ProgramacionDinamica = codigo.Contains("TR"); var nroViaje = data.AsString(Properties.Distribution.NroViaje, 1).Trim(); item.NumeroViaje = Convert.ToInt32(nroViaje); if (patente != string.Empty) { if (vehiculo != null) { item.Empleado = !vehiculo.IdentificaChoferes ? vehiculo.Chofer : null; item.CentroDeCostos = vehiculo.CentroDeCostos; item.SubCentroDeCostos = vehiculo.SubCentroDeCostos; } else { STrace.Error("Logiclink", string.Format("Patente {0} no encontrada para el viaje: {1}", patente, codigo)); } } else { STrace.Error("Logiclink", "Patente vacía para el viaje: " + codigo); } } else { if (fecha < item.Inicio) { item.Inicio = fecha; } } var km = data.AsString(Properties.Distribution.Km, 32).Trim(); var distance = Convert.ToDouble(km, CultureInfo.InvariantCulture); if (esBase) { if (codigo.Contains("TR")) { var ultimo = item.Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(oLinea.ReferenciaGeografica.Latitude, oLinea.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { distance = directions.Distance / 1000.0; var duracion = directions.Duration; fecha = item.Detalles.Last().Programado.Add(duracion); } } var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, Viaje = item, KmCalculado = distance }; item.Detalles.Add(llegada); return(item); } // Entregas if (item.Detalles.Count == 0) { //Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fecha, ProgramadoHasta = fecha, Viaje = item }; item.Detalles.Add(origen); } var codigoPuntoEntrega = data.AsString(Properties.Distribution.PuntoEntrega, 16).Trim(); var nombre = data.AsString(Properties.Distribution.Nombre, 32).Trim(); if (string.IsNullOrEmpty(codigoPuntoEntrega)) { ThrowProperty("PuntoEntrega"); } if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codigoPuntoEntrega)) { return(item); } TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa }, new[] { oLinea.Id }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } latitud = latitud.Replace(',', '.'); longitud = longitud.Replace(',', '.'); var lat = Convert.ToDouble(latitud, CultureInfo.InvariantCulture); var lon = Convert.ToDouble(longitud, CultureInfo.InvariantCulture); ValidateGpsPoint(codigo, codigoPuntoEntrega, (float)lat, (float)lon); var puntoEntrega = DaoFactory.PuntoEntregaDAO.GetByCode(new[] { empresa }, new[] { oLinea.Id }, new[] { oCliente.Id }, codigoPuntoEntrega); if (puntoEntrega == null) { var empresaGeoRef = item.Vehiculo != null && item.Vehiculo.Empresa == null ? null : oCliente.Empresa == null ? null : oEmpresa; var lineaGeoRef = item.Vehiculo != null && item.Vehiculo.Linea == null ? null : oCliente.Linea == null ? null : oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoPuntoEntrega, Descripcion = nombre, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = oCliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoDeInteres); STrace.Trace("QtreeReset", "DistribucionV1 1"); puntoEntrega = new PuntoEntrega { Cliente = oCliente, Codigo = codigoPuntoEntrega, Descripcion = nombre, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombre }; } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != lat || puntoEntrega.ReferenciaGeografica.Longitude != lon)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoEntrega.ReferenciaGeografica); STrace.Trace("QtreeReset", "DistribucionV1 2"); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); if (codigo.Contains("TR")) { var ultimo = item.Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(puntoEntrega.ReferenciaGeografica.Latitude, puntoEntrega.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { distance = directions.Distance / 1000.0; var duracion = directions.Duration; fecha = item.Detalles.Last().Programado.Add(duracion); } } if (item.Detalles.Last().TipoServicio != null) { fecha = fecha.AddMinutes(item.Detalles.Last().TipoServicio.Demora); } var entrega = new EntregaDistribucion { Cliente = oCliente, PuntoEntrega = puntoEntrega, Descripcion = codigoPuntoEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, //Orden = Convert.ToInt32(orden, CultureInfo.InvariantCulture), Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = item, KmCalculado = distance }; item.Detalles.Add(entrega); var lastDetail = item.Detalles.LastOrDefault(); item.Fin = lastDetail == null ? item.Inicio : lastDetail.Programado; return(item); }
public void ParseClientes(out int clientes) { 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(); PreBufferClientes(rows); STrace.Trace(Component, string.Format("PreBufferClientes en {0} segundos", te.getTimeElapsed().TotalSeconds)); var listClientes = new List <PuntoEntrega>(); var listReferencias = new List <ReferenciaGeografica>(); clientes = 0; var filas = 0; foreach (var fila in rows) { filas++; STrace.Trace(Component, string.Format("Procesando fila: {0}/{1}", filas, rows.Count - 1)); var codigoCliente = fila[Properties.ClienteCCU.CodigoCliente].ToString().Trim(); var nombre = fila[Properties.ClienteCCU.Nombre].ToString().Trim(); var direccion = fila[Properties.ClienteCCU.Direccion].ToString().Trim(); var latitud = fila[Properties.ClienteCCU.Latitud].ToString().Trim(); var longitud = fila[Properties.ClienteCCU.Longitud].ToString().Trim(); //var localidad = fila[Properties.ClienteCCU.Localidad].ToString().Trim(); //var barrio = fila[Properties.ClienteCCU.Barrio].ToString().Trim(); if (string.IsNullOrEmpty(codigoCliente)) { continue; } double lat, lon = 0.0; if (!double.TryParse(latitud, out lat) || !double.TryParse(longitud, out lon)) { continue; } var puntoEntrega = _clientesBuffer.SingleOrDefault(p => p.Codigo == codigoCliente); if (puntoEntrega == null) { var empresaGeoRef = Empresa; //var lineaGeoRef = oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoCliente, Descripcion = nombre, 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 = DateTime.UtcNow }, Icono = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); listReferencias.Add(puntoDeInteres); puntoEntrega = new PuntoEntrega { Cliente = Cliente, Codigo = codigoCliente, Descripcion = direccion, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombre }; listClientes.Add(puntoEntrega); } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != lat || puntoEntrega.ReferenciaGeografica.Longitude != lon)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); listReferencias.Add(puntoEntrega.ReferenciaGeografica); puntoEntrega.Descripcion = direccion; puntoEntrega.Nombre = nombre; listClientes.Add(puntoEntrega); } } } STrace.Trace(Component, "Guardando referencias geográficas: " + listReferencias.Count); te.Restart(); var referencia = 0; var referenciasTotales = listReferencias.Count(); foreach (var referenciaGeografica in listReferencias) { referencia++; STrace.Trace(Component, string.Format("Guardando referencia: {0}/{1}", referencia, referenciasTotales)); DaoFactory.ReferenciaGeograficaDAO.Guardar(referenciaGeografica); } STrace.Trace(Component, string.Format("Referencias guardadas en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando clientes: " + listClientes.Count); te.Restart(); var clientesTotales = listClientes.Count(); foreach (var puntoEntrega in listClientes) { clientes++; STrace.Trace(Component, string.Format("Guardando clientes: {0}/{1}", clientes, clientesTotales)); DaoFactory.PuntoEntregaDAO.SaveOrUpdateWithoutTransaction(puntoEntrega); } STrace.Trace(Component, string.Format("Clientes guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); }
public void Parse(out int rutas, out int entregas) { const int vigencia = 24; var te = new TimeElapsed(); var rows = ParseFile(Llfile.FilePath, Properties.DistribucionReginaldLee.Anchos).Rows; 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; 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 ruta = row.Cells[Properties.DistribucionReginaldLee.CodigoRuta].ToString().Trim(); if (ruta == string.Empty) { ThrowProperty("CODIGO_RUTA", Llfile.Strategy); } var nroViaje = 1; if (ruta.Contains(",")) { var rutaSplitted = ruta.Split(','); int.TryParse(rutaSplitted[1], out nroViaje); } var codEntrega = row.Cells[Properties.DistribucionReginaldLee.CodigoPedido].ToString().Trim(); if (codEntrega == string.Empty) { ThrowProperty("CODIGO_ENTREGA", Llfile.Strategy); } var codCliente = row.Cells[Properties.DistribucionReginaldLee.CodigoCliente].ToString().Trim(); if (codCliente == string.Empty) { ThrowProperty("CODIGO_CLIENTE", Llfile.Strategy); } var rowWithCoords = true; double latitud; double longitud; if (!double.TryParse(row.Cells[Properties.DistribucionReginaldLee.Latitud].ToString().Trim(), out latitud)) { rowWithCoords = false; } if (!double.TryParse(row.Cells[Properties.DistribucionReginaldLee.Longitud].ToString().Trim(), out longitud)) { rowWithCoords = false; } var orientacionSouthNorth = row.Cells[Properties.DistribucionReginaldLee.OrientacionNorthSouth].ToString().Trim(); var orientacionEastWest = row.Cells[Properties.DistribucionReginaldLee.OrientacionEastWest].ToString().Trim(); if (orientacionSouthNorth.Equals("S")) { latitud = latitud * (-1); } if (orientacionEastWest.Equals("W")) { longitud = longitud * (-1); } var fecha = row.Cells[Properties.DistribucionReginaldLee.Fecha].ToString().Trim(); if (fecha == string.Empty) { ThrowProperty("FECHA", Llfile.Strategy); } int dia, mes, anio, hr, min; int.TryParse(fecha.Substring(0, 4), out anio); int.TryParse(fecha.Substring(5, 2), out mes); int.TryParse(fecha.Substring(8, 2), out dia); int.TryParse(fecha.Substring(11, 2), out hr); int.TryParse(fecha.Substring(14, 2), out min); var gmt = new TimeSpan(-3, 0, 0); var date = new DateTime(anio, mes, dia, hr, min, 0).Subtract(gmt); int packs; if (!int.TryParse(row.Cells[Properties.DistribucionReginaldLee.Packs].ToString().Trim(), out packs)) { try { ThrowProperty("PACKS", Llfile.Strategy); } catch (Exception ex2) { STrace.Exception(Component, ex2, String.Format("Error en Fila #{0}: {1}", filas, ex2.Message)); continue; } } var codigo = date.ToString("yyMMdd") + "|" + ruta; if (listViajes.Count == 0 || codigo != listViajes.Last().Codigo) { var byCode = _viajesBuffer.SingleOrDefault(v => v.Codigo == codigo); if (byCode != null) { continue; } } ViajeDistribucion item; if (listViajes.Count > 0 && listViajes.Any(v => v.Codigo == codigo)) { item = listViajes.SingleOrDefault(v => v.Codigo == codigo); } else { item = new ViajeDistribucion { Codigo = codigo }; rutas++; Coche vehiculo = null; var interno = row.Cells[Properties.DistribucionReginaldLee.Interno].ToString().Trim(); if (interno.Length == 3) { interno = "0" + interno; } if (!string.IsNullOrEmpty(interno)) { vehiculo = _cochesBuffer.SingleOrDefault(c => c.Interno == interno); } if (vehiculo == null) { ThrowProperty("VEHICULO", Llfile.Strategy); } else if (vehiculo.Linea == null) { ThrowProperty("BASE", Llfile.Strategy); } item.Empresa = Empresa; item.Linea = vehiculo.Linea; item.Vehiculo = vehiculo; item.Inicio = date; item.Fin = date; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.NumeroViaje = Convert.ToInt32(nroViaje); listViajes.Add(item); } // Entregas if (item.Detalles.Count == 0) { // Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = item.Linea, Descripcion = item.Linea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(origen); var llegada = new EntregaDistribucion { Linea = item.Linea, Descripcion = item.Linea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(llegada); } if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codCliente)) { var repetido = item.Detalles.FirstOrDefault(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codCliente); repetido.Bultos += packs; continue; } TipoServicioCiclo tipoServicio = null; var tipoServ = _tiposServicioBuffer.SingleOrDefault(ts => ts.Linea.Id == item.Linea.Id || ts.Linea == null); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } var puntoEntrega = _puntosBuffer.SingleOrDefault(p => p.Codigo == codCliente); if (puntoEntrega == null) { var descCliente = row.Cells[Properties.DistribucionReginaldLee.DescripcionCliente].ToString().Trim(); var puntoDeInteres = new ReferenciaGeografica { Codigo = codCliente, Descripcion = descCliente, Empresa = Empresa, Linea = item.Linea, 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 = date.Date, Fin = date.AddHours(vigencia) }, Icono = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; if (!rowWithCoords) { try { ThrowProperty("LATITUD_LONGITUD", Llfile.Strategy); } catch (Exception ex) { STrace.Exception(Component, ex, String.Format("Error en Fila #{0}: {1}", filas, ex.Message)); continue; } } var posicion = GetNewDireccion(latitud, longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = date.Date } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = date.Date } }); listReferencias.Add(puntoDeInteres); puntoEntrega = new PuntoEntrega { Cliente = Cliente, Codigo = codCliente, Descripcion = descCliente, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = descCliente }; } else { if (!rowWithCoords) { try { ThrowProperty("LATITUD_LONGITUD", Llfile.Strategy); } catch (Exception ex) { STrace.Exception(Component, ex, String.Format("Error en Fila #{0}: {1}", filas, ex.Message)); continue; } } if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != latitud || puntoEntrega.ReferenciaGeografica.Longitude != longitud)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = date.Date; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = date.Date; var posicion = GetNewDireccion(latitud, longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = date.Date } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, date.Date); } if (puntoEntrega.ReferenciaGeografica.Vigencia.Inicio > date.Date) { puntoEntrega.ReferenciaGeografica.Vigencia.Inicio = date.Date; } var end = date.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } puntoEntrega.ReferenciaGeografica.Linea = item.Linea; listReferencias.Add(puntoEntrega.ReferenciaGeografica); } listPuntos.Add(puntoEntrega); var kms = 0.0; var orden = item.Detalles.Count - 1; var anterior = item.Detalles.FirstOrDefault(d => d.Orden == orden - 1); if (anterior != null) { kms = GeocoderHelper.CalcularDistacia(anterior.ReferenciaGeografica.Latitude, anterior.ReferenciaGeografica.Longitude, puntoEntrega.ReferenciaGeografica.Latitude, puntoEntrega.ReferenciaGeografica.Longitude); } var entrega = new EntregaDistribucion { Cliente = puntoEntrega.Cliente, PuntoEntrega = puntoEntrega, Descripcion = codEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = orden, Programado = date, ProgramadoHasta = date, TipoServicio = tipoServicio, Viaje = item, Bultos = packs }; item.Detalles.Add(entrega); entregas++; var maxDate = item.Detalles.Max(d => d.Programado); item.Fin = maxDate; var ultimo = item.Detalles.Last(e => e.Linea != null); ultimo.Programado = maxDate; ultimo.ProgramadoHasta = maxDate; ultimo.Orden = item.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)); }
public override object Parse(int empresa, int linea, IData data) { var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa); var tipo = data[Properties.DistribucionE.Tipo].Trim(); var nroDoc = data[Properties.DistribucionE.NroDocumento].Trim(); var despacho = data[Properties.DistribucionE.FechaDespacho].Trim(); var generacion = data[Properties.DistribucionE.FechaGeneracion].Trim(); var guardia = data[Properties.DistribucionE.Guardia].Trim(); var latitud = data[Properties.DistribucionE.Latitud].Trim(); var longitud = data[Properties.DistribucionE.Longitud].Trim(); var codigoViaje = DateTime.Today.ToString("ddMMyy") + "|" + guardia; var codigoTarea = tipo + "|" + nroDoc; var empleado = DaoFactory.EmpleadoDAO.FindByLegajo(empresa, -1, guardia); if (empleado == null) { ThrowProperty("EMPLEADO"); } var vehiculo = DaoFactory.CocheDAO.FindByChofer(empleado.Id); if (vehiculo == null) { ThrowProperty("VEHICULO"); } var oLinea = vehiculo.Linea != null ? vehiculo.Linea : empleado.Linea; if (oLinea == null) { ThrowProperty("LINEA"); } var oCliente = DaoFactory.ClienteDAO.GetList(new[] { empresa }, new[] { -1 }).FirstOrDefault(); if (oCliente == null) { ThrowProperty("CLIENTE"); } const int vigencia = 24; var item = GetDistribucion(empresa, oLinea.Id, codigoViaje); if (data.Operation == (int)Operation.Delete) { return(item); } var anioDespacho = Convert.ToInt32(despacho.Substring(0, 4)); var mesDespacho = Convert.ToInt32(despacho.Substring(5, 2)); var diaDespacho = Convert.ToInt32(despacho.Substring(8, 2)); var horaDespacho = Convert.ToInt32(despacho.Substring(11, 2)); var minDespacho = Convert.ToInt32(despacho.Substring(14, 2)); var gmt = new TimeSpan(-3, 0, 0); var fechaDespacho = new DateTime(anioDespacho, mesDespacho, diaDespacho, horaDespacho, minDespacho, 0).Subtract(gmt); var anioGeneracion = Convert.ToInt32(generacion.Substring(0, 4)); var mesGeneracion = Convert.ToInt32(generacion.Substring(5, 2)); var diaGeneracion = Convert.ToInt32(generacion.Substring(8, 2)); var horaGeneracion = Convert.ToInt32(generacion.Substring(11, 2)); var minGeneracion = Convert.ToInt32(generacion.Substring(14, 2)); var fechaGeneracion = new DateTime(anioGeneracion, mesGeneracion, diaGeneracion, horaGeneracion, minGeneracion, 0).Subtract(gmt); if (item.Id == 0) { item.Empresa = oEmpresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Inicio = fechaDespacho; item.Fin = fechaDespacho; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = false; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.ProgramacionDinamica = false; item.NumeroViaje = 1; item.Empleado = empleado; item.CentroDeCostos = vehiculo.CentroDeCostos; item.SubCentroDeCostos = vehiculo.SubCentroDeCostos; } // Entregas if (item.Detalles.Count == 0) { //Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fechaDespacho, ProgramadoHasta = fechaDespacho, Viaje = item }; item.Detalles.Add(origen); } TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa }, new[] { oLinea.Id }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } var lat = Convert.ToDouble(latitud, CultureInfo.InvariantCulture); var lon = Convert.ToDouble(longitud, CultureInfo.InvariantCulture); var puntoEntrega = DaoFactory.PuntoEntregaDAO.GetByCode(new[] { empresa }, new[] { oLinea.Id }, new[] { oCliente.Id }, codigoTarea); if (puntoEntrega == null) { var empresaGeoRef = item.Vehiculo != null && item.Vehiculo.Empresa == null ? null : oCliente.Empresa == null ? null : oEmpresa; var lineaGeoRef = item.Vehiculo != null && item.Vehiculo.Linea == null ? null : oCliente.Linea == null ? null : oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoTarea, Descripcion = codigoTarea, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = oCliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fechaDespacho.AddHours(vigencia) }, Icono = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoDeInteres); STrace.Trace("QtreeReset", "DistribucionEV1 1"); puntoEntrega = new PuntoEntrega { Cliente = oCliente, Codigo = codigoTarea, Descripcion = codigoTarea, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = codigoTarea }; } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != lat || puntoEntrega.ReferenciaGeografica.Longitude != lon)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fechaDespacho.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoEntrega.ReferenciaGeografica); STrace.Trace("QtreeReset", "DistribucionEV1 2"); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); var entrega = new EntregaDistribucion { Cliente = oCliente, PuntoEntrega = puntoEntrega, Descripcion = codigoTarea, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = fechaDespacho, ProgramadoHasta = fechaDespacho, TipoServicio = tipoServicio, Viaje = item }; item.Detalles.Add(entrega); var lastDetail = item.Detalles.LastOrDefault(); item.Fin = lastDetail == null ? item.Inicio : lastDetail.Programado; return(item); }
protected override void OnSave() { EditObject.Linea = cbLinea.Selected > 0 ? DAOFactory.LineaDAO.FindById(cbLinea.Selected) : null; EditObject.Empresa = cbEmpresa.Selected > 0 ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected) : EditObject.Linea != null ? EditObject.Linea.Empresa : null; EditObject.Codigo = txtCodigo.Text; EditObject.Descripcion = txtDescripcion.Text; EditObject.DescripcionCorta = txtDescripcionCorta.Text; EditObject.Telefono = txtTelefono.Text; EditObject.Comentario1 = txtComentario1.Text; EditObject.Comentario2 = txtComentario2.Text; EditObject.Comentario3 = txtComentario3.Text; if (chkExistente.Checked) { EditObject.ReferenciaGeografica = SelectGeoRef1.Selected > 0 ? DAOFactory.ReferenciaGeograficaDAO.FindById(SelectGeoRef1.Selected) : null; } else { if (!EditMode || !EditObject.Nomenclado) { EditObject.ReferenciaGeografica = EditEntityGeoRef1.GetNewGeoRefference(); } EditObject.ReferenciaGeografica.Empresa = EditObject.Empresa; EditObject.ReferenciaGeografica.Linea = EditObject.Linea; EditObject.ReferenciaGeografica.Descripcion = EditObject.Descripcion; var code = EditObject.Codigo; var i = 1; var byCode = DAOFactory.ReferenciaGeograficaDAO.FindByCodigoStartWith(cbEmpresa.SelectedValues, cbLinea.SelectedValues, new[] { EditEntityGeoRef1. TipoReferenciaGeograficaId }, code); while (byCode.Any(r => r.Codigo == code && EditObject.ReferenciaGeografica.Id != r.Id)) { code += "(" + i++ + ")"; } EditObject.ReferenciaGeografica.Codigo = code; EditObject.ReferenciaGeografica.TipoReferenciaGeografica = DAOFactory.TipoReferenciaGeograficaDAO.FindById(EditEntityGeoRef1.TipoReferenciaGeograficaId); DAOFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(EditObject.ReferenciaGeografica); STrace.Trace("QtreeReset", "ClienteAlta"); } EditObject.Nomenclado = true; DAOFactory.ClienteDAO.SaveOrUpdate(EditObject); if (EditMode) { return; } var puntoEntrega = new PuntoEntrega { Cliente = EditObject, Baja = false, Codigo = EditObject.Codigo, Descripcion = EditObject.Descripcion, ReferenciaGeografica = EditObject.ReferenciaGeografica, Telefono = EditObject.Telefono }; DAOFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); }
private Intercalado CalcularDirectionsIntercalado(Intercalado intercalado, PuntoEntrega nuevoPunto) { var viaje = Viajes.FirstOrDefault(v => v.Id == intercalado.Id); var first = viaje.Detalles.First().ReferenciaGeografica; var origen = new LatLon(first.Latitude, first.Longitude); var last = viaje.Detalles.Last().ReferenciaGeografica; var destino = new LatLon(last.Latitude, last.Longitude); var waypoints = viaje.Detalles.Skip(1).Take(viaje.Detalles.Count - 2).Select(w => new LatLon(w.ReferenciaGeografica.Latitude, w.ReferenciaGeografica.Longitude)).ToList(); var nuevaLatLon = new LatLon(nuevoPunto.ReferenciaGeografica.Latitude, nuevoPunto.ReferenciaGeografica.Longitude); if (intercalado.Index == 0) { waypoints.Insert(0, origen); origen = nuevaLatLon; } else if (intercalado.Index >= viaje.Detalles.Count) { waypoints.Add(destino); destino = nuevaLatLon; } else if (intercalado.Index == viaje.Detalles.Count - 1) { waypoints.Add(nuevaLatLon); } else { waypoints.Insert(intercalado.Index, nuevaLatLon); } var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, waypoints.ToArray()); intercalado.ViajeIntercalado = directions; if (directions != null) { intercalado.CostoKm = directions.Distance; } var nuevoDetalle = new EntregaDistribucion { PuntoEntrega = nuevoPunto, Cliente = nuevoPunto.Cliente, Descripcion = nuevoPunto.Descripcion }; viaje.InsertarEntrega(intercalado.Index, nuevoDetalle); if (intercalado.Index > 0) { viaje.CalcularHorario(intercalado.Index, intercalado.ViajeIntercalado); } if (intercalado.Index < viaje.Detalles.Count) { viaje.CalcularHorario(intercalado.Index, intercalado.ViajeIntercalado); } var duracionNueva = viaje.Detalles.Last().Programado.Subtract(viaje.Detalles.First().Programado); intercalado.CostoMin = duracionNueva.TotalMinutes; intercalado.Hora = nuevoDetalle.Programado; viaje.RemoverEntrega(intercalado.Index); return(intercalado); }
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 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); }