Example #1
0
 protected void SaveMessage(string messageCode, DateTime fecha, ViajeDistribucion viaje, EntregaDistribucion entrega)
 {
     SaveMessage(messageCode, string.Empty, null, fecha, viaje, entrega);
 }
Example #2
0
        protected override void OnExecute(Timer timer)
        {
            STrace.Trace(ComponentName, "Inicio de la tarea");

            var inicio = DateTime.UtcNow;

            var empresas = DaoFactory.EmpresaDAO.GetList().Where(e => e.GeneraRutaInversa);

            STrace.Trace(GetType().FullName, string.Format("Procesando empresas. Cantidad: {0}", empresas.Count()));

            try
            {
                foreach (var empresa in empresas)
                {
                    var vehiculos = DaoFactory.CocheDAO.FindList(new[] { empresa.Id }, new[] { -1 })
                                    .Where(c => c.Dispositivo != null);
                    var clientes = DaoFactory.ClienteDAO.GetList(new[] { empresa.Id }, new[] { -1 }).Select(c => c.Id).ToList();

                    var vehiculosPendientes = vehiculos.Count();
                    STrace.Trace(GetType().FullName, string.Format("Vehículos a procesar: {0}", vehiculosPendientes));

                    var eventosEntradas = DaoFactory.LogMensajeDAO.GetByVehiclesAndCode(vehiculos.Select(v => v.Id).ToArray(), MessageCode.InsideGeoRefference.GetMessageCode(), Desde, Hasta, 1);
                    var eventosSalidas  = DaoFactory.LogMensajeDAO.GetByVehiclesAndCode(vehiculos.Select(v => v.Id).ToArray(), MessageCode.OutsideGeoRefference.GetMessageCode(), Desde.AddDays(-7), Hasta, 1);

                    foreach (var vehiculo in vehiculos)
                    {
                        STrace.Trace(GetType().FullName, string.Format("Procesando vehículo: {0}", vehiculo.Id));

                        var entradas = eventosEntradas.Where(ev => ev.Coche.Id == vehiculo.Id &&
                                                             ev.Fecha > Desde &&
                                                             ev.Fecha < Hasta &&
                                                             ev.IdPuntoDeInteres.HasValue);

                        STrace.Trace(GetType().FullName, string.Format("Entradas a procesar: {0}", entradas.Count()));

                        var i = 1;
                        foreach (var entrada in entradas)
                        {
                            STrace.Trace(GetType().FullName, string.Format("Procesando entrada: {0}/{1}", i, entradas.Count()));

                            var ptoFin = DaoFactory.PuntoEntregaDAO.FindByClientesAndGeoreferencia(clientes, entrada.IdPuntoDeInteres.Value);
                            if (ptoFin == null)
                            {
                                continue;
                            }

                            var salidas = eventosSalidas.Where(ev => ev.Coche.Id == vehiculo.Id &&
                                                               ev.Fecha > entrada.Fecha.AddDays(-7) &&
                                                               ev.Fecha < entrada.Fecha.AddSeconds(-1) &&
                                                               ev.IdPuntoDeInteres.HasValue)
                                          .OrderByDescending(s => s.Fecha);

                            foreach (var salida in salidas)
                            {
                                var ptoInicio = DaoFactory.PuntoEntregaDAO.FindByClientesAndGeoreferencia(clientes, salida.IdPuntoDeInteres.Value);
                                if (ptoInicio != null)
                                {
                                    if (ptoInicio == ptoFin)
                                    {
                                        break;
                                    }

                                    var codigo = salida.Fecha.AddHours(-3).ToString("yyyyMMdd") + "|" + vehiculo.Interno + "|" + ptoInicio.Codigo + "-" + ptoFin.Codigo;
                                    var viaje  = new ViajeDistribucion
                                    {
                                        Alta         = DateTime.UtcNow,
                                        Codigo       = codigo.Length <= 32 ? codigo : codigo.Substring(0, 32),
                                        Empresa      = empresa,
                                        Estado       = ViajeDistribucion.Estados.Cerrado,
                                        Fin          = entrada.Fecha,
                                        Inicio       = salida.Fecha,
                                        InicioReal   = salida.Fecha,
                                        Linea        = vehiculo.Linea,
                                        NumeroViaje  = 1,
                                        RegresoABase = false,
                                        Tipo         = ViajeDistribucion.Tipos.Desordenado,
                                        Vehiculo     = vehiculo
                                    };

                                    var entrega1 = new EntregaDistribucion
                                    {
                                        Cliente         = ptoInicio.Cliente,
                                        PuntoEntrega    = ptoInicio,
                                        Descripcion     = ptoInicio.Descripcion,
                                        Estado          = EntregaDistribucion.Estados.Visitado,
                                        Orden           = 1,
                                        Programado      = salida.Fecha,
                                        ProgramadoHasta = salida.Fecha,
                                        Viaje           = viaje,
                                        Salida          = salida.Fecha
                                    };

                                    viaje.Detalles.Add(entrega1);

                                    var fechaFin   = entrada.Fecha;
                                    var kms        = 0.0;
                                    var origen     = new LatLon(ptoInicio.ReferenciaGeografica.Latitude, ptoInicio.ReferenciaGeografica.Longitude);
                                    var destino    = new LatLon(ptoFin.ReferenciaGeografica.Latitude, ptoFin.ReferenciaGeografica.Longitude);
                                    var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null);

                                    if (directions != null)
                                    {
                                        var duracion = directions.Duration;
                                        kms      = directions.Distance / 1000.0;
                                        fechaFin = salida.Fecha.Add(duracion);
                                    }

                                    var entrega2 = new EntregaDistribucion
                                    {
                                        Cliente         = ptoFin.Cliente,
                                        PuntoEntrega    = ptoFin,
                                        Descripcion     = ptoFin.Descripcion,
                                        Estado          = EntregaDistribucion.Estados.Visitado,
                                        Orden           = 2,
                                        Programado      = fechaFin,
                                        ProgramadoHasta = fechaFin,
                                        Viaje           = viaje,
                                        Entrada         = entrada.Fecha,
                                        KmCalculado     = kms
                                    };

                                    viaje.Detalles.Add(entrega2);

                                    DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viaje);
                                    break;
                                }
                            }
                            i++;
                        }

                        STrace.Trace(GetType().FullName, string.Format("Vehículos a procesar: {0}", --vehiculosPendientes));
                    }
                }

                STrace.Trace(GetType().FullName, "Tarea finalizada.");

                var fin      = DateTime.UtcNow;
                var duration = fin.Subtract(inicio).TotalMinutes;

                DaoFactory.DataMartsLogDAO.SaveNewLog(inicio, fin, duration, DataMartsLog.Moludos.GeneracionInversa, "Generación inversa finalizada exitosamente");
            }
            catch (Exception ex)
            {
                AddError(ex);
            }
            finally
            {
                ClearData();
            }
        }
