Exemplo n.º 1
0
        private static string GetPuntoEntregaPopupContent(PuntoEntrega punto)
        {
            const string html = @"<table><tr><td><img src=""{0}"" /></td><td>"
                                + @"<div style=""font-size: 9px; color: #CCCCCC"">{1}</div>"
                                + @"<div style=""font-size: 12px;""><b>{2}</b> ({3})</div>"
                                + @"</td></tr></table><hr />"
                                + "{4}: {5}<br/>{6}<br/>{7}<br/>{8}<br/>{9}";

            var icon = punto.ReferenciaGeografica.Icono != null
                            ? punto.ReferenciaGeografica.Icono.PathIcono
                            : punto.ReferenciaGeografica.TipoReferenciaGeografica.Icono != null
                                ? punto.ReferenciaGeografica.TipoReferenciaGeografica.Icono.PathIcono
                                : string.Empty;

            return(string.Format(html,
                                 IconDir + icon,
                                 CultureManager.GetEntity("PARENTI44"),
                                 punto.Descripcion,
                                 punto.Codigo,
                                 CultureManager.GetEntity("CLIENT"),
                                 punto.Cliente.Descripcion,
                                 punto.ReferenciaGeografica.Descripcion,
                                 punto.Comentario1,
                                 punto.Comentario2,
                                 punto.Comentario3));
        }
Exemplo n.º 2
0
        private Intercalado CalcularDirections(Intercalado intercalado, PuntoEntrega nuevoPunto)
        {
            var i = CalcularDirectionsOriginal(intercalado);

            i = CalcularDirectionsIntercalado(i, nuevoPunto);
            return(i);
        }
Exemplo n.º 3
0
        public void CalcularCostos(PuntoEntrega nuevoPunto, int radio)
        {
            if (Viajes == null)
            {
                throw new ApplicationException("Antes de intercalar hay que cargar los datos con el método Load");
            }

            var cercanos = Viajes.Where(v => v.Detalles.Any(
                                            d => Distancias.Loxodromica(d.ReferenciaGeografica.Latitude,
                                                                        d.ReferenciaGeografica.Longitude,
                                                                        nuevoPunto.ReferenciaGeografica.Latitude,
                                                                        nuevoPunto.ReferenciaGeografica.Longitude) <= radio));

            var result = cercanos.Select(c => CalcularIntercalado(c, nuevoPunto))
                         .OrderBy(i => i.CostoKmExtra);

            var inter = new List <Intercalado>();

            foreach (var intercalado in result)
            {
                var i = CalcularDirections(intercalado, nuevoPunto);
                if (IsInHoras(i))
                {
                    inter.Add(i);
                }
                if (inter.Count > 5)
                {
                    break;
                }
            }
            Intercalados = inter.OrderBy(i => i.CostoKmExtra).ToList();
        }
Exemplo n.º 4
0
 public PuntoEntregaVo(PuntoEntrega puntoEntrega)
 {
     Id              = puntoEntrega.Id;
     Codigo          = puntoEntrega.Codigo;
     Descripcion     = puntoEntrega.Descripcion;
     Nomenclado      = puntoEntrega.Nomenclado;
     ClienteDelPunto = puntoEntrega.Cliente.Descripcion;
 }
Exemplo n.º 5
0
        private Intercalado CalcularIntercalado(ViajeDistribucion viaje, PuntoEntrega nuevoPunto)
        {
            var alPunto = viaje.Detalles.Select(e => Distancias.Loxodromica(e.ReferenciaGeografica.Latitude,
                                                                            e.ReferenciaGeografica.Longitude,
                                                                            nuevoPunto.ReferenciaGeografica.Latitude,
                                                                            nuevoPunto.ReferenciaGeografica.Longitude)).ToArray();
            var deViaje = new List <double>();

            for (int i = 1; i < viaje.EntregasTotalCountConBases; i++)
            {
                var e         = viaje.Detalles[i];
                var p         = viaje.Detalles[i - 1];
                var distancia = Distancias.Loxodromica(p.ReferenciaGeografica.Latitude,
                                                       p.ReferenciaGeografica.Longitude,
                                                       e.ReferenciaGeografica.Latitude,
                                                       e.ReferenciaGeografica.Longitude);
                deViaje.Add(distancia);
            }

            var costoTotal = deViaje.Any() ? deViaje.Sum() : 0;

            var menorCosto = double.MaxValue;
            var posicion   = 0;

            for (var i = 0; i <= viaje.EntregasTotalCountConBases; i++)
            {
                var costo = 0.0;
                if (i == 0)
                {
                    costo += costoTotal;
                    costo += alPunto[0];
                }
                else if (i == viaje.EntregasTotalCountConBases)
                {
                    costo += costoTotal;
                    costo += alPunto[viaje.EntregasTotalCountConBases - 1];
                }
                else
                {
                    costo  = costoTotal - deViaje[i - 1];
                    costo += alPunto[i - 1];
                    costo += alPunto[i];
                }

                if (costo < menorCosto)
                {
                    menorCosto = costo;
                    posicion   = i;
                }
            }
            return(new Intercalado {
                Id = viaje.Id, Index = posicion, CostoKm = menorCosto, CostoKmOld = costoTotal
            });
        }
