public SearchVenue GetPlacePrice(SearchVenue searchVenue, List <EventDetail> eventDetails, List <EventTicketDetail> eventTicketDetails, List <TicketCategory> ticketCategories, List <EventTicketAttribute> eventTicketAttributes ) { try { var adultCategories = ticketCategories.Where((item) => { // check is adult exists return(item.Name.ToLower().Contains("adult")); }); var childCategories = ticketCategories.Where((item) => { // check if child exists return(item.Name.ToLower().Contains("child")); }); var adultPriceModel = new PriceModel(); var childPriceModel = new PriceModel(); if (adultCategories.Count() > 0) { // if adult exists then pick base price of adult adultPriceModel = filterPrices(adultCategories.ToList(), eventTicketDetails, eventTicketAttributes); } if (childCategories.Count() > 0) { // if child exists then pick base price of child childPriceModel = filterPrices(childCategories.ToList(), eventTicketDetails, eventTicketAttributes); } if (adultCategories.Count() == 0 || childCategories.Count() == 0) { // if adult or child not exists then pick the base price of place var currentPriceModel = filterEtabyPrice(eventTicketAttributes); if (childCategories.Count() == 0) { childPriceModel = currentPriceModel; } if (adultCategories.Count() == 0) { adultPriceModel = currentPriceModel; } } if (eventDetails.Count() == 0 || eventTicketDetails.Count() == 0 || eventTicketAttributes.Count() == 0) { return(searchVenue); } else { searchVenue.AdultETAId = adultPriceModel.EtaId; searchVenue.ChildETAId = childPriceModel.EtaId; searchVenue.AdultPrice = Decimal.Parse(adultPriceModel.Price.ToString("0.00")); searchVenue.ChildPrice = Decimal.Parse(childPriceModel.Price.ToString("0.00")); searchVenue.Price = searchVenue.AdultPrice + searchVenue.ChildPrice; } return(searchVenue); } catch (Exception e) { _logger.Log(Logging.Enums.LogCategory.Error, e); return(searchVenue); } }
SearchVenue GetLastPlace(SearchVenue lastPlace, List <SearchVenue> currentDayList) { if (lastPlace.Id == 0) { lastPlace = currentDayList.FirstOrDefault(); } return(lastPlace); }
List <SearchVenue> PushVenue(SearchVenue cardModel, List <SearchVenue> dayByDayList, int position) { ArrayList arrayList = new ArrayList(dayByDayList); arrayList.Insert(Convert.ToInt16(position), cardModel); var currentDayList = arrayList.Cast <SearchVenue>().ToList(); return(currentDayList); }
public SearchVenueQueryResult Handle(SearchVenueQuery query) { List <FIL.Contracts.DataModels.SearchVenue> VenueResult = new List <Contracts.DataModels.SearchVenue>(); try { var citiesArray = query.CityName != null?query.CityName.Split(",") : null; var eventCategoriesRepositoryData = _eventCategoryRepository.GetAll().Where(s => s.IsFeel == true); var categories = query.Categories != null?query.Categories.Split(",") : null; List <long> categoryList = new List <long>(); if (categories != null && categories.Count() > 0 && query.PlaceId == 0) { foreach (var item in categories) { try { var categoryInfo = eventCategoriesRepositoryData.FirstOrDefault(x => x.DisplayName == item).Id; categoryList.Add(categoryInfo); } catch (Exception ex) { _logger.Log(Logging.Enums.LogCategory.Error, ex); } } } else if (categories != null && categories.Count() == 0 && query.PlaceId == 0) { var categoryInfo = eventCategoriesRepositoryData.FirstOrDefault(x => x.DisplayName == query.Categories).Id; categoryList.Add(categoryInfo); } var cityLists = query.CityIds != null?_cityRepository.GetByCityIds(query.CityIds) : null; var itineraryPlaces = query.PlaceId == 0 ? _eventRepository.GetAllItineraryPlaces(cityLists.Select(s => s.Id).ToList(), categoryList).GroupBy(x => x.Id, (key, group) => group.First()) : _eventRepository.GetItinerarySearchPlaces(query.PlaceId).GroupBy(x => x.Id, (key, group) => group.First()); var placeWeekOpenDayList = _placeWeekOpenDaysRepository.GetByEventIds(itineraryPlaces.Select(s => (long)s.Id).Distinct().ToList()); var dayTimeMappingLists = _dayTimeMappingsRepository.GetAllByPlaceWeekOpenDays(placeWeekOpenDayList.Select(s => (long)s.Id).Distinct().ToList()); var placeHolidayDatesRepositoryLists = _placeHolidayDatesRepository.GetAllByEventIds(itineraryPlaces.Select(s => (long)s.Id).Distinct().ToList()); var placeVisitDurationRepositoryLists = _PlaceVisitDurationRepository.GetByEventIds(itineraryPlaces.Select(s => (long)s.Id).Distinct().ToList()); var eventDetails = _eventDetailRepository.GetByEventIds(itineraryPlaces.Select(s => (long)s.Id).Distinct().ToList()).Where(s => s.IsEnabled == true); var eventTicketDetails = _eventTicketDetailRepository.GetByEventDetailIds(eventDetails.Select(s => (long)s.Id).Distinct().ToList()).Where(s => s.IsEnabled == true); var eventTicketAttributes = _eventTicketAttributeRepository.GetByEventTicketDetailIds(eventTicketDetails.Select(s => (long)s.Id).Distinct().ToList()).Where(s => s.IsEnabled == true); var ticketCategories = _ticketCategoryRepository.GetByTicketCategoryIds(eventTicketDetails.Select(s => (long)s.TicketCategoryId).Distinct().ToList()); var Days = _daysRepository.GetAll(); foreach (var currentPlace in itineraryPlaces) { var PlaceVisitDuration = placeVisitDurationRepositoryLists.FirstOrDefault(x => x.EventId == currentPlace.Id); var placeWeekOpenDays = placeWeekOpenDayList.Where(x => x.EventId == currentPlace.Id); var dayTimeMappings = dayTimeMappingLists.Where(s => placeWeekOpenDays.Any(p => p.Id == s.PlaceWeekOpenDayId)); SearchVenue searchVenue = new SearchVenue(); searchVenue.CategoryName = currentPlace.Category; searchVenue.EventId = currentPlace.Id; searchVenue.CityId = currentPlace.CityId; searchVenue.EventSource = currentPlace.EventSource; searchVenue.CityName = currentPlace.CityName; searchVenue.CountryName = currentPlace.CountryName; searchVenue.Currency = currentPlace.Currency; searchVenue.EventName = currentPlace.Name; searchVenue.EventAltId = currentPlace.AltId; searchVenue.EventSlug = currentPlace.Slug; searchVenue.Address = (currentPlace.AddressLineOne == null ? string.Empty : currentPlace.AddressLineOne) + "," + (currentPlace.AddressLineTwo == null ? string.Empty : currentPlace.AddressLineTwo); searchVenue.Id = currentPlace.Id; searchVenue.PlaceWeekOpenDays = placeWeekOpenDays.ToList(); searchVenue.DayTimeMappings = dayTimeMappings.ToList(); searchVenue.PlaceHolidaysList = placeHolidayDatesRepositoryLists.Where(x => x.EventId == currentPlace.Id).ToList(); searchVenue.EventDescription = currentPlace.EventDescription; searchVenue.EventDetails = eventDetails.Where(x => x.EventId == currentPlace.Id).ToList(); searchVenue.EventTicketDetails = eventTicketDetails.Where(x => searchVenue.EventDetails.Any(s => s.Id == x.EventDetailId)).ToList(); searchVenue.EventTicketAttributes = eventTicketAttributes.Where(x => searchVenue.EventTicketDetails.Any(s => s.Id == x.EventTicketDetailId)).ToList(); searchVenue.ticketCategories = ticketCategories.Where(x => searchVenue.EventTicketDetails.Any(s => s.TicketCategoryId == x.Id)).ToList(); if (currentPlace.Latitude != null) { var latArr = currentPlace.Latitude.Split("E"); var longArr = currentPlace.Longitude.Split("E"); searchVenue.Latitude = latArr[0]; searchVenue.Longitude = longArr[0]; } else { searchVenue.Latitude = null; searchVenue.Longitude = null; } VenueResult.Add(searchVenue); } return(new SearchVenueQueryResult() { Venues = VenueResult.Distinct().ToList(), Days = Days.ToList() }); } catch (Exception e) { return(new SearchVenueQueryResult() { Venues = VenueResult.Distinct().ToList() }); } }
public async Task <ItineraryBoardResponseViewModel> GetItineraryBoardData([FromBody] ItineraryBoardViewModel model) { var searchVenueList = new List <List <SearchVenue> >(); List <List <SearchVenue> > searchModel = new List <List <SearchVenue> >(); searchModel.AddRange(model.ItineraryBoardCopyData.ToList()); var lastPlace = new SearchVenue(); var endTimeOfDay = "20"; var index = -1; try { var sourcelane = model.IsAddNew ? null : model.RootObject.Lanes.Where(s => s.id == model.SourceLaneId).FirstOrDefault(); var tagrgetlane = model.IsAddNew ? null : model.RootObject.Lanes.Where(s => s.id == model.TargetLaneId).FirstOrDefault(); var sourceDate = model.IsAddNew ? null : sourcelane.label.Split(" ").FirstOrDefault(); var targetDate = model.IsAddNew ? null : tagrgetlane.label.Split(" ").FirstOrDefault(); var cardIndex = model.IsAddNew ? 0 : model.RootObject.Lanes.Where(s => s.Cards.Any(p => p.id == model.CardId)).FirstOrDefault().Cards.FindIndex(p => p.id == model.CardId); if (!model.IsAddNew && (model.SourceLaneId == model.TargetLaneId) && model.Position == cardIndex && !model.IsDelete) { return(new ItineraryBoardResponseViewModel { Success = true, IsSourceCountZero = false, IsValidDandD = false, ItineraryBoardData = model.ItineraryBoardData }); } if (!model.IsAddNew && sourcelane.Cards.Count() == 0) { return(new ItineraryBoardResponseViewModel { Success = false, IsSourceCountZero = true, IsValidDandD = false, ItineraryBoardData = model.ItineraryBoardData }); } if (!model.IsAddNew && Convert.ToInt16(sourceDate) < 10) { sourceDate = "0" + sourceDate; } if (!model.IsAddNew && Convert.ToInt16(targetDate) < 10) { targetDate = "0" + targetDate; } var cardModel = model.IsAddNew ? null : model.ItineraryBoardData.Where(s => s.Any(p => p.PlaceVisitDate.Split("-").ElementAt(2) == sourceDate)).FirstOrDefault().Where(s => s.Id == Convert.ToInt16(model.CardId)).FirstOrDefault(); var responseModel = model.IsAddNew ? null : CheckDiffCityDrag(model.ItineraryBoardCopyData, sourceDate, targetDate); if (!model.IsAddNew && !responseModel.Success) { return(responseModel); } if (model.IsAddNew) { var veneueResultFromQuerySender = await _querySender.Send(new SearchVenueQuery { PlaceId = model.PlaceId }); var data = model.ItineraryBoardData.Where(s => s.Any(x => x.CityId == veneueResultFromQuerySender.Venues.FirstOrDefault().CityId)); var isAdded = false; foreach (var dayByDayList in model.ItineraryBoardData) { var currentDayByDayList = new List <SearchVenue>(); if (dayByDayList.Any(s => s.CityId == veneueResultFromQuerySender.Venues.FirstOrDefault().CityId) && dayByDayList.Count() < 5 && !isAdded) { isAdded = true; var currentDayList = dayByDayList; var startTime = GetCurrnetTimeSpan(dayByDayList.FirstOrDefault().StartTime); int rand = new Random().Next(dayByDayList.Count()); veneueResultFromQuerySender.Venues.FirstOrDefault().PlaceVisitDate = dayByDayList.FirstOrDefault().PlaceVisitDate; currentDayList = PushVenue(veneueResultFromQuerySender.Venues.FirstOrDefault(), currentDayList, rand); currentDayList.FirstOrDefault().StartTime = startTime.ToString(); currentDayList.FirstOrDefault().EndTime = startTime.Add(new TimeSpan(1, 0, 0)).ToString(); currentDayByDayList.Add(currentDayList.FirstOrDefault()); lastPlace = GetLastPlace(lastPlace, currentDayList); var currentTime = startTime.Add(new TimeSpan(1, 0, 0)); foreach (var currentPlace in currentDayList.Skip(1)) { var responseViewModel = RegulizeDayCalendar(model.ItineraryBoardCopyData, lastPlace, currentPlace, currentTime, endTimeOfDay, true); if (!responseViewModel.Success) { isAdded = false; currentDayByDayList = new List <SearchVenue>(); currentDayByDayList.AddRange(model.ItineraryBoardCopyData.Where(s => s.Any(x => x.PlaceVisitDate == dayByDayList.FirstOrDefault().PlaceVisitDate)).First()); break; } currentTime = GetCurrnetTimeSpan(responseViewModel.CurrentPlace.EndTime); currentDayByDayList.Add(currentPlace); lastPlace = currentPlace; } } else { currentDayByDayList.AddRange(dayByDayList); } searchVenueList.Add(currentDayByDayList); } return(new ItineraryBoardResponseViewModel { Success = isAdded, IsSourceCountZero = false, IsTargetDateExceed = false, IsValidDandD = true, ItineraryBoardData = searchVenueList }); } foreach (var dayByDayList in model.ItineraryBoardData) { index += 1; var currentDayByDayList = new List <SearchVenue>(); if (index == Convert.ToInt16(model.TargetLaneId) && !model.IsDelete) { cardModel.PlaceVisitDate = dayByDayList.FirstOrDefault().PlaceVisitDate; var startTime = GetCurrnetTimeSpan(dayByDayList.FirstOrDefault().StartTime); var currentDayList = dayByDayList; if (model.SourceLaneId == model.TargetLaneId) { currentDayList = currentDayList.Where(s => s.Id != Convert.ToInt16(model.CardId)).ToList(); } currentDayList = PushVenue(cardModel, currentDayList, model.Position); currentDayList.FirstOrDefault().StartTime = startTime.ToString(); currentDayList.FirstOrDefault().EndTime = startTime.Add(new TimeSpan(2, 0, 0)).ToString(); currentDayByDayList.Add(currentDayList.FirstOrDefault()); lastPlace = GetLastPlace(lastPlace, currentDayList); var currentTime = startTime.Add(new TimeSpan(2, 0, 0)); foreach (var currentPlace in currentDayList.Skip(1)) { var responseViewModel = RegulizeDayCalendar(model.ItineraryBoardCopyData, lastPlace, currentPlace, currentTime, endTimeOfDay); if (!responseViewModel.Success) { return(responseViewModel); } currentTime = GetCurrnetTimeSpan(responseViewModel.CurrentPlace.EndTime); currentDayByDayList.Add(currentPlace); lastPlace = currentPlace; } } if (index == Convert.ToInt16(model.SourceLaneId) && model.SourceLaneId != model.TargetLaneId && !model.IsDelete) { var startTime = GetCurrnetTimeSpan(dayByDayList.FirstOrDefault().StartTime); lastPlace = GetLastPlace(lastPlace, dayByDayList); var currentDayList = dayByDayList.Where(s => s.Id != Convert.ToInt16(model.CardId)); var currentTime = startTime; foreach (var currentPlace in currentDayList) { var responseViewModel = RegulizeDayCalendar(model.ItineraryBoardCopyData, lastPlace, currentPlace, currentTime, endTimeOfDay); if (!responseViewModel.Success) { return(responseViewModel); } currentTime = GetCurrnetTimeSpan(responseViewModel.CurrentPlace.EndTime); currentDayByDayList.Add(currentPlace); lastPlace = currentPlace; } } else if (((index != Convert.ToInt16(model.SourceLaneId)) && (index != Convert.ToInt16(model.TargetLaneId)))) { currentDayByDayList.AddRange(dayByDayList); } else if (model.IsDelete) { var iscardDelete = dayByDayList.Where(s => s.Id == Convert.ToInt16(model.CardId)).Any(); var currentDayList = dayByDayList.ToList(); var startTime = GetCurrnetTimeSpan(dayByDayList.FirstOrDefault().StartTime); var currentSearchVenue = dayByDayList.Where(s => s.Id == Convert.ToInt16(model.CardId)).FirstOrDefault(); if (iscardDelete) { currentDayList.RemoveAt(dayByDayList.FindIndex(s => s.Id == Convert.ToInt16(model.CardId))); } currentDayList.FirstOrDefault().StartTime = startTime.ToString(); currentDayList.FirstOrDefault().EndTime = startTime.Add(new TimeSpan(2, 0, 0)).ToString(); if (lastPlace.Id == 0) { lastPlace = currentDayList.FirstOrDefault(); } currentDayByDayList.Add(currentDayList.FirstOrDefault()); var currentTime = startTime.Add(new TimeSpan(2, 0, 0)); foreach (var currentPlace in currentDayList.Skip(1)) { var responseViewModel = RegulizeDayCalendar(model.ItineraryBoardCopyData, lastPlace, currentPlace, currentTime, endTimeOfDay); if (!responseViewModel.Success) { return(responseViewModel); } currentTime = GetCurrnetTimeSpan(responseViewModel.CurrentPlace.EndTime); currentDayByDayList.Add(currentPlace); lastPlace = currentPlace; } } searchVenueList.Add(currentDayByDayList); } } catch (Exception e) { _logger.Log(Logging.Enums.LogCategory.Error, e); return(new ItineraryBoardResponseViewModel { Success = false, IsSourceCountZero = false, IsValidDandD = false, ItineraryBoardData = searchModel }); } return(new ItineraryBoardResponseViewModel { Success = true, IsSourceCountZero = false, IsTargetDateExceed = false, IsValidDandD = true, ItineraryBoardData = searchVenueList }); }
ItineraryBoardResponseViewModel RegulizeDayCalendar(List <List <SearchVenue> > searchModel, SearchVenue lastPlace, SearchVenue currentPlace, TimeSpan currentTime, string endTimeOfDay, bool isRandom = false) { var visitMinutes = 60; var visitTimes = new List <int>() { 0, 30, 45, 60 }; if (isRandom) { visitMinutes = visitTimes.ElementAt(new Random().Next(4)); } var result = _visitDurationProvider.GetDistance((lastPlace.Address), (currentPlace.Address)); var durationTime = _durationTimeProvider.DurationTime(result); var durationValue = GetDurationTime(result); var currentDate = new DateTime(Convert.ToInt16(currentPlace.PlaceVisitDate.Split("-").ElementAt(0)), Convert.ToInt16(currentPlace.PlaceVisitDate.Split("-").ElementAt(1)), Convert.ToInt16(currentPlace.PlaceVisitDate.Split("-").ElementAt(2))); var currentDateTime = new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, (int)currentTime.Hours, currentTime.Minutes, currentTime.Seconds); currentTime = currentTime.Add(new TimeSpan(0, durationTime.DurationTime + 30, 0)); var totalMinutes = (int)(currentTime + new TimeSpan(0, 30, 0)).TotalMinutes; currentTime = new TimeSpan(0, totalMinutes - totalMinutes % 30, 0); var journeyDateTime = currentDateTime.AddMinutes(durationTime.DurationTime + 30); // Add Timespan of the total journey if (currentDateTime.Date != journeyDateTime.Date) { return(new ItineraryBoardResponseViewModel { Success = false, IsSourceCountZero = true, IsValidDandD = false, IsTargetDateExceed = true, ItineraryBoardData = searchModel }); } if (currentTime.Add(new TimeSpan(1, visitMinutes, 0)) > TimeSpan.Parse(endTimeOfDay + ":00")) { return(new ItineraryBoardResponseViewModel { Success = false, IsSourceCountZero = true, IsValidDandD = false, IsTargetDateExceed = true, ItineraryBoardData = searchModel }); } currentPlace.StartTime = currentTime.ToString(); currentPlace.EndTime = currentTime.Add(new TimeSpan(1, visitMinutes, 0)).ToString(); currentPlace.PlaceVisitDuration = durationValue; currentPlace.TravelDuration = durationValue; return(new ItineraryBoardResponseViewModel { Success = true, IsSourceCountZero = false, IsValidDandD = false, IsTargetDateExceed = true, ItineraryBoardData = searchModel, CurrentPlace = currentPlace }); }