Exemplo n.º 1
0
 public TipoServicioCicloVo(TipoServicioCiclo tipoServicio)
 {
     Id          = tipoServicio.Id;
     Codigo      = tipoServicio.Codigo;
     Empresa     = tipoServicio.Empresa != null ? tipoServicio.Empresa.RazonSocial : string.Empty;
     Linea       = tipoServicio.Linea != null ? tipoServicio.Linea.Descripcion : string.Empty;
     Descripcion = tipoServicio.Descripcion;
     Demora      = tipoServicio.Demora;
     Default     = tipoServicio.Default;
 }
Exemplo n.º 2
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.º 3
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.º 4
0
        public void Parse(out int rutas, out int entregas)
        {
            const char separator = '|';
            const int  vigencia  = 12;

            var te   = new TimeElapsed();
            var rows = ParseFile(Llfile.FilePath, separator).Rows;

            STrace.Trace(Component, string.Format("Archivo parseado en {0} segundos", te.getTimeElapsed().TotalSeconds));
            te.Restart();
            PreBufferRows(rows);
            STrace.Trace(Component, string.Format("PreBufferRows en {0} segundos", te.getTimeElapsed().TotalSeconds));

            var listViajes      = new List <ViajeDistribucion>(rows.Count);
            var listPuntos      = new List <PuntoEntrega>();
            var listReferencias = new List <ReferenciaGeografica>();

            rutas    = 0;
            entregas = 0;

            STrace.Trace(Component, "Cantidad de filas: " + rows.Count);
            var filas = 0;

            foreach (var row in rows)
            {
                filas++;
                STrace.Trace(Component, string.Format("Procesando fila: {0}/{1}", filas, rows.Count));

                var patente  = row.Cells[Properties.DistribucionQuilmes.Patente].ToString().Trim();
                var vehiculo = _cochesBuffer.SingleOrDefault(v => v.Patente == patente);

                var oLinea = vehiculo != null && vehiculo.Linea != null ? vehiculo.Linea : Linea;
                if (oLinea == null)
                {
                    ThrowProperty("LINEA", Llfile.Strategy);
                }

                var sFecha = row.Cells[Properties.DistribucionQuilmes.Fecha].ToString().Trim();
                var codigo = sFecha + row.Cells[Properties.DistribucionQuilmes.Ruta].ToString().Trim();

                var sHora = row.Cells[Properties.DistribucionQuilmes.Hora].ToString().Trim();
                if (sHora.Length == 3)
                {
                    sHora = "0" + sHora;
                }
                else if (sHora.Length != 4)
                {
                    ThrowProperty("HORARIO", Llfile.Strategy);
                }

                var latitud  = row.Cells[Properties.DistribucionQuilmes.Latitud].ToString().Trim();
                var longitud = row.Cells[Properties.DistribucionQuilmes.Longitud].ToString().Trim();
                var esBase   = latitud.Trim().Equals(string.Empty) && longitud.Trim().Equals(string.Empty);

                var dia   = Convert.ToInt32(sFecha.Substring(0, 2));
                var mes   = Convert.ToInt32(sFecha.Substring(2, 2));
                var anio  = Convert.ToInt32(sFecha.Substring(4, 2)) + 2000;
                var hora  = Convert.ToInt32(sHora.Substring(0, 2));
                var min   = Convert.ToInt32(sHora.Substring(2, 2));
                var gmt   = new TimeSpan(-3, 0, 0);
                var fecha = new DateTime(anio, mes, dia, hora, min, 0).Subtract(gmt);

                if (listViajes.Count == 0 || codigo != listViajes.Last().Codigo)
                {
                    var byCode = _viajesBuffer.SingleOrDefault(v => v.Codigo == codigo);
                    if (byCode != null)
                    {
                        continue;
                    }
                }

                ViajeDistribucion item;

                if (listViajes.Count > 0 && listViajes.Any(v => v.Codigo == codigo))
                {
                    item = listViajes.SingleOrDefault(v => v.Codigo == codigo);
                    if (fecha < item.Inicio)
                    {
                        item.Inicio = fecha;
                    }
                }
                else
                {
                    item = new ViajeDistribucion {
                        Codigo = codigo
                    };
                    rutas++;

                    item.Empresa              = Empresa;
                    item.Linea                = oLinea;
                    item.Vehiculo             = vehiculo;
                    item.Inicio               = fecha;
                    item.Fin                  = fecha;
                    item.Tipo                 = ViajeDistribucion.Tipos.Desordenado;
                    item.RegresoABase         = true;
                    item.Estado               = ViajeDistribucion.Estados.Pendiente;
                    item.Alta                 = DateTime.UtcNow;
                    item.ProgramacionDinamica = codigo.Contains("TR");

                    var nroViaje = row.Cells[Properties.DistribucionQuilmes.Viaje].ToString().Trim();
                    item.NumeroViaje = Convert.ToInt32(nroViaje);

                    if (vehiculo != null)
                    {
                        item.Empleado          = !vehiculo.IdentificaChoferes ? vehiculo.Chofer : null;
                        item.CentroDeCostos    = vehiculo.CentroDeCostos;
                        item.SubCentroDeCostos = vehiculo.SubCentroDeCostos;
                    }
                    else
                    {
                        STrace.Error(Component, string.Format("Patente {0} no encontrada para el viaje: {1}", patente, codigo));
                    }

                    listViajes.Add(item);
                }

                var kms      = row.Cells[Properties.DistribucionQuilmes.Kms].ToString().Trim();
                var distance = Convert.ToDouble(kms, CultureInfo.InvariantCulture);

                if (esBase)
                {
                    if (codigo.Contains("TR"))
                    {
                        var ultimo  = item.Detalles.Last().ReferenciaGeografica;
                        var origen  = new LatLon(ultimo.Latitude, ultimo.Longitude);
                        var destino = new LatLon(oLinea.ReferenciaGeografica.Latitude,
                                                 oLinea.ReferenciaGeografica.Longitude);
                        var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving,
                                                                        string.Empty, null);

                        if (directions != null)
                        {
                            distance = directions.Distance / 1000.0;
                            var duracion = directions.Duration;
                            fecha = item.Detalles.Last().Programado.Add(duracion);
                        }
                    }

                    var llegada = new EntregaDistribucion
                    {
                        Linea           = oLinea,
                        Descripcion     = oLinea.Descripcion,
                        Estado          = EntregaDistribucion.Estados.Pendiente,
                        Orden           = item.Detalles.Count,
                        Programado      = fecha,
                        ProgramadoHasta = fecha,
                        Viaje           = item,
                        KmCalculado     = distance
                    };

                    item.Detalles.Add(llegada);
                    continue;
                }

                // Entregas
                if (item.Detalles.Count == 0)
                {
                    //Si no existe, agrego la salida de base
                    var origen = new EntregaDistribucion
                    {
                        Linea           = oLinea,
                        Descripcion     = oLinea.Descripcion,
                        Estado          = EntregaDistribucion.Estados.Pendiente,
                        Orden           = 0,
                        Programado      = fecha,
                        ProgramadoHasta = fecha,
                        Viaje           = item
                    };
                    item.Detalles.Add(origen);
                }

                var codigoPuntoEntrega = row.Cells[Properties.DistribucionQuilmes.CodigoCliente].ToString().Trim();
                var nombre             = row.Cells[Properties.DistribucionQuilmes.DescripcionCliente].ToString().Trim();
                if (string.IsNullOrEmpty(codigoPuntoEntrega))
                {
                    ThrowProperty("PUNTO ENTREGA", Llfile.Strategy);
                }

                if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codigoPuntoEntrega))
                {
                    continue;
                }

                TipoServicioCiclo tipoServicio = null;
                var tipoServ = _tiposServicioBuffer.SingleOrDefault(ts => ts.Linea == null || ts.Linea.Id == oLinea.Id);
                if (tipoServ != null && tipoServ.Id > 0)
                {
                    tipoServicio = tipoServ;
                }

                latitud  = latitud.Replace(',', '.');
                longitud = longitud.Replace(',', '.');
                var lat = Convert.ToDouble(latitud, CultureInfo.InvariantCulture);
                var lon = Convert.ToDouble(longitud, CultureInfo.InvariantCulture);
                ValidateGpsPoint(codigo, codigoPuntoEntrega, (float)lat, (float)lon);

                var puntoEntrega = _puntosBuffer.SingleOrDefault(p => p.Codigo == codigoPuntoEntrega);

                if (puntoEntrega == null)
                {
                    var empresaGeoRef = item.Vehiculo != null && item.Vehiculo.Empresa == null ? null : Cliente.Empresa == null ? null : Empresa;
                    var lineaGeoRef   = item.Vehiculo != null && item.Vehiculo.Linea == null ? null : Cliente.Linea == null ? null : oLinea;

                    var puntoDeInteres = new ReferenciaGeografica
                    {
                        Codigo                   = codigoPuntoEntrega,
                        Descripcion              = nombre,
                        Empresa                  = empresaGeoRef,
                        Linea                    = lineaGeoRef,
                        EsFin                    = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin,
                        EsInicio                 = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio,
                        EsIntermedio             = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio,
                        InhibeAlarma             = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma,
                        TipoReferenciaGeografica = Cliente.ReferenciaGeografica.TipoReferenciaGeografica,
                        Vigencia                 = new Vigencia {
                            Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia)
                        },
                        Icono = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono
                    };

                    var posicion = GetNewDireccion(lat, lon);

                    var poligono = new Poligono {
                        Radio = 50, Vigencia = new Vigencia {
                            Inicio = DateTime.UtcNow
                        }
                    };
                    poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) });

                    puntoDeInteres.Historia.Add(new HistoriaGeoRef
                    {
                        ReferenciaGeografica = puntoDeInteres,
                        Direccion            = posicion,
                        Poligono             = poligono,
                        Vigencia             = new Vigencia {
                            Inicio = DateTime.UtcNow
                        }
                    });

                    listReferencias.Add(puntoDeInteres);

                    puntoEntrega = new PuntoEntrega
                    {
                        Cliente              = Cliente,
                        Codigo               = codigoPuntoEntrega,
                        Descripcion          = nombre,
                        Telefono             = string.Empty,
                        Baja                 = false,
                        ReferenciaGeografica = puntoDeInteres,
                        Nomenclado           = true,
                        DireccionNomenclada  = string.Empty,
                        Nombre               = nombre
                    };
                }
                else
                {
                    if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != lat || puntoEntrega.ReferenciaGeografica.Longitude != lon))
                    {
                        puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow;
                        puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin  = DateTime.UtcNow;

                        var posicion = GetNewDireccion(lat, lon);
                        var poligono = new Poligono {
                            Radio = 50, Vigencia = new Vigencia {
                                Inicio = DateTime.UtcNow
                            }
                        };
                        poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) });

                        puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow);
                    }

                    var end = fecha.AddHours(vigencia);
                    if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end)
                    {
                        puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end;
                    }

                    listReferencias.Add(puntoEntrega.ReferenciaGeografica);
                }

                listPuntos.Add(puntoEntrega);

                if (codigo.Contains("TR"))
                {
                    var ultimo     = item.Detalles.Last().ReferenciaGeografica;
                    var origen     = new LatLon(ultimo.Latitude, ultimo.Longitude);
                    var destino    = new LatLon(puntoEntrega.ReferenciaGeografica.Latitude, puntoEntrega.ReferenciaGeografica.Longitude);
                    var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null);

                    if (directions != null)
                    {
                        distance = directions.Distance / 1000.0;
                        var duracion = directions.Duration;
                        fecha = item.Detalles.Last().Programado.Add(duracion);
                    }
                }

                if (item.Detalles.Last().TipoServicio != null)
                {
                    fecha = fecha.AddMinutes(item.Detalles.Last().TipoServicio.Demora);
                }

                var entrega = new EntregaDistribucion
                {
                    Cliente      = Cliente,
                    PuntoEntrega = puntoEntrega,
                    Descripcion  = codigoPuntoEntrega,
                    Estado       = EntregaDistribucion.Estados.Pendiente,
                    Orden        = item.Detalles.Count,
                    //Orden = Convert.ToInt32(orden, CultureInfo.InvariantCulture),
                    Programado      = fecha,
                    ProgramadoHasta = fecha,
                    TipoServicio    = tipoServicio,
                    Viaje           = item,
                    KmCalculado     = distance
                };

                item.Detalles.Add(entrega);
                entregas++;

                var lastDetail = item.Detalles.LastOrDefault();
                item.Fin = lastDetail == null ? item.Inicio : lastDetail.Programado;
            }

            STrace.Trace(Component, "Guardando referencias geográficas: " + listReferencias.Count);
            te.Restart();
            foreach (var referenciaGeografica in listReferencias)
            {
                DaoFactory.ReferenciaGeograficaDAO.Guardar(referenciaGeografica);
            }
            STrace.Trace(Component, string.Format("Referencias guardadas en {0} segundos", te.getTimeElapsed().TotalSeconds));

            STrace.Trace(Component, "Guardando puntos de entrega: " + listPuntos.Count);
            te.Restart();
            foreach (var puntoEntrega in listPuntos)
            {
                DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega);
            }
            STrace.Trace(Component, string.Format("Puntos guardados en {0} segundos", te.getTimeElapsed().TotalSeconds));

            STrace.Trace(Component, "Guardando Viajes: " + listViajes.Count);
            te.Restart();
            foreach (var viajeDistribucion in listViajes)
            {
                DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viajeDistribucion);
            }
            STrace.Trace(Component, string.Format("Viajes guardados en {0} segundos", te.getTimeElapsed().TotalSeconds));

            DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(-1, -1);
            DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(Empresa.Id, -1);

            var lineas = DaoFactory.LineaDAO.FindList(new[] { Empresa.Id });

            foreach (var lin in lineas)
            {
                DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(Empresa.Id, lin.Id);
            }
        }
