Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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");
        }
Пример #6
0
        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;
                }
            }
        }
Пример #7
0
        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);
        }
Пример #8
0
        /// <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); }
        }
Пример #9
0
        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;
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        /// <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);
        }
Пример #15
0
        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);
        }
Пример #16
0
        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);
        }
Пример #17
0
        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);
            }
        }
Пример #18
0
        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);
        }
Пример #19
0
        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));
        }
Пример #20
0
        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);
        }
Пример #21
0
        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));
        }
Пример #22
0
        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;
                }
            }
        }
Пример #23
0
        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));
        }