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));
        }
Пример #2
0
        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
 }