Exemplo n.º 6
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);
        }
Exemplo n.º 7
0
        private PuntoEntrega CreatePuntoEntrega(Cliente cliente, string codigo, string descripcion, string telefono, ReferenciaGeografica rg)
        {
            var pto = new PuntoEntrega();

            pto.Cliente              = cliente;
            pto.Codigo               = codigo;
            pto.Descripcion          = descripcion;
            pto.Baja                 = false;
            pto.ReferenciaGeografica = rg;
            pto.Nomenclado           = true;
            pto.Nombre               = descripcion;

            return(pto);
        }
Exemplo n.º 8
0
        private void CreatePuntoEntrega(Cliente cliente)
        {
            var punto = new PuntoEntrega
            {
                Cliente              = cliente,
                Codigo               = cliente.Codigo.Truncate(32),
                Descripcion          = cliente.Descripcion.Truncate(40),
                Telefono             = cliente.Telefono,
                Baja                 = false,
                ReferenciaGeografica = cliente.ReferenciaGeografica,
                Nomenclado           = cliente.Nomenclado,
                DireccionNomenclada  = cliente.DireccionNomenclada
            };

            DAOFactory.PuntoEntregaDAO.SaveOrUpdate(punto);
        }
Exemplo n.º 9
0
        private static PuntoEntrega CreatePuntoEntrega(Cliente cliente, string codigo, string descripcion, string telefono, ReferenciaGeografica rg,
                                                       string direccion, string comentario1, string comentario2, string comentario3)
        {
            var punto = new PuntoEntrega
            {
                Cliente              = cliente,
                Codigo               = codigo.Truncate(32),
                Descripcion          = descripcion.Truncate(40),
                Telefono             = telefono,
                Baja                 = false,
                ReferenciaGeografica = rg,
                Nomenclado           = true,
                DireccionNomenclada  = direccion,
                Comentario1          = comentario1,
                Comentario2          = comentario2,
                Comentario3          = comentario3
            };

            return(punto);
        }
Exemplo n.º 10
0
        public Intercalado CambiarIndice(int idViaje, PuntoEntrega nuevoPunto, int nuevoIndice)
        {
            var viaje = Viajes.FirstOrDefault(v => v.Id == idViaje);

            if (viaje == null)
            {
                return(null);
            }

            var intercalado = Intercalados.FirstOrDefault(i => i.Id == idViaje);

            if (intercalado == null)
            {
                return(null);
            }

            intercalado.Index = nuevoIndice;
            CalcularDirectionsIntercalado(intercalado, nuevoPunto);

            return(intercalado);
        }
Exemplo n.º 11
0
        private PuntoEntrega CreatePtoDeEntrega(ImportTicket ticketInfo, Cliente cliente)
        {
            var poi = ticketInfo.DireccionPtoDeEntrega + ", " + ticketInfo.LocalidadPtoDeEntrega;

            bool nomenclado;
            var  puntoDeInteres = GetGeoRef(poi, ddlTipoGeoRefPtoInteres, cliente.Codigo + "_" + ticketInfo.CodigoPtoDeEntrega, ticketInfo.DescripcionPtoDeEntrega, cliente.Linea, out nomenclado);

            var pto = new PuntoEntrega
            {
                Cliente              = cliente,
                Codigo               = Trunc(ticketInfo.CodigoPtoDeEntrega, 32),
                Descripcion          = Trunc(ticketInfo.DescripcionPtoDeEntrega, 40),
                Telefono             = "",
                Baja                 = false,
                ReferenciaGeografica = puntoDeInteres,
                Nomenclado           = nomenclado,
                DireccionNomenclada  = Trunc(poi, 255)
            };

            DAOFactory.PuntoEntregaDAO.SaveOrUpdate(pto);
            return(pto);
        }
