public RegistrationDataViewModel(IDinnerEventsRepository dinnerEventsRepository, IEventParticipationsRepository eventParticipationsRepository, ITeamsRepository teamsRepository, IInvitationsRepository invitationsRepository, IRoutesRepository routesRepository, IEmailSender emailSender, IConfiguration configuration, UserManager <ApplicationUser> userManager, SignInManager <ApplicationUser> signInManager) { DinnerEventsRepository = dinnerEventsRepository; EventParticipationsRepository = eventParticipationsRepository; TeamsRepository = teamsRepository; InvitationsRepository = invitationsRepository; EmailSender = emailSender; RoutesRepository = routesRepository; Configuration = configuration; UserManager = userManager; SignInManager = signInManager; HereMapsHelper = new HereMapsHelper(configuration); }
/// <summary> /// PageHandler for creating routes automatically. /// </summary> /// <returns></returns> public async Task <IActionResult> OnPostCreateRoutes(int factor) { if (HttpContext.Session.GetString("EventId") == null) { string returnUrl = HttpContext.Request.Path.ToString(); return(RedirectToPage("/Account/Login", new { area = "Identity", returnUrl })); } ViewData["IsParticipating"] = HttpContext.Session.GetString("IsParticipating"); var eventId = int.Parse(HttpContext.Session.GetString("EventId"), CultureInfo.CurrentCulture); var dinnerEvent = DinnerEventsRepository.GetById(eventId); List <CalculationHost> FirstCourseHosts = new List <CalculationHost>(); List <CalculationHost> SecondCourseHosts = new List <CalculationHost>(); List <CalculationHost> ThirdCourseHosts = new List <CalculationHost>(); int routeFactor = factor; int numberOfRoutes = routeFactor * 3; var teams = TeamsRepository.SearchFor(x => x.Event.Id == eventId).Take(numberOfRoutes).ToList(); ///////////////////////////// Sort teams by course foreach (Team team in teams) { if (team.SelectedCourse == "FirstCourse") { FirstCourseHosts.Add(new CalculationHost() { HostTeam = team }); } if (team.SelectedCourse == "SecondCourse") { SecondCourseHosts.Add(new CalculationHost() { HostTeam = team }); } if (team.SelectedCourse == "ThirdCourse") { ThirdCourseHosts.Add(new CalculationHost() { HostTeam = team }); } } List <CalculationHost> FirstCourseHostsOrdered = new List <CalculationHost>(); List <CalculationHost> SecondCourseHostsOrdered = SecondCourseHosts; List <CalculationHost> ThirdCourseHostsOrdered = new List <CalculationHost>(); //////////////////////////////// Get GeoCoordinates foreach (var secondCourseHost in SecondCourseHosts) { var address = secondCourseHost.HostTeam.FullAddress + "," + secondCourseHost.HostTeam.City; secondCourseHost.Coordinates = await HereMapsHelper.GetCoordinates(address); } foreach (var thirdCourseHost in ThirdCourseHosts) { var address = thirdCourseHost.HostTeam.FullAddress + "," + thirdCourseHost.HostTeam.City; thirdCourseHost.Coordinates = await HereMapsHelper.GetCoordinates(address); } foreach (var firstCourseHost in FirstCourseHosts) { var address = firstCourseHost.HostTeam.FullAddress + "," + firstCourseHost.HostTeam.City; firstCourseHost.Coordinates = await HereMapsHelper.GetCoordinates(address); } /////////////////////////////// Calculate Distances foreach (var secondCourseHost in SecondCourseHosts) { // From Second to First course hosts secondCourseHost.HostDistancesToFirst = new List <RouteNodeDistance>(); foreach (var firstCourseHost in FirstCourseHosts) { RouteNodeDistance hostDistance = new RouteNodeDistance { Host1 = secondCourseHost, Distance = secondCourseHost.Coordinates.GetDistanceTo(firstCourseHost.Coordinates), Host2 = firstCourseHost }; secondCourseHost.HostDistancesToFirst.Add(hostDistance); } secondCourseHost.HostDistancesToFirst = secondCourseHost.HostDistancesToFirst.OrderBy(x => x.Distance).ToList(); // From Second to Third course hosts secondCourseHost.HostDistancesToThird = new List <RouteNodeDistance>(); foreach (var thirdCourseHost in ThirdCourseHosts) { RouteNodeDistance hostDistance = new RouteNodeDistance { Host1 = secondCourseHost, Distance = secondCourseHost.Coordinates.GetDistanceTo(thirdCourseHost.Coordinates), Host2 = thirdCourseHost }; secondCourseHost.HostDistancesToThird.Add(hostDistance); } secondCourseHost.HostDistancesToThird = secondCourseHost.HostDistancesToThird.OrderBy(x => x.Distance).ToList(); } //////////////////////// Re-order hosts by distance foreach (var secondCourseHost in SecondCourseHosts) { // Shortest Distance from SecondCourse to FirstCourse foreach (var hostDistance in secondCourseHost.HostDistancesToFirst) { if (!FirstCourseHostsOrdered.Contains(hostDistance.Host2)) { FirstCourseHostsOrdered.Add(hostDistance.Host2); break; } } } foreach (var secondCourseHost in SecondCourseHosts) { // Shortest Distance from SecondCourse To ThirdCourse foreach (var hostDistance in secondCourseHost.HostDistancesToThird) { if (!ThirdCourseHostsOrdered.Contains(hostDistance.Host2)) { ThirdCourseHostsOrdered.Add(hostDistance.Host2); break; } } } //////////////////// Set SecondCourseHosts (use only ordered Hosts from here!) // Start from First int i = 0; // Start from Second int j = 1; foreach (var secondCourseHost in SecondCourseHostsOrdered) { // Add FirstCourseHost FirstCourseHostsOrdered[i].GuestTeam1 = secondCourseHost.HostTeam; // Add ThirdCourseHost ThirdCourseHostsOrdered[j].GuestTeam1 = secondCourseHost.HostTeam; i++; j++; if (i == routeFactor) { i = 0; } if (j == routeFactor) { j = 0; } } /////////////////////////////////// Set ThirdCourseHosts // Start from First i = 0; // Start from Second j = 1; foreach (var thirdCourseHost in ThirdCourseHostsOrdered) { // Add FirstCourseHost FirstCourseHostsOrdered[i].GuestTeam2 = thirdCourseHost.HostTeam; // Add SecondCourseHost SecondCourseHostsOrdered[j].GuestTeam1 = thirdCourseHost.HostTeam; i++; j++; if (i == routeFactor) { i = 0; } if (j == routeFactor) { j = 0; } } /////////////////////////////////// Set FirstCourseHosts // Start from Third i = 2; // Start from Third j = 2; foreach (var firstCourseHost in FirstCourseHostsOrdered) { // Add SecondCourseHost SecondCourseHostsOrdered[i].GuestTeam2 = firstCourseHost.HostTeam; // Add ThirdCourseHost ThirdCourseHostsOrdered[j].GuestTeam2 = firstCourseHost.HostTeam; i++; j++; if (i == routeFactor) { i = 0; } if (j == routeFactor) { j = 0; } } ///////////////////////// Create routes // Add SecondCourse routes foreach (var host in SecondCourseHostsOrdered) { Route newRoute = new Route { Event = dinnerEvent, RouteForTeam = host.HostTeam, // Second Course SecondCourseHostTeam = host.HostTeam, SecondCourseGuestTeam1 = host.GuestTeam1, SecondCourseGuestTeam2 = host.GuestTeam2 }; // First Course var firstCourseHostList = from r in FirstCourseHostsOrdered where r.GuestTeam1.Id == host.HostTeam.Id select r; var firstCourseHost = firstCourseHostList.FirstOrDefault(); newRoute.FirstCourseHostTeam = firstCourseHost.HostTeam; newRoute.FirstCourseGuestTeam1 = firstCourseHost.GuestTeam1; newRoute.FirstCourseGuestTeam2 = firstCourseHost.GuestTeam2; // Third Course var thirdCourseHostList = from r in ThirdCourseHostsOrdered where r.GuestTeam1.Id == host.HostTeam.Id select r; var thirdCourseHost = thirdCourseHostList.FirstOrDefault(); newRoute.ThirdCourseHostTeam = thirdCourseHost.HostTeam; newRoute.ThirdCourseGuestTeam1 = thirdCourseHost.GuestTeam1; newRoute.ThirdCourseGuestTeam2 = thirdCourseHost.GuestTeam2; RoutesRepository.Insert(newRoute); } // Add ThirdCourse routes foreach (var host in ThirdCourseHostsOrdered) { Route newRoute = new Route { Event = dinnerEvent, RouteForTeam = host.HostTeam, // Third Course ThirdCourseHostTeam = host.HostTeam, ThirdCourseGuestTeam1 = host.GuestTeam1, ThirdCourseGuestTeam2 = host.GuestTeam2 }; // First Course var firstCourseHostList = from r in FirstCourseHostsOrdered where r.GuestTeam2.Id == host.HostTeam.Id select r; var firstCourseHost = firstCourseHostList.FirstOrDefault(); newRoute.FirstCourseHostTeam = firstCourseHost.HostTeam; newRoute.FirstCourseGuestTeam1 = firstCourseHost.GuestTeam1; newRoute.FirstCourseGuestTeam2 = firstCourseHost.GuestTeam2; // Second Course var secondCourseHostList = from r in SecondCourseHostsOrdered where r.GuestTeam1.Id == host.HostTeam.Id select r; var secondCourseHost = secondCourseHostList.FirstOrDefault(); newRoute.SecondCourseHostTeam = secondCourseHost.HostTeam; newRoute.SecondCourseGuestTeam1 = secondCourseHost.GuestTeam1; newRoute.SecondCourseGuestTeam2 = secondCourseHost.GuestTeam2; RoutesRepository.Insert(newRoute); } // Add FirstCourse routes foreach (var host in FirstCourseHostsOrdered) { Route newRoute = new Route { Event = dinnerEvent, RouteForTeam = host.HostTeam, // First Course FirstCourseHostTeam = host.HostTeam, FirstCourseGuestTeam1 = host.GuestTeam1, FirstCourseGuestTeam2 = host.GuestTeam2 }; // Second Course var secondCourseHostList = from r in SecondCourseHostsOrdered where r.GuestTeam2.Id == host.HostTeam.Id select r; var secondCourseHost = secondCourseHostList.FirstOrDefault(); newRoute.SecondCourseHostTeam = secondCourseHost.HostTeam; newRoute.SecondCourseGuestTeam1 = secondCourseHost.GuestTeam1; newRoute.SecondCourseGuestTeam2 = secondCourseHost.GuestTeam2; // Third Course var thirdCourseHostList = from r in ThirdCourseHostsOrdered where r.GuestTeam2.Id == host.HostTeam.Id select r; var thirdCourseHost = thirdCourseHostList.FirstOrDefault(); newRoute.ThirdCourseHostTeam = thirdCourseHost.HostTeam; newRoute.ThirdCourseGuestTeam1 = thirdCourseHost.GuestTeam1; newRoute.ThirdCourseGuestTeam2 = thirdCourseHost.GuestTeam2; RoutesRepository.Insert(newRoute); } RoutesRepository.SaveChanges(); return(RedirectToPage()); }
public IActionResult OnGet() { if (HttpContext.Session.GetString("EventId") == null) { string returnUrl = HttpContext.Request.Path.ToString(); return(RedirectToPage("/Account/Login", new { area = "Identity" })); } ViewData["IsParticipating"] = HttpContext.Session.GetString("IsParticipating"); var eventId = int.Parse(HttpContext.Session.GetString("EventId"), CultureInfo.CurrentCulture); DinnerEvent dinnerEvent = DinnerEventsRepository.GetById(eventId); if (dinnerEvent != null) { // Values are passed-through to layout page ViewData["EventName"] = dinnerEvent.EventName; ViewData["EventDate"] = dinnerEvent.EventDate.ToShortDateString(); ViewData["EventCity"] = dinnerEvent.City; ViewData["EventPictureLink"] = dinnerEvent.EventPictureLink; } else { return(RedirectToPage("RegistrationData")); } ViewData["apiKey"] = Configuration?.GetMapsSettings("apiKeyJs"); ViewData["MapCenterLat"] = "50.113745"; ViewData["MapCenterLong"] = "8.679317"; // Routes List <Route> routes = RoutesRepository.SearchFor(x => x.Event.Id == eventId) .Include(a => a.Event) .Include(a => a.RouteForTeam) .Include(a => a.FirstCourseHostTeam) .Include(a => a.FirstCourseGuestTeam1) .Include(a => a.FirstCourseGuestTeam2) .Include(a => a.SecondCourseHostTeam) .Include(a => a.SecondCourseGuestTeam1) .Include(a => a.SecondCourseGuestTeam2) .Include(a => a.ThirdCourseHostTeam) .Include(a => a.ThirdCourseGuestTeam1) .Include(a => a.ThirdCourseGuestTeam2).ToList(); List <string> kitchenAddresses = new List <string>(); foreach (var route in routes) { if (route.RouteForTeam?.Id == route.FirstCourseHostTeam?.Id) { kitchenAddresses.Add(route.FirstCourseHostTeam.FullAddress + "," + dinnerEvent.City); } if (route.RouteForTeam?.Id == route.SecondCourseHostTeam?.Id) { kitchenAddresses.Add(route.SecondCourseHostTeam.FullAddress + "," + dinnerEvent.City); } if (route.RouteForTeam?.Id == route.ThirdCourseHostTeam?.Id) { kitchenAddresses.Add(route.ThirdCourseHostTeam.FullAddress + "," + dinnerEvent.City); } } List <string> kitchenCoordinates = new List <string>(); foreach (var kitchenAddress in kitchenAddresses) { string coordinateString = HereMapsHelper.GetCoordinatesWithAddressString(kitchenAddress); kitchenCoordinates.Add(coordinateString); } ViewData["KitchenCoordinates"] = kitchenCoordinates.ToArray(); List <string> routeAddresses = new List <string>(); foreach (Route route in routes) { // First Course Host routeAddresses.Add(route.FirstCourseHostTeam.FullAddress + ", " + dinnerEvent.City); // Second Course Host routeAddresses.Add(route.SecondCourseHostTeam.FullAddress + ", " + dinnerEvent.City); // Third Course Host routeAddresses.Add(route.ThirdCourseHostTeam.FullAddress + ", " + dinnerEvent.City); } List <string> routeCoordinates = new List <string>(); foreach (var routeAddress in routeAddresses) { string coordinateString = HereMapsHelper.GetCoordinatesString(routeAddress); routeCoordinates.Add(coordinateString); } ViewData["RouteCoordinates"] = routeCoordinates.ToArray(); string partyLocationCoordinateString = HereMapsHelper.GetCoordinatesWithAddressString(dinnerEvent.PartyLocation); ViewData["PartyLocation"] = partyLocationCoordinateString; return(Page()); }
public async Task <IActionResult> OnGet() { if (HttpContext.Session.GetString("EventId") == null) { string returnUrl = HttpContext.Request.Path.ToString(); return(RedirectToPage("/Account/Login", new { area = "Identity" })); } ViewData["IsParticipating"] = HttpContext.Session.GetString("IsParticipating"); var eventId = int.Parse(HttpContext.Session.GetString("EventId"), CultureInfo.CurrentCulture); ApplicationUser user = await _userManager.GetUserAsync(User); if (user == null) { return(Page()); } bool isParticipating = IsUserParticipating(eventId, user.Id); ViewData["IsParticipating"] = isParticipating; HttpContext.Session.SetString("IsParticipating", isParticipating.ToString(CultureInfo.CurrentCulture)); DinnerEvent dinnerEvent = DinnerEventsRepository.GetById(eventId); if (dinnerEvent != null) { // Values are passed-through to layout page ViewData["EventName"] = dinnerEvent.EventName; ViewData["EventDate"] = dinnerEvent.EventDate.ToShortDateString(); ViewData["EventCity"] = dinnerEvent.City; ViewData["EventPictureLink"] = dinnerEvent.EventPictureLink; } if (dinnerEvent == null) { return(Page()); } ViewData["apiKey"] = Configuration?.GetMapsSettings("apiKeyJs"); ViewData["MapCenterLat"] = "50.113745"; ViewData["MapCenterLong"] = "8.679317"; Event = dinnerEvent; // Load Team Team team = TeamsRepository.SearchFor(x => x.Event.Id == dinnerEvent.Id && (x.Partner1.Id == user.Id || x.Partner2.Id == user.Id)).Include("Partner1").Include("Partner2").Include("Event").FirstOrDefault(); if (!dinnerEvent.RoutesOpen) { return(Page()); } // Routes Route route = RoutesRepository.SearchFor(x => x.Event.Id == eventId && x.RouteForTeam.Id == team.Id) .Include(a => a.Event) .Include(a => a.RouteForTeam) .Include(a => a.FirstCourseHostTeam).ThenInclude(b => b.Partner1) .Include(a => a.FirstCourseHostTeam).ThenInclude(b => b.Partner2) .Include(a => a.FirstCourseGuestTeam1).ThenInclude(b => b.Partner1) .Include(a => a.FirstCourseGuestTeam1).ThenInclude(b => b.Partner2) .Include(a => a.FirstCourseGuestTeam2).ThenInclude(b => b.Partner1) .Include(a => a.FirstCourseGuestTeam2).ThenInclude(b => b.Partner2) .Include(a => a.SecondCourseHostTeam).ThenInclude(b => b.Partner1) .Include(a => a.SecondCourseHostTeam).ThenInclude(b => b.Partner2) .Include(a => a.SecondCourseGuestTeam1).ThenInclude(b => b.Partner1) .Include(a => a.SecondCourseGuestTeam1).ThenInclude(b => b.Partner2) .Include(a => a.SecondCourseGuestTeam2).ThenInclude(b => b.Partner1) .Include(a => a.SecondCourseGuestTeam2).ThenInclude(b => b.Partner2) .Include(a => a.ThirdCourseHostTeam).ThenInclude(b => b.Partner1) .Include(a => a.ThirdCourseHostTeam).ThenInclude(b => b.Partner2) .Include(a => a.ThirdCourseGuestTeam1).ThenInclude(b => b.Partner1) .Include(a => a.ThirdCourseGuestTeam1).ThenInclude(b => b.Partner2) .Include(a => a.ThirdCourseGuestTeam2).ThenInclude(b => b.Partner1) .Include(a => a.ThirdCourseGuestTeam2).ThenInclude(b => b.Partner2).FirstOrDefault(); FirstCourseTeam = route.FirstCourseHostTeam; SecondCourseTeam = route.SecondCourseHostTeam; ThirdCourseTeam = route.ThirdCourseHostTeam; List <string> routeAddresses = new List <string>(); // First Course Host routeAddresses.Add(route.FirstCourseHostTeam.FullAddress + ", " + dinnerEvent.City); // Second Course Host routeAddresses.Add(route.SecondCourseHostTeam.FullAddress + ", " + dinnerEvent.City); // Third Course Host routeAddresses.Add(route.ThirdCourseHostTeam.FullAddress + ", " + dinnerEvent.City); List <string> kitchenCoordinates = new List <string>(); foreach (var routeAddress in routeAddresses) { string coordinateString = HereMapsHelper.GetCoordinatesWithAddressString(routeAddress); kitchenCoordinates.Add(coordinateString); } ViewData["KitchenCoordinates"] = kitchenCoordinates.ToArray(); List <string> routeCoordinates = new List <string>(); foreach (var routeAddress in routeAddresses) { string coordinateString = HereMapsHelper.GetCoordinatesString(routeAddress); routeCoordinates.Add(coordinateString); } ViewData["RouteCoordinates"] = routeCoordinates; string partyLocationCoordinateString = HereMapsHelper.GetCoordinatesWithAddressString(dinnerEvent.PartyLocation); ViewData["PartyLocation"] = partyLocationCoordinateString; return(Page()); }