public IActionResult GetFreeCourtsFromToExclude([FromBody] ReservationDto reservation)
        {
            if (reservation == null)
            {
                return(BadRequest(reservation));
            }

            ReservationRequest res;

            try
            {
                res = new ReservationRequest(reservation);
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }

            _logger.LogInformation($"Squash Controller is reqesting Free Courts from: {res.FromTime} to: {res.ToTime} for: {res.Duration}");
            List <CourtDto> korty = _squash.GetFreeSquashCourts(res);

            if (korty.Count() > 0 && res.isLogged())
            {
                var kort     = korty.FirstOrDefault();
                var freeTime = kort.Free.FirstOrDefault();
                int lenght   = (res.Duration.Hours * 60 + res.Duration.Minutes) / 30;
                kort.Free.Clear();

                for (int i = 0; i < lenght; i++)
                {
                    var time = new FreeHoursDto()
                    {
                        From = freeTime.From.AddMinutes(i * 30), To = freeTime.From.AddMinutes((i * 30) + 30)
                    };
                    kort.Free.Add(time);
                }

                var book             = GenerateBookRequest(kort, res);
                var rezerwujResponse = _squash.RezerwujTest(book);

                if (rezerwujResponse != null && rezerwujResponse.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    kort.Booked = true;
                    var restult = new List <CourtDto>();
                    restult.Add(kort);
                    return(Ok(restult));
                }
            }

            _messanger.Send("### Squash Team", $"API found {korty.Count()} free squash courts ###");
            return(Ok(korty));
        }
        public BookRequestDto GenerateBookRequest(CourtDto kort, ReservationRequest res)
        {
            var freeTime = new FreeHoursDto()
            {
                From = kort.Free.FirstOrDefault().From, To = kort.Free.FirstOrDefault().To
            };
            var bookRequest = new BookRequestDto(res);
            int lenght      = (res.Duration.Hours * 60 + res.Duration.Minutes) / 30;

            string[] tmpRez = new string[lenght];
            string   tmp    = String.Empty;

            for (int i = 0; i < lenght; i++)
            {
                tmp           = $"{kort.ObkietId}_{freeTime.From.Hour}:{freeTime.From.Minute.ToString("D2")}_";
                freeTime.From = freeTime.From.AddMinutes(30);
                tmp          += $"{freeTime.From.Hour}:{freeTime.From.Minute.ToString("D2")}";

                tmpRez[i] = tmp;
            }

            bookRequest.Rez = tmpRez;
            return(bookRequest);
        }
Exemple #3
0
        private List <CourtDto> GetFreeCourts(List <CourtDto> FreeCourts, DateTime fromTime, DateTime toTime, TimeSpan duration)
        {
            var result = FreeCourts.SelectMany(c => c.Free, (court, freeHours) => new { court, freeHours })
                         .Where(courtAndHours => courtAndHours.freeHours.From >= fromTime && courtAndHours.freeHours.To <= toTime)
                         .Select(courtAndHours =>
                                 new
            {
                Number = courtAndHours.court.Number + "_" + courtAndHours.court.ObkietId,
                Free   = new FreeHoursDto()
                {
                    From = courtAndHours.freeHours.From,
                    To   = courtAndHours.freeHours.To
                }
            }
                                 ).GroupBy(c => c.Number,
                                           c => c.Free,
                                           (groupKey, Free) => new
            {
                Number = groupKey,
                Free
            });

            if (result == null)
            {
                return(null);
            }

            List <CourtDto> korty = new List <CourtDto>();
            CourtDto        curCourt = null;
            string          num, obiekt;
            int             index;

            foreach (var kort in result)
            {
                index  = kort.Number.IndexOf("_");
                num    = kort.Number.Substring(0, index);
                obiekt = kort.Number.Substring(index + 1);

                curCourt = new CourtDto()
                {
                    Number = Int32.Parse(num), ObkietId = Int32.Parse(obiekt), Free = new List <FreeHoursDto>()
                };
                FreeHoursDto prevTime = null;

                foreach (var curTime in kort.Free)
                {
                    if (prevTime is null)
                    {
                        prevTime = curTime;
                    }
                    else
                    {
                        if (curTime.From == prevTime.To)
                        {
                            prevTime.To = curTime.To;
                        }
                        else
                        {
                            if (prevTime.AvailableTime >= duration)
                            {
                                curCourt.Free.Add(prevTime);
                            }

                            prevTime = curTime;
                        }
                    }
                }

                if (prevTime.AvailableTime >= duration)
                {
                    curCourt.Free.Add(prevTime);
                }

                if (curCourt.Free.Count() > 0)
                {
                    korty.Add(curCourt);
                }
            }

            return(korty);
        }