Exemplo n.º 12
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);
        }
Exemplo n.º 13
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));
        }
Exemplo n.º 14
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);
        }
Exemplo n.º 15
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);
        }
Exemplo n.º 16
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);
            }
        }
Exemplo n.º 17
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);
        }
Exemplo n.º 18
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));
        }
Exemplo n.º 19
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));
        }
Exemplo n.º 20
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);
        }
Exemplo n.º 21
0
        protected override void OnSave()
        {
            EditObject.Linea   = cbLinea.Selected > 0 ? DAOFactory.LineaDAO.FindById(cbLinea.Selected) : null;
            EditObject.Empresa = cbEmpresa.Selected > 0
                                     ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected)
                                     : EditObject.Linea != null ? EditObject.Linea.Empresa : null;
            EditObject.Codigo           = txtCodigo.Text;
            EditObject.Descripcion      = txtDescripcion.Text;
            EditObject.DescripcionCorta = txtDescripcionCorta.Text;
            EditObject.Telefono         = txtTelefono.Text;

            EditObject.Comentario1 = txtComentario1.Text;
            EditObject.Comentario2 = txtComentario2.Text;
            EditObject.Comentario3 = txtComentario3.Text;

            if (chkExistente.Checked)
            {
                EditObject.ReferenciaGeografica = SelectGeoRef1.Selected > 0 ? DAOFactory.ReferenciaGeograficaDAO.FindById(SelectGeoRef1.Selected) : null;
            }
            else
            {
                if (!EditMode || !EditObject.Nomenclado)
                {
                    EditObject.ReferenciaGeografica = EditEntityGeoRef1.GetNewGeoRefference();
                }
                EditObject.ReferenciaGeografica.Empresa     = EditObject.Empresa;
                EditObject.ReferenciaGeografica.Linea       = EditObject.Linea;
                EditObject.ReferenciaGeografica.Descripcion = EditObject.Descripcion;

                var code = EditObject.Codigo;
                var i    = 1;


                var byCode = DAOFactory.ReferenciaGeograficaDAO.FindByCodigoStartWith(cbEmpresa.SelectedValues,
                                                                                      cbLinea.SelectedValues,
                                                                                      new[]
                {
                    EditEntityGeoRef1.
                    TipoReferenciaGeograficaId
                }, code);

                while (byCode.Any(r => r.Codigo == code && EditObject.ReferenciaGeografica.Id != r.Id))
                {
                    code += "(" + i++ + ")";
                }

                EditObject.ReferenciaGeografica.Codigo = code;
                EditObject.ReferenciaGeografica.TipoReferenciaGeografica = DAOFactory.TipoReferenciaGeograficaDAO.FindById(EditEntityGeoRef1.TipoReferenciaGeograficaId);
                DAOFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(EditObject.ReferenciaGeografica);
                STrace.Trace("QtreeReset", "ClienteAlta");
            }
            EditObject.Nomenclado = true;

            DAOFactory.ClienteDAO.SaveOrUpdate(EditObject);

            if (EditMode)
            {
                return;
            }

            var puntoEntrega = new PuntoEntrega
            {
                Cliente              = EditObject,
                Baja                 = false,
                Codigo               = EditObject.Codigo,
                Descripcion          = EditObject.Descripcion,
                ReferenciaGeografica = EditObject.ReferenciaGeografica,
                Telefono             = EditObject.Telefono
            };

            DAOFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega);
        }