Example #3
0
        public ResumenDeRutasVo(ViajeDistribucion viaje, Boolean estadoVerKm)
        {
            Id    = viaje.Id;
            Viaje = viaje;
            var dao = new DAOFactory();

            Ruta     = viaje.Codigo;
            Vehiculo = viaje.Vehiculo != null
                ? viaje.Vehiculo.Interno + " - "
                       + viaje.Vehiculo.Patente
                       + (viaje.Vehiculo.Dispositivo == null ? " (Sin dispositivo)" : string.Empty)
                       + (viaje.Vehiculo.Estado == Coche.Estados.EnMantenimiento ? " (En Taller)" : string.Empty)
                       + (viaje.Vehiculo.Estado == Coche.Estados.Inactivo ? " (Inactivo)" : string.Empty)
                       + (viaje.Vehiculo.Estado == Coche.Estados.Revisar ? " (Revisar)" : string.Empty)
                : "Ninguno";
            Inicio     = viaje.InicioReal.HasValue ? viaje.InicioReal.Value.ToDisplayDateTime() : (DateTime?)null;
            Fin        = viaje.Estado == ViajeDistribucion.Estados.Cerrado ? viaje.Fin.ToDisplayDateTime() : (DateTime?)null;
            Recepcion  = viaje.Recepcion.HasValue ? viaje.Recepcion.Value.ToDisplayDateTime() : (DateTime?)null;
            Entregas   = viaje.EntregasTotalCount;
            Realizados = viaje.EntregasCompletadosCount;
            Visitados  = viaje.EntregasVisitadosCount;
            Rechazados = viaje.EntregasNoCompletadosCount;
            EnSitio    = viaje.EntregasEnSitioCount;
            EnZona     = viaje.EntregasEnZonaCount;
            var total = Realizados + Visitados;

            PorcVisitados = Entregas > 0 ? Convert.ToDouble(total) / Convert.ToDouble(Entregas) : 0.00;
            Estado        = CultureManager.GetLabel(ViajeDistribucion.Estados.GetLabelVariableName(viaje.Estado));
            var kms       = 0.0;
            var recorrido = new TimeSpan(0);

            if (viaje.Vehiculo != null && viaje.InicioReal.HasValue)
            {
                switch (viaje.Estado)
                {
                case ViajeDistribucion.Estados.EnCurso:
                    if (estadoVerKm)
                    {
                        kms       = dao.CocheDAO.GetDistance(viaje.Vehiculo.Id, viaje.InicioReal.Value, DateTime.UtcNow);
                        recorrido = new TimeSpan(0, 0, (int)DateTime.UtcNow.Subtract(viaje.InicioReal.Value).TotalSeconds);
                    }
                    break;

                case ViajeDistribucion.Estados.Cerrado:
                    if (estadoVerKm)
                    {
                        if (viaje.InicioReal.Value < DateTime.Today)
                        {
                            var dmViaje = dao.DatamartViajeDAO.GetRecords(viaje.Id).FirstOrDefault();
                            if (dmViaje != null)
                            {
                                kms = dmViaje.KmTotales;
                            }
                        }
                        else
                        {
                            kms = dao.CocheDAO.GetDistance(viaje.Vehiculo.Id, viaje.InicioReal.Value, viaje.Fin);
                        }

                        recorrido = new TimeSpan(0, 0, (int)viaje.Fin.Subtract(viaje.InicioReal.Value).TotalSeconds);
                    }
                    break;
                }
            }
            Kms       = kms;
            Recorrido = recorrido;
        }