Exemplo n.º 5
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.º 6
0
        public override object Parse(int empresa, int linea, IData data)
        {
            var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa);
            var oLinea   = DaoFactory.LineaDAO.FindById(linea);

            if (oLinea == null)
            {
                ThrowProperty("LINEA");
            }
            const int vigencia = 24;

            var codRuta = data[Properties.DistribucionB.CodigoRuta].Trim();

            if (string.IsNullOrEmpty(codRuta))
            {
                ThrowProperty("RUTA");
            }

            var codEntrega = data[Properties.DistribucionB.CodigoEntrega].Trim();

            if (string.IsNullOrEmpty(codEntrega))
            {
                ThrowProperty("ENTREGA");
            }

            var codPuntoEntrega = data[Properties.DistribucionB.CodigoPuntoEntrega].Trim();

            if (string.IsNullOrEmpty(codPuntoEntrega))
            {
                ThrowProperty("PUNTO_ENTREGA");
            }

            var estado = data[Properties.DistribucionB.Estado].Trim();

            var fecha = data[Properties.DistribucionB.Fecha].Trim();

            if (string.IsNullOrEmpty(fecha))
            {
                ThrowProperty("FECHA");
            }
            if (fecha.Length != 8)
            {
                ThrowProperty("FECHA");
            }

            var hora = data[Properties.DistribucionB.HoraProgramada].Trim();

            if (string.IsNullOrEmpty(hora))
            {
                ThrowProperty("HORA");
            }
            if (hora.Length != 8)
            {
                ThrowProperty("HORA");
            }

            int dia, mes, anio, hr, min, seg;

            if (!int.TryParse(fecha.Substring(0, 4), out anio))
            {
                ThrowProperty("AÑO");
            }
            if (!int.TryParse(fecha.Substring(4, 2), out mes))
            {
                ThrowProperty("MES");
            }
            if (!int.TryParse(fecha.Substring(6, 2), out dia))
            {
                ThrowProperty("DIA");
            }
            if (!int.TryParse(hora.Substring(0, 2), out hr))
            {
                ThrowProperty("HORA");
            }
            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 item = GetDistribucion(empresa, linea, codRuta);

            if (data.Operation == (int)Operation.Delete)
            {
                return(item);
            }

            if (!string.IsNullOrEmpty(estado))
            {
                if (item.Id != 0)
                {
                    var ptoEntrega = item.Detalles.FirstOrDefault(d => d.PuntoEntrega != null && d.Descripcion == codEntrega);
                    if (ptoEntrega == null)
                    {
                        return(item);
                    }

                    item.Detalles.Remove(ptoEntrega);

                    DaoFactory.EntregaDistribucionDAO.Delete(ptoEntrega);
                }
                return(item);
            }

            if (item.Id == 0)
            {
                Coche vehiculo = null;
                var   interno  = data[Properties.DistribucionB.Interno].Trim();
                if (!string.IsNullOrEmpty(interno))
                {
                    vehiculo = DaoFactory.CocheDAO.GetByInternoEndsWith(new[] { empresa }, new[] { linea }, interno);
                    if (vehiculo == null)
                    {
                        STrace.Error("Logiclink", string.Format("Interno {0} no encontrado para el viaje: {1}", interno, codRuta));
                    }
                }
                else
                {
                    STrace.Error("Logiclink", "Interno vacío para el viaje: " + codRuta);
                }

                item.Empresa      = oEmpresa;
                item.Linea        = oLinea;
                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  = 1;
            }

            // 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);
            }

            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 }, codPuntoEntrega);

            if (puntoEntrega == null)
            {
                ThrowProperty("PUNTO_ENTREGA_INEXISTENTE");
            }
            else
            {
                var end = date.AddHours(vigencia);
                puntoEntrega.ReferenciaGeografica.Vigencia.Inicio = date.Date.ToDataBaseDateTime();
                if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end)
                {
                    puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end;
                }

                DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoEntrega.ReferenciaGeografica);
                STrace.Trace("QtreeReset", "DistribucionBV1");
                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
            };

            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.º 7
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.º 8
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.º 9
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);
        }
Exemplo n.º 10
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));
        }