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 ReferenciaGeografica GetNewGeoRef(Empresa empresa, Linea linea, string codigo, string descripcion, double latitud, double longitud, string codigoTipo) { var tipo = DaoFactory.TipoReferenciaGeograficaDAO.FindByCodigo(new[] { empresa.Id }, new[] { linea != null ? linea.Id : -1 }, codigoTipo); if (tipo == null) { ThrowProperty("TIPO_PUNTO_ENTREGA"); } var puntoDeInteres = new ReferenciaGeografica { Codigo = codigo, Descripcion = descripcion, Empresa = empresa, Linea = linea, TipoReferenciaGeografica = tipo, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = DateTime.UtcNow }, Icono = tipo.Icono }; var posicion = GetNewDireccion(latitud, longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoDeInteres); STrace.Trace("QtreeReset", "PuntoEntregaBV1 2"); return(puntoDeInteres); }
private void SetDireccion(ReferenciaGeografica geoRef, IList <DireccionVO> nomencladas) { if (nomencladas.Count == 1) { var direccionNomenclada = nomencladas[0]; var dir = new Direccion { Altura = direccionNomenclada.Altura, Calle = direccionNomenclada.Calle, Descripcion = direccionNomenclada.Direccion.Truncate(128), IdCalle = direccionNomenclada.IdPoligonal, IdEntrecalle = -1, IdEsquina = direccionNomenclada.IdEsquina, IdMapa = (short)direccionNomenclada.IdMapaUrbano, Latitud = direccionNomenclada.Latitud, Longitud = direccionNomenclada.Longitud, Pais = "Argentina", Partido = direccionNomenclada.Partido, Provincia = direccionNomenclada.Provincia, Vigencia = new Vigencia { Inicio = DateTime.Now } }; var pol = new Poligono { Radio = 100, Vigencia = new Vigencia { Inicio = DateTime.Now } }; pol.AddPoints(new[] { new PointF((float)dir.Longitud, (float)dir.Latitud) }); geoRef.AddHistoria(dir, pol, DateTime.UtcNow); } }
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); } }
private void CreateReferencia(ImportDireccion datos, DireccionVO direccion) { var codigo = datos.Codigo.Trim(); var referencia = DAOFactory.ReferenciaGeograficaDAO.FindByCodigo(new [] { cbEmpresa.Selected }, new[] { cbLinea.Selected }, new[] { cbTipoGeoRef.Selected }, codigo); var linea = cbLinea.Selected > 0 ? DAOFactory.LineaDAO.FindById(cbLinea.Selected) : null; var empresa = linea != null ? linea.Empresa : cbEmpresa.Selected > 0 ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected) : null; int radio; if (!int.TryParse(txtRadio.Text, out radio)) { radio = 100; } var tipo = DAOFactory.TipoReferenciaGeograficaDAO.FindById(cbTipoGeoRef.Selected); if (referencia == null) { referencia = new ReferenciaGeografica { Codigo = codigo, Empresa = empresa, Linea = linea, EsFin = tipo.EsFin, EsInicio = tipo.EsInicio, EsIntermedio = tipo.EsIntermedio, Icono = tipo.Icono, InhibeAlarma = tipo.InhibeAlarma, TipoReferenciaGeografica = tipo, Color = tipo.Color }; foreach (TipoReferenciaVelocidad maxima in tipo.VelocidadesMaximas) { referencia.VelocidadesMaximas.Add(new ReferenciaVelocidad { ReferenciaGeografica = referencia, TipoVehiculo = maxima.TipoVehiculo, VelocidadMaxima = maxima.VelocidadMaxima }); } } referencia.Baja = false; referencia.Descripcion = datos.Descripcion.Trim(); referencia.Observaciones = string.Empty; UpdateVigencia(datos, referencia); var dir = new Direccion { Altura = direccion != null ? direccion.Altura : -1, Calle = direccion != null ? direccion.Calle : string.Empty, Descripcion = direccion != null ? direccion.Direccion : string.Empty, IdCalle = direccion != null ? direccion.IdPoligonal : -1, IdEntrecalle = -1, IdEsquina = direccion != null ? direccion.IdEsquina : -1, IdMapa = direccion != null ? (short)direccion.IdMapaUrbano : (short)-1, Latitud = direccion != null ? direccion.Latitud : Convert.ToDouble(datos.Latitud), Longitud = direccion != null ? direccion.Longitud : Convert.ToDouble(datos.Longitud), Pais = "Argentina", Partido = direccion != null ? direccion.Partido : string.Empty, Provincia = direccion != null ? direccion.Provincia : string.Empty, Vigencia = new Vigencia { Inicio = DateTime.Now } }; var pol = new Poligono { Radio = radio, Vigencia = new Vigencia { Inicio = DateTime.Now } }; pol.AddPoints(new[] { new PointF((float)dir.Longitud, (float)dir.Latitud) }); referencia.AddHistoria(dir, pol, DateTime.UtcNow); DAOFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(referencia); STrace.Trace("QtreeReset", "DireccionImport 2"); }
protected override void Import(List <ImportRow> rows) { var empresa = cbEmpresa.Selected > 0 ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected) : null; var linea = cbLinea.Selected > 0 ? DAOFactory.LineaDAO.FindById(cbLinea.Selected) : null; var tipoGeoref = cbTipoGeoRef.Selected > 0 ? DAOFactory.TipoReferenciaGeograficaDAO.FindById(cbTipoGeoRef.Selected) : null; var empresas = new [] { cbEmpresa.Selected }; var lineas = new[] { cbLinea.Selected }; using (var transaction = SmartTransaction.BeginTransaction()) { try { foreach (var row in rows) { var codigo = row.GetString(GetColumnByValue(Fields.Codigo.Value)); var descripcion = IsMapped(Fields.Descripcion.Value) ? row.GetString(GetColumnByValue(Fields.Descripcion.Value)) : codigo; var vigenciaDesde = DateTime.UtcNow; var vigenciaHasta = DateTime.UtcNow.AddDays(1); var longitud = row.GetDouble(GetColumnByValue(Fields.Longitud.Value)); var latitud = row.GetDouble(GetColumnByValue(Fields.Latitud.Value)); var createPuntoEntrega = false; var cliente = DAOFactory.ClienteDAO.GetByCode(empresas, lineas, codigo); if (cliente == null) { cliente = new Cliente { Codigo = codigo.Truncate(32), Empresa = empresa, Linea = linea, Baja = false, Nomenclado = false }; createPuntoEntrega = true; } cliente.Baja = false; cliente.Descripcion = descripcion.Truncate(40); cliente.DescripcionCorta = descripcion.Truncate(17); if (!cliente.Nomenclado) { if (latitud.HasValue && longitud.HasValue) { var geoRef = new ReferenciaGeografica { Codigo = codigo, Empresa = empresa, Linea = linea, EsFin = tipoGeoref.EsFin, EsInicio = tipoGeoref.EsInicio, EsIntermedio = tipoGeoref.EsIntermedio, Icono = tipoGeoref.Icono, InhibeAlarma = tipoGeoref.InhibeAlarma, TipoReferenciaGeografica = tipoGeoref, Color = tipoGeoref.Color, Baja = false, Descripcion = descripcion }; geoRef.Vigencia = new Vigencia { Inicio = vigenciaDesde, Fin = vigenciaHasta }; var dir = new Direccion { Altura = 0, Calle = String.Empty, Descripcion = descripcion, IdCalle = 0, IdEntrecalle = -1, IdEsquina = 0, IdMapa = 0, Latitud = latitud.Value, Longitud = longitud.Value, Pais = "Argentina", Partido = String.Empty, Provincia = String.Empty, Vigencia = new Vigencia { Inicio = DateTime.Now } }; var pol = new Poligono { Radio = 1, Vigencia = new Vigencia { Inicio = DateTime.Now } }; pol.AddPoints(new[] { new PointF((float)longitud.Value, (float)latitud.Value) }); geoRef.AddHistoria(dir, pol, DateTime.UtcNow); DAOFactory.ReferenciaGeograficaDAO.SaveOrUpdate(geoRef); cliente.ReferenciaGeografica = geoRef; } DAOFactory.ClienteDAO.SaveOrUpdate(cliente); } } transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw ex; } } }
private ReferenciaGeografica CreateGeoRef(String codigo, String descripcion, DireccionVO dir, Linea lin, TipoReferenciaGeografica tipoGeoRef) { var posicion = new Direccion { Altura = dir.Altura, IdMapa = (short)dir.IdMapaUrbano, Provincia = dir.Provincia, IdCalle = -1, IdEsquina = dir.IdEsquina, IdEntrecalle = dir.IdEsquina, Latitud = dir.Latitud, Longitud = dir.Longitud, Partido = dir.Partido, Pais = string.Empty, Calle = dir.Calle, Descripcion = dir.Direccion, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new [] { new PointF((float)posicion.Longitud, (float)posicion.Latitud) }); //Constructs the point. var puntoDeInteres = new ReferenciaGeografica { Codigo = codigo, Descripcion = Trunc(descripcion, 128), Empresa = lin.Empresa, Linea = lin, EsFin = tipoGeoRef.EsFin, EsInicio = tipoGeoRef.EsInicio, EsIntermedio = tipoGeoRef.EsIntermedio, InhibeAlarma = tipoGeoRef.InhibeAlarma, TipoReferenciaGeografica = tipoGeoRef, Vigencia = new Vigencia { Inicio = DateTime.UtcNow }, Icono = tipoGeoRef.Icono }; puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DAOFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoDeInteres); STrace.Trace("QtreeReset", "TicketImport"); return(puntoDeInteres); }
/// <summary> /// Saves as geocercas all items read from the specified file. /// </summary> private void ImportGeocercas() { var fileName = string.Concat(Server.MapPath(TmpDir), DateTime.Now.ToString("yyyyMMdd-HHmmss"), ".xml"); try { fuImportData.SaveAs(fileName); var tipoGeocerca = DAOFactory.TipoReferenciaGeograficaDAO.FindById(ddlTipoGeocerca.Selected); var linea = DAOFactory.LineaDAO.FindById(ddlBaseGeocerca.Selected); var kml = XDocument.Load(fileName); /* Debo obtener el namspace */ XNamespace ns = "http://earth.google.com/kml/2.2"; var features = from feature in kml.Descendants(ns + "Placemark") select feature; foreach (var feature in features) { var descriptionNode = feature.Descendants(ns + "description").FirstOrDefault(); if (descriptionNode == null) { descriptionNode = feature.Descendants(ns + "SimpleData").FirstOrDefault(x => x.Attribute("name") != null && x.Attribute("name").Value == "description"); } var descripcion = descriptionNode == null? "N/D" : descriptionNode.Value; var poligono = feature.Descendants(ns + "Polygon").First(); var area = ((XElement)poligono.Descendants(ns + "LinearRing").First().FirstNode).Value.Replace("\r", "").Replace("\n", "").Replace("\t", ""); var puntos = (from punto in area.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) select new PointF { X = (float)Convert.ToDouble(punto.Split(',')[0], CultureInfo.InvariantCulture), Y = (float)Convert.ToDouble(punto.Split(',')[1], CultureInfo.InvariantCulture) }).ToList(); var geocerca = new ReferenciaGeografica { Codigo = Guid.NewGuid().ToString("N"), Descripcion = descripcion, Color = tipoGeocerca.Color, EsFin = tipoGeocerca.EsFin, EsInicio = tipoGeocerca.EsInicio, EsIntermedio = tipoGeocerca.EsIntermedio, InhibeAlarma = tipoGeocerca.InhibeAlarma, Empresa = linea.Empresa, Linea = linea, TipoReferenciaGeografica = tipoGeocerca, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; var points = new Poligono(); points.AddPoints(puntos.Count > 100 ? Poligono.Reduce(puntos) : puntos); geocerca.Historia.Add( new HistoriaGeoRef { ReferenciaGeografica = geocerca, Poligono = points, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } } ); DAOFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(geocerca); STrace.Trace("QtreeReset", "ImportData 1"); } infoLabel1.Mode = InfoLabelMode.INFO; infoLabel1.Text = CultureManager.GetSystemMessage(PoiImportOk); } catch (Exception e) { ShowError(e); } finally { File.Delete(fileName); } }
protected void BtnAsociarClick(object sender, EventArgs e) { var puntos = new List <PuntoEntrega>(); foreach (C1GridViewRow row in gridEntregas.Rows) { if (row.RowType == C1GridViewRowType.DataRow) { var chk = row.Cells[5].Controls[0] as CheckBox; if (chk != null && chk.Checked) { int idEntrega; var id = row.Attributes["idEntrega"]; if (int.TryParse(id, out idEntrega)) { var entrega = DAOFactory.EntregaDistribucionDAO.FindById(idEntrega); if (entrega != null && entrega.PuntoEntrega != null) { puntos.Add(entrega.PuntoEntrega); } } chk.Checked = false; row.Cells[5].Controls.Clear(); row.Cells[5].Controls.Add(chk); } } } if (puntos.Any()) { var primerEntrega = puntos.First(); var nombre = txtNombre.Text.Trim(); var codigo = nombre != string.Empty ? nombre : primerEntrega.Codigo; var descripcion = nombre != string.Empty ? nombre : primerEntrega.Descripcion; int radio; if (!int.TryParse(txtRadio.Text.Trim(), out radio)) { radio = 50; } var utcNow = DateTime.UtcNow; var nuevaReferencia = new ReferenciaGeografica { Codigo = codigo, Descripcion = descripcion, Empresa = primerEntrega.Cliente.Empresa, Linea = primerEntrega.Cliente.Linea, Icono = primerEntrega.ReferenciaGeografica.Icono, IgnoraLogiclink = true, TipoReferenciaGeografica = primerEntrega.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = utcNow }, Color = primerEntrega.ReferenciaGeografica.Color }; var direccion = GetNewDireccion(Evento.Latitud, Evento.Longitud); var poligono = new Poligono { Radio = radio, Vigencia = new Vigencia { Inicio = utcNow } }; poligono.AddPoints(new[] { new PointF((float)Evento.Longitud, (float)Evento.Latitud) }); nuevaReferencia.AddHistoria(direccion, poligono, utcNow); DAOFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(nuevaReferencia); STrace.Trace("QtreeReset", "InfoDetencion 1"); foreach (var punto in puntos) { punto.ReferenciaGeografica.Direccion.Vigencia.Fin = utcNow; punto.ReferenciaGeografica.Poligono.Vigencia.Fin = utcNow; punto.ReferenciaGeografica.Vigencia.Fin = utcNow; DAOFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(punto.ReferenciaGeografica); STrace.Trace("QtreeReset", "InfoDetencion 2"); punto.ReferenciaGeografica = nuevaReferencia; DAOFactory.PuntoEntregaDAO.SaveOrUpdate(punto); } } lblAsociados.Visible = true; }
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 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); }
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); }
/// <summary> /// Saves the Direccion /// </summary> protected override void OnSave() { EditObject.Linea = cbLinea.Selected > 0 ? DAOFactory.LineaDAO.FindById(cbLinea.Selected) : null; EditObject.Empresa = EditObject.Linea != null ? EditObject.Linea.Empresa : cbEmpresa.Selected > 0 ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected) : null; EditObject.TipoReferenciaGeografica = DAOFactory.TipoReferenciaGeograficaDAO.FindById(cbTipoReferenciaGeografica.Selected); EditObject.Descripcion = txtDescripcion.Text.Trim(); EditObject.Codigo = txtCodigo.Text.Trim(); EditObject.Observaciones = txtObservaciones.Text.Trim(); EditObject.Icono = SelectIcon2.Selected > 0 ? DAOFactory.IconoDAO.FindById(SelectIcon2.Selected) : null; EditObject.Color.HexValue = cpColor.Color; EditObject.InhibeAlarma = chkInhibeAlarma.Checked; EditObject.EsInicio = chkInicio.Checked; EditObject.EsIntermedio = chkIntermedio.Checked; EditObject.EsFin = chkFin.Checked; EditObject.IgnoraLogiclink = chkIgnoraLogiclink.Checked; if (EditObject.Vigencia == null) { EditObject.Vigencia = new Vigencia(); } EditObject.Vigencia.Inicio = txtFechaDesde.SelectedDate.HasValue ? txtFechaDesde.SelectedDate.Value.ToDataBaseDateTime() : DateTime.UtcNow; EditObject.Vigencia.Fin = txtFechaHasta.SelectedDate.HasValue ? (DateTime?)txtFechaHasta.SelectedDate.Value.ToDataBaseDateTime() : null; var lastDir = EditObject.Direccion; var newDir = EditGeoRef1.Direccion; var lastPol = EditObject.Poligono; var newPol = EditGeoRef1.Poligono; var now = txtVigenciaDesde.SelectedDate.HasValue ? txtVigenciaDesde.SelectedDate.Value.ToDataBaseDateTime() : DateTime.UtcNow; var changedDir = lastDir == null ? newDir != null : !lastDir.Equals(newDir); var changedPol = lastPol == null ? newPol != null : !lastPol.Equals(newPol); if (changedDir || changedPol) { if (lastPol != null && lastPol.Vigencia == null) { lastPol.Vigencia = new Vigencia(); } if (lastDir != null && lastDir.Vigencia == null) { lastDir.Vigencia = new Vigencia(); } if (changedPol && lastPol != null) { lastPol.Vigencia.Fin = now; } if (changedDir && lastDir != null) { lastDir.Vigencia.Fin = now; } if (changedDir && EditObject.Direccion != null) { if (EditObject.Direccion.Vigencia == null) { EditObject.Direccion.Vigencia = new Vigencia(); } EditObject.Direccion.Vigencia.Fin = now; } if (changedPol && EditObject.Poligono != null) { if (EditObject.Poligono.Vigencia == null) { EditObject.Poligono.Vigencia = new Vigencia(); } EditObject.Poligono.Vigencia.Fin = now; } var newDireccion = EditObject.Direccion; var newPoligono = EditObject.Poligono; if (changedDir) { if (newDir == null) { newDireccion = null; } else { newDireccion = new Direccion { Vigencia = new Vigencia { Inicio = now } }; newDireccion.CloneData(newDir); } } if (changedPol) { if (newPol == null) { newPoligono = null; } else { newPoligono = new Poligono { Vigencia = new Vigencia { Inicio = now } }; newPoligono.AddPoints(newPol.ToPointFList()); newPoligono.Radio = newPol.Radio; } } EditObject.AddHistoria(newDireccion, newPoligono, now); } if (EditObject.TipoReferenciaGeografica.ControlaVelocidad) { AddSpeedLimits(); } DAOFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(EditObject); STrace.Trace("QtreeReset", "GeoRefAlta"); }
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); }
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 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 Import(List <ImportRow> rows) { var empresa = cbEmpresa.Selected > 0 ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected) : null; var linea = cbLinea.Selected > 0 ? DAOFactory.LineaDAO.FindById(cbLinea.Selected) : null; var tipoReferenciaDefault = cbTipoGeoRef.Selected > 0 ? DAOFactory.TipoReferenciaGeograficaDAO.FindById(cbTipoGeoRef.Selected) : null; var empresas = new [] { cbEmpresa.Selected }; var lineas = new[] { cbLinea.Selected }; using (var transaction = SmartTransaction.BeginTransaction()) { var list = new List <ReferenciaGeografica>(rows.Count); foreach (var row in rows) { var codigo = row.GetString(GetColumnByValue(Fields.Codigo.Value)); var descripcion = IsMapped(Fields.Descripcion.Value) ? row.GetString(GetColumnByValue(Fields.Descripcion.Value)) : codigo; var direccion = row.GetString(GetColumnByValue(Fields.Direccion.Value)); var calle = row.GetString(GetColumnByValue(Fields.Calle.Value)); var altura = row.GetInt32(GetColumnByValue(Fields.Altura.Value)); var esquina = row.GetString(GetColumnByValue(Fields.Esquina.Value)); var partido = row.GetString(GetColumnByValue(Fields.Partido.Value)); var provincia = row.GetString(GetColumnByValue(Fields.Provincia.Value)); var vigenciaDesde = row.GetDateTime(GetColumnByValue(Fields.VigenciaDesde.Value)); var vigenciaHasta = row.GetDateTime(GetColumnByValue(Fields.VigenciaHasta.Value)); var longitud = row.GetDouble(GetColumnByValue(Fields.Longitud.Value)); var latitud = row.GetDouble(GetColumnByValue(Fields.Latitud.Value)); var tipoGeoref = row.GetString(GetColumnByValue(Fields.TipoGeoRef.Value)); var tipoReferencia = tipoReferenciaDefault; if (!string.IsNullOrEmpty(tipoGeoref)) { DAOFactory.TipoReferenciaGeograficaDAO.GetByCodigo(empresas, lineas, tipoGeoref); } if (tipoReferencia == null) { throw new ApplicationException("Tipo de Referencia Geografica invalido"); } var geoRef = DAOFactory.ReferenciaGeograficaDAO.GetByCodigo(empresas, lineas, new[] { tipoReferencia.Id }, codigo); var nomenclar = geoRef == null || geoRef.Direccion == null; if (geoRef == null) { geoRef = new ReferenciaGeografica { Codigo = codigo, Empresa = empresa, Linea = linea, EsFin = tipoReferencia.EsFin, EsInicio = tipoReferencia.EsInicio, EsIntermedio = tipoReferencia.EsIntermedio, Icono = tipoReferencia.Icono, InhibeAlarma = tipoReferencia.InhibeAlarma, TipoReferenciaGeografica = tipoReferencia, Color = tipoReferencia.Color }; foreach (TipoReferenciaVelocidad maxima in tipoReferencia.VelocidadesMaximas) { geoRef.VelocidadesMaximas.Add(new ReferenciaVelocidad { ReferenciaGeografica = geoRef, TipoVehiculo = maxima.TipoVehiculo, VelocidadMaxima = maxima.VelocidadMaxima }); } } geoRef.Baja = false; geoRef.Descripcion = descripcion; geoRef.Observaciones = string.Empty; if (vigenciaDesde.HasValue && vigenciaDesde.Value.Equals(vigenciaHasta.Value)) { vigenciaDesde = new DateTime(vigenciaDesde.Value.Year, vigenciaDesde.Value.Month, vigenciaDesde.Value.Day, 0, 0, 0); vigenciaHasta = new DateTime(vigenciaDesde.Value.Year, vigenciaDesde.Value.Month, vigenciaDesde.Value.Day, 23, 59, 59); } UpdateVigencia(geoRef, vigenciaDesde, vigenciaHasta); if (nomenclar) { IList <DireccionVO> nomencladas; if (latitud.HasValue && longitud.HasValue) { nomencladas = new List <DireccionVO> { GeocoderHelper.GetEsquinaMasCercana(latitud.Value, longitud.Value) }; NomenclarByLatLon(latitud.Value, longitud.Value); } else if (!string.IsNullOrEmpty(calle) && (!string.IsNullOrEmpty(esquina) || altura.HasValue) && (!string.IsNullOrEmpty(partido) || !string.IsNullOrEmpty(provincia))) { nomencladas = NomenclarByCalle(calle, altura.HasValue ? altura.Value : -1, esquina, partido, provincia); } else if (!string.IsNullOrEmpty(direccion)) { nomencladas = NomenclarByDireccion(direccion); } else { nomencladas = new List <DireccionVO>(0); } if (nomencladas.Count == 1) { var direccionNomenclada = nomencladas[0]; var dir = new Direccion { Altura = direccionNomenclada.Altura, Calle = direccionNomenclada.Calle, Descripcion = direccionNomenclada.Direccion, IdCalle = direccionNomenclada.IdPoligonal, IdEntrecalle = -1, IdEsquina = direccionNomenclada.IdEsquina, IdMapa = (short)direccionNomenclada.IdMapaUrbano, Latitud = direccionNomenclada.Latitud, Longitud = direccionNomenclada.Longitud, Pais = "Argentina", Partido = direccionNomenclada.Partido, Provincia = direccionNomenclada.Provincia, Vigencia = new Vigencia { Inicio = DateTime.Now } }; var pol = new Poligono { Radio = 100, Vigencia = new Vigencia { Inicio = DateTime.Now } }; pol.AddPoints(new[] { new PointF((float)direccionNomenclada.Longitud, (float)direccionNomenclada.Latitud) }); geoRef.AddHistoria(dir, pol, DateTime.UtcNow); } } list.Add(geoRef); } foreach (var geoRef in list) { DAOFactory.ReferenciaGeograficaDAO.SaveOrUpdate(geoRef); AddReferenciasGeograficas(geoRef); } transaction.Commit(); DAOFactory.ReferenciaGeograficaDAO.UpdateGeocercas(_empresasLineas); } }
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 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 ReferenciaGeografica GetNewGeoRefference() { if (!EditMode) { EditObject.Linea = IdLinea > 0 ? DAOFactory.LineaDAO.FindById(IdLinea) : null; EditObject.Empresa = EditObject.Linea != null ? EditObject.Linea.Empresa : IdEmpresa > 0 ? DAOFactory.EmpresaDAO.FindById(IdEmpresa) : null; } EditObject.TipoReferenciaGeografica = DAOFactory.TipoReferenciaGeograficaDAO.FindById(cbTipoReferenciaGeografica.Selected); if (!EditMode) { EditObject.Descripcion = EditGeoRef1.Direccion != null ? EditGeoRef1.Direccion.Descripcion : "Sin Descripcion"; } EditObject.Icono = IconId > 0 ? DAOFactory.IconoDAO.FindById(IconId) : null; EditObject.Color.HexValue = Color; EditObject.InhibeAlarma = EditObject.TipoReferenciaGeografica.InhibeAlarma; EditObject.EsInicio = EditObject.TipoReferenciaGeografica.EsInicio; EditObject.EsIntermedio = EditObject.TipoReferenciaGeografica.EsIntermedio; EditObject.EsFin = EditObject.TipoReferenciaGeografica.EsFin; var lastDir = EditObject.Direccion; var newDir = EditGeoRef1.Direccion; var lastPol = EditObject.Poligono; var newPol = EditGeoRef1.Poligono; var now = txtVigenciaDesde.SelectedDate.HasValue ? txtVigenciaDesde.SelectedDate.Value : DateTime.UtcNow; var ChangedPolygon = EditObject.Poligono == null ? EditGeoRef1.Poligono != null : !EditObject.Poligono.Equals(EditGeoRef1.Poligono); var ChangedDireccion = EditObject.Direccion == null ? EditGeoRef1.Direccion != null : !EditObject.Direccion.Equals(EditGeoRef1.Direccion); if (ChangedDireccion || ChangedPolygon) { if (lastPol != null && lastPol.Vigencia == null) { lastPol.Vigencia = new Vigencia(); } if (lastDir != null && lastDir.Vigencia == null) { lastDir.Vigencia = new Vigencia(); } if (ChangedPolygon && lastPol != null) { lastPol.Vigencia.Fin = now; } if (ChangedDireccion && lastDir != null) { lastDir.Vigencia.Fin = now; } var hist = EditObject.GetHistoria(now); if (hist != null && hist.Vigencia == null) { hist.Vigencia = new Vigencia(); } if (hist != null) { hist.Vigencia.Fin = now; } if (ChangedDireccion && EditObject.Direccion != null) { if (EditObject.Direccion.Vigencia == null) { EditObject.Direccion.Vigencia = new Vigencia(); } EditObject.Direccion.Vigencia.Fin = now; } if (ChangedPolygon && EditObject.Poligono != null) { if (EditObject.Poligono.Vigencia == null) { EditObject.Poligono.Vigencia = new Vigencia(); } EditObject.Poligono.Vigencia.Fin = now; } var newDireccion = EditObject.Direccion; var newPoligono = EditObject.Poligono; if (ChangedDireccion) { if (newDir == null) { newDireccion = null; } else { newDireccion = new Direccion { Vigencia = new Vigencia { Inicio = now } }; newDireccion.CloneData(newDir); } } if (ChangedPolygon) { if (newPol == null) { newPoligono = null; } else { newPoligono = new Poligono { Vigencia = new Vigencia { Inicio = now } }; newPoligono.AddPoints(newPol.ToPointFList()); newPoligono.Radio = newPol.Radio; } } if (newDireccion == null && newPoligono == null) { return(null); } EditObject.AddHistoria(newDireccion, newPoligono, now); } else if (EditObject.Direccion == null && EditObject.Poligono == null) { return(null); } if (EditObject.TipoReferenciaGeografica.ControlaVelocidad) { EditObject.VelocidadesMaximas.Clear(); foreach (TipoReferenciaVelocidad maxima in EditObject.TipoReferenciaGeografica.VelocidadesMaximas) { var gv = new ReferenciaVelocidad { ReferenciaGeografica = EditObject, TipoVehiculo = maxima.TipoVehiculo, VelocidadMaxima = maxima.VelocidadMaxima }; EditObject.VelocidadesMaximas.Add(gv); } } return(EditObject); }
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)); }
protected override void Import(List <ImportRow> rows) { var empresa = cbEmpresa.Selected > 0 ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected) : null; var linea = cbLinea.Selected > 0 ? DAOFactory.LineaDAO.FindById(cbLinea.Selected) : null; var tipoReferenciaDefault = cbTipoGeoRef.Selected > 0 ? DAOFactory.TipoReferenciaGeograficaDAO.FindById(cbTipoGeoRef.Selected) : null; var empresas = new [] { cbEmpresa.Selected }; var lineas = new[] { cbLinea.Selected }; using (var transaction = SmartTransaction.BeginTransaction()) { try { foreach (var row in rows) { var tipoCliente = row.GetString(GetColumnByValue(Fields.TipoCliente.Value)); var cliente = DAOFactory.ClienteDAO.FindByDescripcion(new[] { empresa.Id }, new[] { -1 }, tipoCliente); var codigo = row.GetString(GetColumnByValue(Fields.Codigo.Value)); var pto = DAOFactory.PuntoEntregaDAO.FindByCode(new[] { cliente.Empresa.Id }, new[] { cliente.Linea != null ? cliente.Linea.Id : -1 }, new[] { cliente.Id }, codigo); if (pto == null) { var descripcion = IsMapped(Fields.Descripcion.Value) ? row.GetString(GetColumnByValue(Fields.Descripcion.Value)) : codigo; var longitud = row.GetDouble(GetColumnByValue(Fields.Longitud.Value)); var latitud = row.GetDouble(GetColumnByValue(Fields.Latitud.Value)); var vigenciaDesde = DateTime.Now; var direccionNomenclada = row.GetString(GetColumnByValue(Fields.Direccion.Value)); var geoRef = new ReferenciaGeografica(); var telefono = ""; var tipoReferencia = tipoReferenciaDefault; if (tipoReferencia == null) { throw new ApplicationException("Tipo de Referencia Geográfica inválido"); } if (latitud.HasValue && longitud.HasValue) { if (direccionNomenclada == null) { direccionNomenclada = string.Format("({0}, {1})", latitud.Value, longitud.Value); } geoRef = GetReferenciaGeografica(tipoReferencia, null, empresa, linea, codigo, descripcion, vigenciaDesde, null, latitud.Value, longitud.Value); } pto = CreatePuntoEntrega(cliente, codigo, descripcion, telefono, geoRef); } else { var descripcion = IsMapped(Fields.Descripcion.Value) ? row.GetString(GetColumnByValue(Fields.Descripcion.Value)) : codigo; var longitud = row.GetDouble(GetColumnByValue(Fields.Longitud.Value)); var latitud = row.GetDouble(GetColumnByValue(Fields.Latitud.Value)); pto.Descripcion = descripcion; pto.Nombre = descripcion; if (pto.ReferenciaGeografica.Latitude != latitud || pto.ReferenciaGeografica.Longitude != longitud) { pto.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; pto.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; #region var posicion = new Direccion() var direccion = GeocoderHelper.GetEsquinaMasCercana(latitud.Value, longitud.Value); var posicion = new Direccion { Altura = direccion != null ? direccion.Altura : -1, IdMapa = (short)(direccion != null ? direccion.IdMapaUrbano : -1), Provincia = direccion != null ? direccion.Provincia : string.Empty, IdCalle = direccion != null ? direccion.IdPoligonal : -1, IdEsquina = direccion != null ? direccion.IdEsquina : -1, IdEntrecalle = -1, Latitud = latitud.Value, Longitud = longitud.Value, Partido = direccion != null ? direccion.Partido : string.Empty, Pais = string.Empty, Calle = direccion != null ? direccion.Calle : string.Empty, Descripcion = direccion != null ? direccion.Direccion : string.Format("({0}, {1})", latitud.Value.ToString(CultureInfo.InvariantCulture), longitud.Value.ToString(CultureInfo.InvariantCulture)), Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; #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 pto.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); DAOFactory.ReferenciaGeograficaDAO.SaveOrUpdate(pto.ReferenciaGeografica); } } DAOFactory.PuntoEntregaDAO.SaveOrUpdate(pto); } transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw ex; } } }
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)); }