Example #4
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);
        }
        public String CrearViajeDistribucion(
            String DistritoCodigo,
            String BaseLineaCodigo,
            String CodigoViajeUnico,
            String[] CodigoclienteOrigen,
            String[] NombreClienteOrigen,
            String[] CodigoSubclienteOrigen,
            String[] NombreSubclienteOrigen,
            String[] GeoposicionSubclienteOrigen,
            String FechaYHoraDePosicionamiento,
            String DominioVehiculo,
            String CodigoLegajoChofer,
            String CodigoFleteroTransportista,
            String TipodelDocumentoPtoVtaNroDocumento,
            String[] CodigoClienteDestino,
            String[] NombreClienteDestino,
            String[] CodigoSubClienteDestino,
            String[] NombreSubClienteDestino,
            String[] GeoposicionSubClienteDestino)
        {
            String    Resultado        = "0";
            bool      error            = false;
            Exception errorCause       = null;
            var       address          = HttpContext.Current.Request.UserHostAddress;
            var       vehiculoNoexiste = false;
            var       empleadonoexiste = false;
            string    IPPERMITIDAS     = ConfigurationManager.AppSettings["WebServiceIPPERMITIDAS"].ToString();
            bool      permitido        = false;

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

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

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

            try
            {
                DAOFactory _DAOFactory = new DAOFactory();

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

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



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

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

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

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

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

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

                _DAOFactory.ViajeDistribucionDAO.SaveOrUpdate(EditObject);

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


                EditObject.Recorrido.Clear();

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

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

            return(Resultado);
        }
Example #6
0
        private static IList <ViajeDistribucion> GetViajeDistribucionList()
        {
            var viajeDistribucionList = new List <ViajeDistribucion>();
            var distribucion          = new ViajeDistribucion()
            {
                Id      = 1,
                Codigo  = "UNITTEST1",
                Estado  = 0,
                Empresa = new Empresa()
                {
                    Id = 1
                },
                Linea = new Linea()
                {
                    Id = 10
                },
                Detalles = new List <EntregaDistribucion>()
                {
                    new EntregaDistribucion()
                    {
                        Id              = 1,
                        Programado      = new DateTime(2014, 04, 15, 9, 5, 23),
                        ProgramadoHasta = new DateTime(2014, 04, 16, 9, 5, 23),
                        Estado          = 0,
                        Descripcion     = "descripcion",
                        Orden           = 0,
                        Linea           = new Linea()
                        {
                            ReferenciaGeografica = new ReferenciaGeografica()
                        }
                    }
                }
            };

            viajeDistribucionList.Add(distribucion);

            distribucion = new ViajeDistribucion()
            {
                Id      = 2,
                Codigo  = "UNITTEST2",
                Estado  = 3,
                Empresa = new Empresa()
                {
                    Id = 1
                },
                Linea = new Linea()
                {
                    Id = 10
                },
                Detalles = new List <EntregaDistribucion>()
                {
                    new EntregaDistribucion()
                    {
                        Id              = 1,
                        Programado      = new DateTime(2014, 04, 15, 9, 5, 23),
                        ProgramadoHasta = new DateTime(2014, 04, 16, 9, 5, 23),
                        Estado          = 0,
                        Descripcion     = "descripcion",
                        Orden           = 0,
                        Linea           = new Linea()
                        {
                            ReferenciaGeografica = new ReferenciaGeografica()
                        }
                    }
                }
            };
            viajeDistribucionList.Add(distribucion);

            distribucion = new ViajeDistribucion()
            {
                Id      = 1,
                Codigo  = "UNITTEST3",
                Estado  = 9,
                Empresa = new Empresa()
                {
                    Id = 1
                },
                Linea = new Linea()
                {
                    Id = 10
                },
                Detalles = new List <EntregaDistribucion>()
                {
                    new EntregaDistribucion()
                    {
                        Id              = 1,
                        Programado      = new DateTime(2014, 04, 15, 9, 5, 23),
                        ProgramadoHasta = new DateTime(2014, 04, 16, 9, 5, 23),
                        Estado          = 0,
                        Descripcion     = "descripcion",
                        Orden           = 0,
                        Linea           = new Linea()
                        {
                            ReferenciaGeografica = new ReferenciaGeografica()
                        }
                    }
                }
            };
            viajeDistribucionList.Add(distribucion);

            return(viajeDistribucionList);
        }
Example #7
0
        private void ProcessViaje(ViajeDistribucion viaje)
        {
            var kmProductivos   = 0.0;
            var kmImproductivos = 0.0;
            var detalles        = viaje.Detalles.Where(d => d.Linea == null);

            DateTime?ultima  = null;
            DateTime?primera = null;

            var primeraEntrada = detalles.Min(e => e.Entrada);
            var primeraSalida  = detalles.Min(e => e.Salida);
            var ultimaEntrada  = detalles.Max(e => e.Entrada);
            var ultimaSalida   = detalles.Max(e => e.Salida);

            if (primeraSalida.HasValue && primeraEntrada.HasValue)
            {
                primera = primeraEntrada <= primeraSalida ? primeraEntrada : primeraSalida;
            }
            else if (primeraEntrada.HasValue)
            {
                primera = primeraEntrada;
            }
            else if (primeraSalida.HasValue)
            {
                primera = primeraSalida;
            }

            if (ultimaSalida.HasValue && ultimaEntrada.HasValue)
            {
                ultima = ultimaSalida >= ultimaEntrada ? ultimaSalida : ultimaEntrada;
            }
            else if (ultimaSalida.HasValue)
            {
                ultima = ultimaSalida;
            }
            else if (ultimaEntrada.HasValue)
            {
                ultima = ultimaEntrada;
            }

            if (primera.HasValue && ultima.HasValue)
            {
                if (primera == ultima) // TODOS KMS IMPRODUCTIVOS
                {
                    var dm = DaoFactory.DatamartDAO.GetMobilesKilometers(viaje.InicioReal.Value, viaje.Fin, new List <int> {
                        viaje.Vehiculo.Id
                    }).FirstOrDefault();
                    kmImproductivos += dm != null ? dm.Kilometers : 0.0;
                }
                else
                {
                    // PRIMER TRAMO IMPRODUCTIVO
                    var dm = DaoFactory.DatamartDAO.GetMobilesKilometers(viaje.InicioReal.Value, primera.Value, new List <int> {
                        viaje.Vehiculo.Id
                    }).FirstOrDefault();
                    kmImproductivos += dm != null ? dm.Kilometers : 0.0;

                    // SEGUNDO TRAMO PRODUCTIVO
                    dm = DaoFactory.DatamartDAO.GetMobilesKilometers(primera.Value, ultima.Value, new List <int> {
                        viaje.Vehiculo.Id
                    }).FirstOrDefault();
                    kmProductivos += dm != null ? dm.Kilometers : 0.0;

                    // TERCER TRAMO IMPRODUCTIVO
                    dm = DaoFactory.DatamartDAO.GetMobilesKilometers(ultima.Value, viaje.Fin, new List <int> {
                        viaje.Vehiculo.Id
                    }).FirstOrDefault();
                    kmImproductivos += dm != null ? dm.Kilometers : 0.0;
                }
            }
            else if (!primera.HasValue && !ultima.HasValue) // TODOS KMS IMPRODUCTIVOS
            {
                var dm = DaoFactory.DatamartDAO.GetMobilesKilometers(viaje.InicioReal.Value, viaje.Fin, new List <int> {
                    viaje.Vehiculo.Id
                }).FirstOrDefault();
                kmImproductivos += dm != null ? dm.Kilometers : 0.0;
            }

            var kmProgramados = viaje.Detalles.Sum(d => d.KmCalculado);
            var kmTotales     = kmProductivos + kmImproductivos;

            if (kmTotales <= 0)
            {
                STrace.Error(GetType().FullName, string.Format("Viaje con kilometros en 0 - Id: {0}", viaje.Id));
            }

            var costoViaje = viaje.Vehiculo.CocheOperacion != null
                                 ? viaje.Vehiculo.CocheOperacion.CostoKmUltimoMes * kmTotales
                                 : 0.0;

            var completadas   = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.Completado);
            var noCompletadas = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.NoCompletado);
            var visitadas     = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.Visitado);
            var sinVisitar    = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.SinVisitar);
            var enSitio       = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.EnSitio);
            var enZona        = detalles.Count(d => d.Estado == EntregaDistribucion.Estados.EnZona);

            var entregas = detalles.Where(d => d.Entrada.HasValue && d.Salida.HasValue)
                           .Select(d => d.Salida.Value.Subtract(d.Entrada.Value));

            var totalEntregas   = entregas.Any() ? entregas.Sum(e => e.TotalHours) : 0.0;
            var entregaMaxima   = entregas.Any() ? entregas.Max(d => d.TotalHours) : 0.0;
            var entregaMinima   = entregas.Any() ? entregas.Min(d => d.TotalHours) : 0.0;
            var entregaPromedio = entregas.Any() ? totalEntregas / (double)entregas.Count() : 0.0;

            var sumDm             = DaoFactory.DatamartDAO.GetSummarizedDatamart(viaje.InicioReal.Value, viaje.Fin, viaje.Vehiculo.Id);
            var hsDetenido        = sumDm.HsDetenido;
            var velocidadMax      = sumDm.MaxSpeed;
            var velocidadPromedio = sumDm.AverageSpeed;

            var dmViaje = new DatamartViaje
            {
                Empresa               = viaje.Empresa,
                Linea                 = viaje.Linea,
                Vehiculo              = viaje.Vehiculo,
                Viaje                 = viaje,
                Inicio                = viaje.InicioReal.Value,
                Fin                   = viaje.Fin,
                Duracion              = viaje.Fin.Subtract(viaje.InicioReal.Value).TotalMinutes,
                KmImproductivos       = kmImproductivos,
                KmProductivos         = kmProductivos,
                KmProgramados         = kmProgramados.Value,
                KmTotales             = kmTotales,
                EntregaMaxima         = entregaMaxima,
                EntregaMinima         = entregaMinima,
                EntregaPromedio       = entregaPromedio,
                VelocidadMaxima       = velocidadMax,
                VelocidadPromedio     = velocidadPromedio,
                EntregasTotales       = detalles.Count(),
                EntregasCompletadas   = completadas,
                EntregasNoCompletadas = noCompletadas,
                EntregasNoVisitadas   = sinVisitar,
                EntregasVisitadas     = visitadas,
                EntregasEnSitio       = enSitio,
                EntregasEnZona        = enZona,
                HorasDetenido         = hsDetenido,
                HorasEnEntrega        = totalEntregas,
                Costo                 = costoViaje
            };

            DaoFactory.DatamartViajeDAO.SaveOrUpdate(dmViaje);
        }
Example #8
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));
        }