Exemplo n.º 22
0
        private Intercalado CalcularDirectionsIntercalado(Intercalado intercalado, PuntoEntrega nuevoPunto)
        {
            var viaje = Viajes.FirstOrDefault(v => v.Id == intercalado.Id);

            var first  = viaje.Detalles.First().ReferenciaGeografica;
            var origen = new LatLon(first.Latitude, first.Longitude);

            var last    = viaje.Detalles.Last().ReferenciaGeografica;
            var destino = new LatLon(last.Latitude, last.Longitude);

            var waypoints = viaje.Detalles.Skip(1).Take(viaje.Detalles.Count - 2).Select(w => new LatLon(w.ReferenciaGeografica.Latitude, w.ReferenciaGeografica.Longitude)).ToList();

            var nuevaLatLon = new LatLon(nuevoPunto.ReferenciaGeografica.Latitude,
                                         nuevoPunto.ReferenciaGeografica.Longitude);

            if (intercalado.Index == 0)
            {
                waypoints.Insert(0, origen);
                origen = nuevaLatLon;
            }
            else if (intercalado.Index >= viaje.Detalles.Count)
            {
                waypoints.Add(destino);
                destino = nuevaLatLon;
            }
            else if (intercalado.Index == viaje.Detalles.Count - 1)
            {
                waypoints.Add(nuevaLatLon);
            }
            else
            {
                waypoints.Insert(intercalado.Index, nuevaLatLon);
            }

            var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving,
                                                            string.Empty, waypoints.ToArray());

            intercalado.ViajeIntercalado = directions;
            if (directions != null)
            {
                intercalado.CostoKm = directions.Distance;
            }

            var nuevoDetalle = new EntregaDistribucion
            {
                PuntoEntrega = nuevoPunto,
                Cliente      = nuevoPunto.Cliente,
                Descripcion  = nuevoPunto.Descripcion
            };

            viaje.InsertarEntrega(intercalado.Index, nuevoDetalle);
            if (intercalado.Index > 0)
            {
                viaje.CalcularHorario(intercalado.Index, intercalado.ViajeIntercalado);
            }
            if (intercalado.Index < viaje.Detalles.Count)
            {
                viaje.CalcularHorario(intercalado.Index, intercalado.ViajeIntercalado);
            }

            var duracionNueva = viaje.Detalles.Last().Programado.Subtract(viaje.Detalles.First().Programado);

            intercalado.CostoMin = duracionNueva.TotalMinutes;

            intercalado.Hora = nuevoDetalle.Programado;

            viaje.RemoverEntrega(intercalado.Index);

            return(intercalado);
        }
        public String CrearViajeDistribucion(
            String DistritoCodigo,
            String BaseLineaCodigo,
            String CodigoViajeUnico,
            String[] CodigoclienteOrigen,
            String[] NombreClienteOrigen,
            String[] CodigoSubclienteOrigen,
            String[] NombreSubclienteOrigen,
            String[] GeoposicionSubclienteOrigen,
            String FechaYHoraDePosicionamiento,
            String DominioVehiculo,
            String CodigoLegajoChofer,
            String CodigoFleteroTransportista,
            String TipodelDocumentoPtoVtaNroDocumento,
            String[] CodigoClienteDestino,
            String[] NombreClienteDestino,
            String[] CodigoSubClienteDestino,
            String[] NombreSubClienteDestino,
            String[] GeoposicionSubClienteDestino)
        {
            String    Resultado        = "0";
            bool      error            = false;
            Exception errorCause       = null;
            var       address          = HttpContext.Current.Request.UserHostAddress;
            var       vehiculoNoexiste = false;
            var       empleadonoexiste = false;
            string    IPPERMITIDAS     = ConfigurationManager.AppSettings["WebServiceIPPERMITIDAS"].ToString();
            bool      permitido        = false;

            foreach (var item in IPPERMITIDAS.Split(';'))
            {
                if (address.ToString().Equals(item.ToString()))
                {
                    permitido = true;
                    break;
                }
            }
            if (!permitido)
            {
                Resultado = "La direccion de internet publica " + address + " no tiene permisos. Comuniquese con soporte tecnico ";
                return(Resultado);
            }

            try
            {
                string filePath = HttpContext.Current.Server.MapPath("~");

                StringBuilder sb = new StringBuilder();
                sb.AppendLine("=======================================================================");
                sb.AppendLine("REQUEST HORA " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString());
                sb.AppendLine("IP PUBLICA: " + address.ToString());
                sb.AppendLine("=======================================================================");
                File.AppendAllText(filePath + "LOGIP.txt", sb.ToString());
            }
            catch (Exception ex)
            {
            }

            try
            {
                DAOFactory _DAOFactory = new DAOFactory();

                ViajeDistribucion EditObject = new ViajeDistribucion();
                var empreasa = -1;
                var linea    = -1;
                EditObject.Empresa = !String.IsNullOrEmpty(DistritoCodigo) ? _DAOFactory.EmpresaDAO.FindByCodigo(DistritoCodigo) : null;
                EditObject.Linea   = !String.IsNullOrEmpty(BaseLineaCodigo) ? _DAOFactory.LineaDAO.FindByCodigo(EditObject.Empresa.Id, BaseLineaCodigo) : null;
                if (EditObject.Linea != null)
                {
                    linea = EditObject.Linea.Id;
                }
                EditObject.Transportista = !String.IsNullOrEmpty(CodigoFleteroTransportista) ? _DAOFactory.TransportistaDAO.FindByCodigo(EditObject.Empresa.Id, linea, CodigoFleteroTransportista) : null;

                /*EditObject.CentroDeCostos = cbCentroDeCosto.Selected > 0 ? DAOFactory.CentroDeCostosDAO.FindById(cbCentroDeCosto.Selected) : null;
                 * EditObject.SubCentroDeCostos = cbSubCentroDeCosto.Selected > 0
                 *  ? DAOFactory.SubCentroDeCostosDAO.FindById(cbSubCentroDeCosto.Selected)
                 *  : null;
                 * EditObject.TipoCoche = cbTipoVehiculo.Selected > 0 ? DAOFactory.TipoCocheDAO.FindById(cbTipoVehiculo.Selected) : null;*/



                EditObject.Vehiculo = !String.IsNullOrEmpty(DominioVehiculo) ? _DAOFactory.CocheDAO.FindByPatente(EditObject.Empresa.Id, DominioVehiculo.Trim()) : null;
                if (EditObject.Vehiculo == null)
                {
                    Resultado        = Resultado + "\n El vehiculo " + DominioVehiculo + " no existe";
                    vehiculoNoexiste = true;
                }

                EditObject.Empleado = !String.IsNullOrEmpty(CodigoLegajoChofer) ? _DAOFactory.EmpleadoDAO.FindByLegajo(EditObject.Empresa.Id, linea, CodigoLegajoChofer) : null;
                if (EditObject.Empleado == null)
                {
                    Resultado        = Resultado + "\nEl empleado con codigo de legajo " + CodigoLegajoChofer + " no existe";
                    empleadonoexiste = true;
                }

                /*  EditObject.TipoCicloLogistico = cbTipoCicloLogistico.Selected > 0 ? DAOFactory.TipoCicloLogisticoDAO.FindById(cbTipoCicloLogistico.Selected) : null;*/

                EditObject.Codigo      = CodigoViajeUnico + "_" + DateTime.Now.ToString("ddMMyyyyHHmmssfff");
                EditObject.NumeroViaje = 0;

                EditObject.Tipo                 = ViajeDistribucion.Tipos.RecorridoFijo;
                EditObject.Desvio               = 100;
                EditObject.RegresoABase         = false;
                EditObject.ProgramacionDinamica = false;
                EditObject.Inicio               = DateTime.ParseExact(FechaYHoraDePosicionamiento, "ddMMyyyyHHmmssfff", null);

                EditObject.Comentario = TipodelDocumentoPtoVtaNroDocumento;
                EditObject.Umbral     = 0;
                EditObject.Estado     = ViajeDistribucion.Estados.Pendiente;
                EditObject.Alta       = DateTime.UtcNow;
                EditObject.Fin        = DateTime.MaxValue;

                _DAOFactory.ViajeDistribucionDAO.SaveOrUpdate(EditObject);

                for (int a = 0; a < CodigoclienteOrigen.Count(); a++)
                {
                    //CodigoclienteOrigen
                    var cliente = _DAOFactory.ClienteDAO.FindByCode(new int[] { EditObject.Empresa.Id }, new int[] { linea }, CodigoclienteOrigen[a]);
                    if (cliente == null)
                    {
                        Resultado                = Resultado + "\nEl cliente con codigo de origen " + CodigoclienteOrigen[a] + " no existe y se lo va a dar de alta";
                        cliente                  = new Cliente();
                        cliente.Empresa          = EditObject.Empresa;
                        cliente.Linea            = EditObject.Linea;
                        cliente.Codigo           = CodigoclienteOrigen[a];
                        cliente.Descripcion      = NombreClienteOrigen[a];
                        cliente.DescripcionCorta = NombreClienteOrigen[a];
                        _DAOFactory.ClienteDAO.SaveOrUpdate(cliente);
                    }
                    var puntoentrega = _DAOFactory.PuntoEntregaDAO.FindByCode(new int[] { EditObject.Empresa.Id }, new int[] { linea }, new int[] { cliente.Id }, CodigoSubclienteOrigen[a]);
                    if (puntoentrega == null)
                    {
                        Resultado = Resultado + "\nEl codigo de subcliente origen " + CodigoSubclienteOrigen[a] + " no existe y se lo va a dar de alta";
                        ReferenciaGeografica direccion = new ReferenciaGeografica();
                        direccion.Empresa = EditObject.Empresa;
                        direccion.Linea   = EditObject.Linea;
                        direccion.TipoReferenciaGeografica = _DAOFactory.TipoReferenciaGeograficaDAO.FindByCodigo(new int[] { EditObject.Empresa.Id }, new int[] { linea }, "CL");
                        direccion.Codigo      = CodigoclienteOrigen[a];
                        direccion.Descripcion = NombreSubclienteOrigen[a];

                        direccion.Vigencia        = new Vigencia();
                        direccion.Vigencia.Inicio = DateTime.UtcNow;
                        var now = DateTime.UtcNow;

                        var newDireccion = new Direccion
                        {
                            Vigencia = new Vigencia {
                                Inicio = now
                            },
                            Altura       = -1,
                            Calle        = "",
                            Descripcion  = NombreSubclienteOrigen[a],
                            IdCalle      = -1,
                            IdEntrecalle = -1,
                            IdEsquina    = -1,
                            IdMapa       = -1,
                            Latitud      = double.Parse(GeoposicionSubclienteOrigen[a].ToString().Split(';')[0]),
                            Longitud     = double.Parse(GeoposicionSubclienteOrigen[a].ToString().Split(';')[1]),
                            Pais         = "Argentina",
                            Partido      = "",
                            Provincia    = ""
                        };

                        Poligono newPoligono = new Poligono {
                            Vigencia = new Vigencia {
                                Inicio = now
                            }
                        };

                        PointF point = new PointF(float.Parse(GeoposicionSubclienteOrigen[a].ToString().Split(';')[0]),
                                                  float.Parse(GeoposicionSubclienteOrigen[a].ToString().Split(';')[0]));
                        List <PointF> points = new List <PointF>();
                        points.Add(point);
                        IEnumerable <PointF> pointenum = points as IEnumerable <PointF>;
                        newPoligono.AddPoints(pointenum);
                        direccion.AddHistoria(newDireccion, newPoligono, now);
                        _DAOFactory.ReferenciaGeograficaDAO.SaveOrUpdate(direccion);

                        puntoentrega                      = new PuntoEntrega();
                        puntoentrega.Cliente              = cliente;
                        puntoentrega.Codigo               = CodigoSubclienteOrigen[a];
                        puntoentrega.Descripcion          = NombreSubclienteOrigen[a];
                        puntoentrega.ReferenciaGeografica = direccion;

                        _DAOFactory.PuntoEntregaDAO.SaveOrUpdate(puntoentrega);
                    }
                    var kms     = 0;
                    var entrega = new EntregaDistribucion()
                    {
                        Cliente         = cliente,
                        PuntoEntrega    = puntoentrega,
                        Descripcion     = CodigoSubclienteOrigen[a],
                        Orden           = EditObject.Detalles.Count(),
                        Estado          = EntregaDistribucion.Estados.Pendiente,
                        Programado      = EditObject.Inicio.AddHours(a),
                        ProgramadoHasta = EditObject.Inicio.AddHours(a),
                        Viaje           = EditObject,
                        KmCalculado     = kms
                    };

                    _DAOFactory.EntregaDistribucionDAO.SaveOrUpdate(entrega);
                    EditObject.Detalles.Add(entrega);


                    //CodigoClienteDestino
                    var clientedestino = _DAOFactory.ClienteDAO.FindByCode(new int[] { EditObject.Empresa.Id }, new int[] { linea }, CodigoClienteDestino[a]);
                    if (clientedestino == null)
                    {
                        Resultado = Resultado + "\nEl cliente con codigo de destino " + CodigoClienteDestino[a] + " no existe y se lo va a dar de alta";

                        clientedestino                  = new Cliente();
                        clientedestino.Empresa          = EditObject.Empresa;
                        clientedestino.Linea            = EditObject.Linea;
                        clientedestino.Codigo           = CodigoClienteDestino[a];
                        clientedestino.Descripcion      = NombreClienteDestino[a];
                        clientedestino.DescripcionCorta = NombreClienteDestino[a];
                        _DAOFactory.ClienteDAO.SaveOrUpdate(clientedestino);
                    }

                    puntoentrega = _DAOFactory.PuntoEntregaDAO.FindByCode(new int[] { EditObject.Empresa.Id }, new int[] { linea }, new int[] { clientedestino.Id }, CodigoSubClienteDestino[a]);

                    if (puntoentrega == null)
                    {
                        Resultado = Resultado + "\nEl codigo de subcliente destino " + CodigoSubClienteDestino[a] + " no existe y se lo va a dar de alta";
                        ReferenciaGeografica direccion = new ReferenciaGeografica();
                        direccion.Empresa = EditObject.Empresa;
                        direccion.Linea   = EditObject.Linea;
                        direccion.TipoReferenciaGeografica = _DAOFactory.TipoReferenciaGeograficaDAO.FindByCodigo(new int[] { EditObject.Empresa.Id }, new int[] { linea }, "CL");
                        direccion.Codigo          = CodigoClienteDestino[a];
                        direccion.Descripcion     = NombreSubClienteDestino[a];
                        direccion.Vigencia        = new Vigencia();
                        direccion.Vigencia.Inicio = DateTime.UtcNow;

                        var now          = DateTime.UtcNow;
                        var newDireccion = new Direccion
                        {
                            Vigencia = new Vigencia {
                                Inicio = now
                            },
                            Altura       = -1,
                            Calle        = "",
                            Descripcion  = NombreSubclienteOrigen[a],
                            IdCalle      = -1,
                            IdEntrecalle = -1,
                            IdEsquina    = -1,
                            IdMapa       = -1,
                            Latitud      = double.Parse(GeoposicionSubClienteDestino[a].ToString().Split(';')[0]),
                            Longitud     = double.Parse(GeoposicionSubClienteDestino[a].ToString().Split(';')[1]),
                            Pais         = "Argentina",
                            Partido      = "",
                            Provincia    = ""
                        };

                        Poligono newPoligono = new Poligono {
                            Vigencia = new Vigencia {
                                Inicio = now
                            }
                        };

                        PointF        point  = new System.Drawing.PointF(float.Parse(GeoposicionSubClienteDestino[a].ToString().Split(';')[0]), float.Parse(GeoposicionSubClienteDestino[a].ToString().Split(';')[1]));
                        List <PointF> points = new List <PointF>();
                        points.Add(point);
                        IEnumerable <PointF> pointenum = points as IEnumerable <PointF>;
                        newPoligono.AddPoints(pointenum);
                        direccion.AddHistoria(newDireccion, newPoligono, now);

                        _DAOFactory.ReferenciaGeograficaDAO.SaveOrUpdate(direccion);
                        puntoentrega                      = new PuntoEntrega();
                        puntoentrega.Cliente              = clientedestino;
                        puntoentrega.Codigo               = CodigoSubClienteDestino[a];
                        puntoentrega.Descripcion          = NombreSubClienteDestino[a];
                        puntoentrega.ReferenciaGeografica = direccion;
                        _DAOFactory.PuntoEntregaDAO.SaveOrUpdate(puntoentrega);
                    }

                    entrega = new EntregaDistribucion()
                    {
                        Cliente         = clientedestino,
                        PuntoEntrega    = puntoentrega,
                        Descripcion     = CodigoSubClienteDestino[a],
                        Orden           = EditObject.Detalles.Count(),
                        Estado          = EntregaDistribucion.Estados.Pendiente,
                        Programado      = EditObject.Inicio.AddHours(a),
                        ProgramadoHasta = EditObject.Inicio.AddHours(a),
                        Viaje           = EditObject
                    };
                    EditObject.Detalles.Add(entrega);
                    _DAOFactory.EntregaDistribucionDAO.SaveOrUpdate(entrega);
                }


                EditObject.Recorrido.Clear();

                /* ReferenciaGeografica refgeo = null;
                 * PuntoEntrega refentrega = null;
                 * Recorrido trayecto = new Recorrido();
                 * trayecto.Desvio = 100;
                 * trayecto.Empresa = EditObject.Empresa;
                 * trayecto.Codigo = "";
                 * trayecto.Nombre = "";
                 * int orden = 0;
                 * trayecto.Linea = EditObject.Linea;
                 * var nombreRecorrido = "";
                 * foreach (var item in EditObject.Detalles)
                 * {
                 *   nombreRecorrido = nombreRecorrido.Replace(item.PuntoEntrega.Descripcion + "_", "") + item.PuntoEntrega.Descripcion + "_";
                 * }
                 * Recorrido buscarrecorrido = _DAOFactory.RecorridoDAO.FindAll().Where(x => x.Nombre.Equals(nombreRecorrido)).FirstOrDefault();
                 * if (buscarrecorrido == null)
                 * {
                 *   foreach (var item in EditObject.Detalles)
                 *   {
                 *       if (refgeo != null)
                 *       {
                 *           var origen = new LatLon(refgeo.Latitude, refgeo.Longitude);
                 *           var destino = new LatLon(item.ReferenciaGeografica.Latitude, item.ReferenciaGeografica.Longitude);
                 *           var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null);
                 *           var posiciones = directions.Legs.SelectMany(l => l.Steps.SelectMany(s => s.Points)).ToList();
                 *           RecorridoDistribucion last = null;
                 *           var codigoentrega = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 3);
                 *           var codigopuntoentrega = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 3);
                 *           if (refentrega.Codigo.Length > 4)
                 *           {
                 *               codigoentrega = refentrega.Codigo.Substring(refentrega.Codigo.Length - 3, 3);
                 *           }
                 *           if (item.PuntoEntrega.Codigo.Length > 4)
                 *           {
                 *               codigopuntoentrega = item.PuntoEntrega.Codigo.Substring(item.PuntoEntrega.Codigo.Length - 3, 3);
                 *           }
                 *           trayecto.Codigo = trayecto.Codigo.Replace(codigoentrega + "_", "") + codigoentrega + "_" + codigopuntoentrega + "_";
                 *           trayecto.Nombre = trayecto.Nombre.Replace(refentrega.Descripcion + "_", "") + refentrega.Descripcion + "_" + item.PuntoEntrega.Descripcion + "_";
                 *
                 *           for (var i = 0; i < posiciones.Count; i++)
                 *           {
                 *               var det = new RecorridoDistribucion { Latitud = posiciones[i].Latitud, Longitud = posiciones[i].Longitud, Distribucion = EditObject, Orden = orden };
                 *               det.Distancia = last == null ? 0 : Logictracker.Utils.Distancias.Loxodromica(last.Latitud, last.Longitud, det.Latitud, det.Longitud) / 1000.0;
                 *               EditObject.Recorrido.Add(det);
                 *               last = det;
                 *               trayecto.Detalles.Add(
                 *                   new DetalleRecorrido()
                 *                   {
                 *                       Latitud = posiciones[i].Latitud,
                 *                       Longitud = posiciones[i].Longitud,
                 *                       Recorrido = trayecto,
                 *                       Distancia = det.Distancia,
                 *                       Orden = orden
                 *                   }
                 *               );
                 *               orden++;
                 *           }
                 *           refgeo = item.ReferenciaGeografica;
                 *           refentrega = item.PuntoEntrega;
                 *       }
                 *       else
                 *       {
                 *           refgeo = item.ReferenciaGeografica;
                 *           refentrega = item.PuntoEntrega;
                 *       }
                 *   }
                 *   _DAOFactory.RecorridoDAO.SaveOrUpdate(trayecto);
                 * }
                 * else
                 * {
                 *   foreach (var item in buscarrecorrido.Detalles)
                 *   {
                 *       var det = new RecorridoDistribucion { Latitud = item.Latitud, Longitud = item.Longitud, Distribucion = EditObject, Orden = item.Orden };
                 *       det.Distancia = item.Distancia;
                 *       EditObject.Recorrido.Add(det);
                 *   }
                 *
                 * }*/
                _DAOFactory.ViajeDistribucionDAO.SaveOrUpdate(EditObject);
            }
            catch (Exception ex)
            {
                Resultado = Resultado + "\nError desconocido ";
                string        filePath = HttpContext.Current.Server.MapPath("~");
                StringBuilder sb       = new StringBuilder();
                sb.AppendLine("=======================================================================");
                sb.AppendLine("IP PUBLICA: " + address.ToString());
                sb.AppendLine(ex.Message);
                sb.AppendLine(ex.StackTrace.ToString());
                sb.AppendLine("=======================================================================");
                File.AppendAllText(filePath + "LOGIP.txt", sb.ToString());
                error = true;
            }

            /*
             *  Respuesta	Código de Respuesta - N(3)
             * (en caso de que la recepción fuera correcta deberá devolvernos un 0, sino un código de error según lo determinen uds.
             * qué datos son obligatorios para dar de alta el viaje en la plataforma.
             * Habrá alertas por datos faltantes o Chofer/Fletero inexistentes)
             *  Descripcion	Descripción Respuesta - C(40) (según el atributo anterior.
             * Si hubo errores y/o aletas deberá especificar en que atributos se produjo)
             */

            return(Resultado);
        }
Exemplo n.º 24
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);
        }