static void Main(string[] args) { Rp3.Security.Cryptography.KeyFileName = "key"; ContextService db = new Models.ContextService(); string mode = "ANYNOTIFICATION"; //if (args.Length > 0) // mode = args[0]; switch (mode) { case "AGENDA": Executor.Agenda(db); break; case "NOTIFICACIONMARCACION": Executor.NotificacionMarcacion(db); break; case "INFORMETRAZABILIDAD": Executor.GenerateInformeTrazabilidad(db, true); break; case "INFORMETRAZABILIDADALL": Executor.GenerateInformeTrazabilidad(db, true, null, new DateTime(2016, 1, 13), new DateTime(2016, 1, 18)); break; case "OPORTUNIDADATRASADA": Executor.NotificacionOportunidadesAtrasadas(db); break; case "GETLOG": Executor.GetLog(db, "66,54"); break; case "ANYNOTIFICATION": Executor.SendAnyNotification(db, 26); break; } }
public static bool GetRutaOptima(Models.ContextService db, List <Agenda> agendasProgramar, Calendario calendar) { if (agendasProgramar.Count > 0) { List <Agenda> agendaOrdenada; ZonaDetalle zonaDetalle = null; int contDirecciones = 0; Agenda first = null; do { if (agendasProgramar[contDirecciones].IdCiudad.HasValue) { int idGeopoliticalStructure = agendasProgramar[contDirecciones].IdCiudad.Value; zonaDetalle = db.ZonaDetalles.Get(p => p.IdGeopoliticalStructure == idGeopoliticalStructure, includeProperties: "Zona").FirstOrDefault(); if (zonaDetalle != null && zonaDetalle.Zona.LatitudPuntoPartida.HasValue && zonaDetalle.Zona.LongitudPuntoPartida.HasValue) { first = new Agenda() { IdAgenda = 0, ClienteDireccion = new Rp3.AgendaComercial.Models.General.ClienteDireccion() { IdClienteDireccion = 0, Latitud = zonaDetalle.Zona.LatitudPuntoPartida, Longitud = zonaDetalle.Zona.LongitudPuntoPartida, }, IdRuta = 0, }; } } contDirecciones++; if (contDirecciones == agendasProgramar.Count) { first = new Agenda() { IdAgenda = 0, ClienteDireccion = new Rp3.AgendaComercial.Models.General.ClienteDireccion() { IdClienteDireccion = 0, Latitud = double.Parse(db.ParametroHelper.LatitudeDefault.Replace('.', ',')), Longitud = double.Parse(db.ParametroHelper.LongitudeDefault.Replace('.', ',')), }, IdRuta = 0, }; } } while (first == null); //Creo una lista con los elementos que no tengan coordenadas, y los elimino de la lista principal List <Agenda> sinCoordenadas = new List <Agenda>(); foreach (Agenda ag in agendasProgramar) { if (!ag.ClienteDireccion.Latitud.HasValue || ag.ClienteDireccion.Latitud.Value == 0 || !ag.ClienteDireccion.Longitud.HasValue || ag.ClienteDireccion.Longitud.Value == 0) { sinCoordenadas.Add(ag); } } foreach (Agenda elim in sinCoordenadas) { agendasProgramar.Remove(elim); } //Obtengo la primera ruta int distancia = -1; Agenda agendaSgte = null; agendaOrdenada = new List <Agenda>(); while (agendasProgramar.Count() > 0) { foreach (Agenda ag in agendasProgramar) { int distanciaActual = GetDistancia(first.ClienteDireccion.Latitud.Value, first.ClienteDireccion.Longitud.Value, ag.ClienteDireccion.Latitud.Value, ag.ClienteDireccion.Longitud.Value); if (distancia == -1 || distancia > distanciaActual) { distancia = distanciaActual; agendaSgte = ag; } } agendaOrdenada.Add(agendaSgte); distancia = -1; first = agendaSgte; agendaSgte = null; agendasProgramar.Remove(first); } //Agrego al final las agendas sin coordenadas agendaOrdenada.AddRange(sinCoordenadas); DateTime date = agendaOrdenada[0].FechaInicio.Value; //foreach (DiasNoLaborable dia in calendar.DiasNoLaborables) //{ // if (dia.Fecha.Day == date.Day && dia.Fecha.Month == date.Month) // { // foreach (Agenda agdSv in agendaOrdenada) // { // agdSv.FechaInicio = agdSv.FechaInicio.Value.AddDays(1); // db.Agendas.Update(agdSv); // db.Save(); // } // return true; // } //} var weekday = getDayOfWeek((int)date.DayOfWeek); var diaLaboral = calendar.DiasLaborales.Where(p => p.IdDia == weekday + "").FirstOrDefault(); DateTime horaInicial1 = agendaOrdenada[0].FechaInicio.Value; DateTime?horaInicial2 = null; DateTime horaFin1 = agendaOrdenada[0].FechaInicio.Value; DateTime?horaFin2 = null; if (diaLaboral.EsLaboral) { DateTime setter = DateTime.ParseExact(diaLaboral.HoraInicio1.Replace('h', ':'), "HH:mm", CultureInfo.InvariantCulture); int pru = setter.Hour; horaInicial1 = horaInicial1.AddHours(setter.Hour); horaInicial1 = horaInicial1.AddMinutes(setter.Minute); setter = DateTime.ParseExact(diaLaboral.HoraFin1.Replace('h', ':'), "HH:mm", CultureInfo.InvariantCulture); horaFin1 = horaFin1.AddHours(setter.Hour); horaFin1 = horaFin1.AddMinutes(setter.Minute); if (!string.IsNullOrWhiteSpace(diaLaboral.HoraInicio2)) { setter = DateTime.ParseExact(diaLaboral.HoraInicio2.Replace('h', ':'), "HH:mm", CultureInfo.InvariantCulture); horaInicial2 = agendaOrdenada[0].FechaInicio.Value; horaInicial2 = horaInicial2.Value.AddHours(setter.Hour); horaInicial2 = horaInicial2.Value.AddMinutes(setter.Minute); setter = DateTime.ParseExact(diaLaboral.HoraFin2.Replace('h', ':'), "HH:mm", CultureInfo.InvariantCulture); horaFin2 = agendaOrdenada[0].FechaInicio.Value; horaFin2 = horaFin2.Value.AddHours(setter.Hour); horaFin2 = horaFin2.Value.AddMinutes(setter.Minute); } } //else //{ // //se guardan agendas para otro dia laborable // foreach (Agenda agdSv in agendaOrdenada) // { // agdSv.FechaInicio = agdSv.FechaInicio.Value.AddDays(1); // db.Agendas.Update(agdSv); // db.Save(); // } // return true; //} int tiempoMovilizacion = 0; if (zonaDetalle != null && zonaDetalle.Zona.TiempoMovilizacion != 0) { tiempoMovilizacion = zonaDetalle.Zona.TiempoMovilizacion; } else { tiempoMovilizacion = int.Parse(db.ParametroHelper.DefaultRouteTime); } bool primerHorario = true; foreach (Agenda agdSv in agendaOrdenada) { if (horaInicial1 > horaFin1 && primerHorario) { primerHorario = false; if (horaInicial2 != null) { TimeSpan minutos = horaInicial1.Subtract(horaFin1); horaInicial2 = horaInicial2 = horaInicial2.Value.AddMinutes(minutos.TotalMinutes); } } if (primerHorario) { horaInicial1 = horaInicial1.AddMinutes(tiempoMovilizacion); agdSv.TiempoViaje = tiempoMovilizacion; agdSv.FechaInicio = horaInicial1; agdSv.FechaInicioOriginal = horaInicial1; if (agdSv.Duracion.HasValue) { horaInicial1 = horaInicial1.AddMinutes(agdSv.Duracion.Value); } else { horaInicial1 = horaInicial1.AddMinutes(30); } agdSv.FechaFin = horaInicial1; agdSv.FechaFinOriginal = horaInicial1; } else if (horaInicial2 != null) { horaInicial2 = horaInicial2.Value.AddMinutes(tiempoMovilizacion); agdSv.TiempoViaje = tiempoMovilizacion; agdSv.FechaInicio = horaInicial2; agdSv.FechaInicioOriginal = horaInicial2; if (agdSv.Duracion.HasValue) { horaInicial2 = horaInicial2.Value.AddMinutes(agdSv.Duracion.Value); } else { horaInicial2 = horaInicial2.Value.AddMinutes(30); } agdSv.FechaFin = horaInicial2; agdSv.FechaFinOriginal = horaInicial2; } else { agdSv.FechaInicio = agdSv.FechaInicio.Value.AddDays(1); db.Agendas.Update(agdSv); db.Save(); continue; } //Grabar Agenda con Horario agdSv.EstadoAgenda = Rp3.AgendaComercial.Models.Constantes.EstadoAgenda.Pendiente; db.Agendas.Update(agdSv); db.Save(); } } return(true); }