public async Task <ActionResult <Dictionary <int, ICollection <object> > > > GetYearsAndWeeks([FromQuery] int years) { var dict = new Dictionary <int, List <object> >(); var currentYear = DateTime.Now.Year; for (int i = currentYear - years; i <= currentYear; i++) { var numberOfWeeks = ISOWeek.GetWeeksInYear(i); dict.Add(i, new List <object>()); for (int j = 1; j <= numberOfWeeks; j++) { if (i == DateTime.Now.Year && ISOWeek.GetWeekOfYear(DateTime.Now) - 1 < j) { break; } var weekString = ISOWeek.ToDateTime(i, j, DayOfWeek.Monday).ToString("dd.MM.yyyy") + " - " + ISOWeek.ToDateTime(i, j, DayOfWeek.Sunday).ToString("dd.MM.yyyy"); dict[i].Add(new { weekNum = j, week = weekString }); } } return(Ok(dict)); }
public async Task InsertRanks(int year, int week, IEnumerable <RankInputModel> input) { var ranksCollection = this.db.GetCollection <Rank>("Ranks"); var t = ISOWeek.GetWeeksInYear(year - 1); Expression <Func <Rank, bool> > filter; if (week == 1) { filter = rank => rank.Year == year - 1 && rank.Week == t; } else { filter = rank => rank.Year == year && rank.Week == week - 1; } var previousRanks = (await ranksCollection.AsQueryable() .Where(filter) .Select(rank => new { rank.PlayerId, rank.RankNumber }) .ToListAsync()) .ToDictionary(rank => rank.PlayerId, rank => rank.RankNumber); var ranks = mapper.Map <IEnumerable <Rank> >(input).ToList(); ranks.ForEach(rank => { rank.Year = year; rank.Week = week; rank.WeekDuration = ISOWeek.ToDateTime(year, week, DayOfWeek.Monday).ToString("dd.MM.yyyy") + " - " + ISOWeek.ToDateTime(year, week, DayOfWeek.Sunday).ToString("dd.MM.yyyy"); rank.PreviousRankNumber = previousRanks.ContainsKey(rank.PlayerId) ? previousRanks[rank.PlayerId] : 0; }); await ranksCollection.InsertManyAsync(ranks); }
public async Task <BookingResponse> GetBookingsWeek(BookingsWeekRequest model) { // Get activity and check if it exists var activity = await _bookingDbContext.Activities.Include(a => a.Bookings) .Where(a => a.Id == model.ActivityId).FirstAsync(); if (activity == null) { return(new BookingResponse(400, "Activity does not exist")); } var date = DateTime.Now; // Check if year is in the before or more than 1 year after current year if (model.Year < date.Year || model.Year > date.Year + 1) { return(new BookingResponse(400, "Year must be current or next year")); } // Check if week is before current week if (model.Year == date.Year && model.Week < ISOWeek.GetWeekOfYear(date)) { return(new BookingResponse(400, "Week must be in the future")); } // Check if week is less than 1 if (model.Week < 1) { return(new BookingResponse(400, "Week must be at least 1")); } var numberOfWeeks = ISOWeek.GetWeeksInYear(model.Year); // Check if week is more than number of weeks in given year if (model.Week > numberOfWeeks) { return(new BookingResponse(400, "Week must be at most " + numberOfWeeks)); } // Calculate from and to dates for use in query var centralEuropean = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); var now = TimeZoneInfo.ConvertTime(DateTime.Now, centralEuropean); var startOfWeek = ISOWeek.ToDateTime(model.Year, model.Week, DayOfWeek.Monday); var from = now > startOfWeek ? now : startOfWeek; var nextWeek = model.Week == numberOfWeeks ? 1 : model.Week + 1; var newYear = model.Week == numberOfWeeks ? model.Year + 1 : model.Year; var to = ISOWeek.ToDateTime(newYear, nextWeek, DayOfWeek.Monday); // Get bookings in given week from now var bookings = activity.Bookings.Where(b => b.Start >= from && b.Start < to); var openHours = activity.Close - activity.Open; var times = new int[7][]; // Generate array with all bookings in a week for (var i = 0; i < 7; i++) { times[i] = new int[openHours]; for (var j = 0; j < openHours; j++) { var dateTime = startOfWeek.AddDays(i).AddHours(activity.Open + j); if (now > dateTime) { times[i][j] = 2; } } } // Go through bookings and set times as booked foreach (var booking in bookings) { var current = booking.Start; while (current < booking.End) { var day = GetDayOfWeek(current.DayOfWeek); var hour = current.Hour - activity.Open; if (times[day][hour] != 2) { times[day][hour] = 1; } current = current.AddHours(1); } } return(new BookingResponse(times)); }
public static void Main() { Console.WriteLine(ISOWeek.GetWeeksInYear(2009)); // returns 53 }