Esempio n. 1
0
        public decimal CalculateFinalPrice(TourSearchRequest request, List <TourRecord> records)
        {
            decimal FinalPrice = 0;

            for (int i = 0; i < records.Count(); i++)
            {
                if (records[i].Country == request.ToCountry)
                {
                    for (int j = 0; j < records[i].StartTimes.Length; j++)
                    {
                        if (records[i].StartTimes[j] == request.DepartureDate)
                        {
                            FinalPrice += records[i].BasePriceForPerson * request.PersonCount;

                            DateTime date1 = records[i].StartTimes[j];
                            DateTime date2 = DateTime.Now;
                            TimeSpan span  = date1 - date2;
                            double   days  = span.TotalDays;

                            if (days < 10)
                            {
                                FinalPrice += FinalPrice * 10 / 100;
                            }
                            if (records[i].PlacesLeft[j] < 3)
                            {
                                FinalPrice += FinalPrice * 15 / 100;
                            }
                        }
                    }
                }
            }

            return(FinalPrice);
        }
Esempio n. 2
0
        public async Task <TourSearchResponse> SearchAsync(TourSearchRequest tourSearchRequest)
        {
            var cts = new CancellationTokenSource();

            var standartProviderSearchTask = _standartProvider.SearchAsync(tourSearchRequest, cts.Token);
            var otherProviderSearchTask    = _otherProvider.SearchAsync(tourSearchRequest, cts.Token);

            var searchTasks = new[] { standartProviderSearchTask, otherProviderSearchTask };
            await Task.WhenAny(Task.WhenAll(searchTasks), Task.Delay(_settings.MaxWaitTime));

            cts.Cancel();

            var completedResults =
                searchTasks
                .Where(t => t.Status == TaskStatus.RanToCompletion)
                .Select(t => t.Result)
                .ToList();

            var tours = completedResults
                        .SelectMany(x => x)
                        .GroupBy(x => x, Tour.TourComparer)
                        .Select(tourGroup =>
            {
                if (tourGroup.Count() == 1)
                {
                    return(tourGroup.First());
                }

                var minPriceTour = tourGroup.OrderBy(x => x.TotalPrice).First();
                var preferedTour = tourGroup.FirstOrDefault(x => x.Provider.Equals(_settings.PreferedProviderName));

                if (preferedTour != null && preferedTour.TotalPrice < minPriceTour.TotalPrice * _settings.MaxPreferedProviderPriceFactor)
                {
                    return(preferedTour);
                }
                else
                {
                    return(minPriceTour);
                }
            })
                        .AsQueryable()
                        .ApplySorting(tourSearchRequest)
                        .ToList();

            var result = new TourSearchResponse
            {
                Status = "xz",
                Tours  = tours
            };

            return(result);
        }
Esempio n. 3
0
        public List <TourSearchResponse> GetTourSearchResponse(TourSearchRequest request)
        {
            List <TourRecord> filteredTourRecords = FilterByCriteria(request);
            decimal           FinalPrice          = CalculateFinalPrice(request, filteredTourRecords);

            List <TourSearchResponse> responses = new List <TourSearchResponse>();

            for (int i = 0; i < filteredTourRecords.Count; i++)
            {
                responses.Add(new TourSearchResponse(filteredTourRecords[i].Name, filteredTourRecords[i].City, CalculateTourPopularity(filteredTourRecords[i]), FinalPrice));
            }
            return(responses);
        }
Esempio n. 4
0
        public void Should_Find_ByCriteria()
        {
            // Arrange
            TourStorage storage = new TourStorage();

            storage.AddTour(new TourRecord
                            (
                                1,
                                "Tour to Japan, Kyoto",
                                "Japan",
                                "Kyoto",
                                new DateTime[] { new DateTime(2018, 08, 11) },
                                new int[] { 7 },
                                new int[] { 4 },
                                4,
                                800000
                            ));
            storage.AddTour(new TourRecord
                            (
                                2,
                                "Tour to USA, Virginia",
                                "USA",
                                "Virginia",
                                new DateTime[] { new DateTime(2018, 07, 11) },
                                new int[] { 11 },
                                new int[] { 5 },
                                8,
                                300000
                            ));
            storage.AddTour(new TourRecord
                            (
                                3,
                                "Tour to USA, Virginia",
                                "USA",
                                "Virginia",
                                new DateTime[] { new DateTime(2018, 07, 25) },
                                new int[] { 12 },
                                new int[] { 7 },
                                8,
                                350000
                            ));

            TourService       service = new TourService(storage);
            TourSearchRequest request = new TourSearchRequest("Japan", new DateTime(2018, 08, 10), 2, 3);

            // Act
            List <TourRecord> filtered = service.FilterByCriteria(request);

            // Assert
            Assert.IsTrue(filtered[0].City == "Kyoto");
        }
Esempio n. 5
0
        public async Task <List <Tour> > SearchAsync(TourSearchRequest tourSearchRequest, CancellationToken cancellationToken)
        {
            var tours = _tourRepository.Tours
                        .Where(tourSearchRequest.Criteria)
                        .ApplySorting(tourSearchRequest)
                        .Take(_settings.ToursPackSize)
                        .ToList();

            var personCount = tourSearchRequest.PersonCount.GetValueOrDefault(_settings.DefaultPersonCount);
            await tours.ForEachAsync(Environment.ProcessorCount, x => _priceCalculator.CalculatePrice(x, personCount));

            var random = new Random((int)DateTime.Now.Ticks);
            await Task.Delay(random.Next(3000, 17000), cancellationToken);

            return(tours);
        }
Esempio n. 6
0
        public void BuyTicket(TourSearchRequest request)
        {
            List <TourRecord> allTours = _tourStorage.ReadAllTours();

            for (int i = 0; i < allTours.Count; i++)
            {
                if (allTours[i].Country == request.ToCountry)
                {
                    for (int j = 0; j < allTours[i].StartTimes.Length; j++)
                    {
                        if (allTours[i].StartTimes[j] == request.DepartureDate)
                        {
                            allTours[i].PlacesLeft[j] -= request.PersonCount;
                        }
                    }
                }
            }
        }
Esempio n. 7
0
        public List <TourRecord> FilterByCriteria(TourSearchRequest request)
        {
            var allTours = _tourStorage.ReadAll()
                           .Where(x => x.Country == request.ToCountry &&
                                  x.MaxPersonsAllowed >= request.PersonCount);

            List <TourRecord> filteredTourRecords = new List <TourRecord>();

            foreach (var item in allTours)
            {
                foreach (var date in item.StartTimes)
                {
                    for (int i = -request.DepartureDateOffset; i <= request.DepartureDateOffset; i++)
                    {
                        if (request.DepartureDate.AddDays(i) == date)
                        {
                            filteredTourRecords.Add(item);
                        }
                    }
                }
            }
            return(filteredTourRecords);
        }
Esempio n. 8
0
        public async Task <IActionResult> SearchAsync([FromBody] TourSearchRequest tourSearchRequest)
        {
            var tourSearchResponse = await _searchService.SearchAsync(tourSearchRequest);

            return(Ok(tourSearchResponse));
        }