예제 #1
0
        public virtual StoreViewModel CreateStoreViewModel(CreateStoreViewModelParam param)
        {
            var store          = param.Store;
            var storeViewModel = ViewModelMapper.MapTo <StoreViewModel>(store, param.CultureInfo);

            storeViewModel.Address = CreateStoreAddressViewModel(param);
            storeViewModel.LocalizedDisplayName  = GetStoreLocalizedDisplayName(storeViewModel, param.CultureInfo);
            storeViewModel.FulfillmentLocationId = store.FulfillmentLocation.Id;
            storeViewModel.GoogleDirectionsLink  = GetGoogleDirectionsLink(storeViewModel.Address);
            storeViewModel.GoogleStaticMapUrl    = GetGoogleStaticMapUrl(storeViewModel.Address);

            storeViewModel.Url = StoreUrlProvider.GetStoreUrl(new GetStoreUrlParam()
            {
                BaseUrl     = param.BaseUrl,
                CultureInfo = param.CultureInfo,
                StoreNumber = store.Number,
                StoreName   = storeViewModel.Name
            });

            if (param.SearchPoint != null && storeViewModel.Address.Latitude != null &&
                storeViewModel.Address.Longitude != null)
            {
                storeViewModel.DestinationToSearchPoint = Math.Round(GeoCodeCalculator.CalcDistance(
                                                                         storeViewModel.Address.Latitude.Value, storeViewModel.Address.Longitude.Value,
                                                                         param.SearchPoint.Lat, param.SearchPoint.Lng, EarthRadiusMeasurement.Kilometers), 2);
            }

            storeViewModel.Schedule = CreateStoreScheduleViewModel(param);

            return(storeViewModel);
        }
예제 #2
0
        protected virtual string GetStoreCanonicalUrl(GetStorePageHeaderViewModelParam param, StoreViewModel store)
        {
            var relativeUri = StoreUrlProvider.GetStoreUrl(new GetStoreUrlParam
            {
                BaseUrl     = param.BaseUrl,
                CultureInfo = param.CultureInfo,
                StoreNumber = param.StoreNumber,
                StoreName   = store.Name
            });

            if (HttpContext.Current == null)
            {
                Log.Error("HttpContext.Current is null");
                return(relativeUri);
            }

            try
            {
                var baseUri = RequestUtils.GetBaseUrl(HttpContext.Current.Request.Url);
                var url     = new Uri(baseUri, relativeUri);

                return(url.ToString());
            }
            catch (Exception ex)
            {
                string fullStackTrace = ex.StackTrace + Environment.StackTrace;
                Log.Error($"Error retrieving store canonical url. Exception : {ex}, {fullStackTrace}");

                return(relativeUri);
            }
        }
예제 #3
0
        public virtual async Task <StoreDirectoryViewModel> GetStoreDirectoryViewModelAsync(GetStoresParam viewModelParam)
        {
            if (string.IsNullOrWhiteSpace(viewModelParam.Scope))
            {
                throw new ArgumentException("scope");
            }
            if (viewModelParam.CultureInfo == null)
            {
                throw new ArgumentNullException("cultureInfo");
            }
            if (string.IsNullOrWhiteSpace(viewModelParam.BaseUrl))
            {
                throw new ArgumentException("baseUrl");
            }

            var model = new StoreDirectoryViewModel();

            model.StoreLocatorPageUrl = StoreUrlProvider.GetStoreLocatorUrl(new GetStoreLocatorUrlParam
            {
                BaseUrl     = viewModelParam.BaseUrl,
                CultureInfo = viewModelParam.CultureInfo,
                Page        = 1
            });

            var overtureStores = await StoreRepository.GetStoresAsync(new GetStoresParam
            {
                CultureInfo = viewModelParam.CultureInfo,
                Scope       = viewModelParam.Scope,
                PageNumber  = 1,
                PageSize    = int.MaxValue
            }).ConfigureAwait(false);

            var sortedResults = SortStoreDirectoryResult(overtureStores.Results);

            //get result for currect page
            var totalCount = sortedResults.Count();
            var result     =
                sortedResults.Skip((viewModelParam.PageNumber - 1) * viewModelParam.PageSize)
                .Take(viewModelParam.PageSize).OrderBy(st => st.Name).ToList();

            var stores =
                result.Select(it => StoreViewModelFactory.CreateStoreViewModel(new CreateStoreViewModelParam
            {
                Store       = it,
                CultureInfo = viewModelParam.CultureInfo,
                BaseUrl     = viewModelParam.BaseUrl
            })).ToList();

            model.Pagination = BuildPagination(totalCount, viewModelParam);
            model.Groups     = await GetStoreDirectoryGroupsAsync(stores, viewModelParam);

            foreach (var countryGroup in model.Groups)
            {
                countryGroup.Anchors = await GetStoreDirectoryCountryGroupAnchorsAsync(sortedResults, countryGroup, viewModelParam);
            }

            return(model);
        }
 protected virtual string BuildUrl(string baseUrl, CultureInfo cultureInfo, Guid currentHomePageId, string storeName, string storeNumber)
 {
     return(StoreUrlProvider.GetStoreUrl(new GetStoreUrlParam
     {
         StoreNumber = storeNumber,
         CultureInfo = cultureInfo,
         BaseUrl = baseUrl,
         StoreName = storeName,
         WebsiteId = currentHomePageId
     }));
 }
        protected virtual string BuildUrl(string baseUrl, CultureInfo cultureInfo, string storeName, string storeNumber)
        {
            var storeUrl = StoreUrlProvider.GetStoreUrl(new GetStoreUrlParam
            {
                StoreNumber = storeNumber,
                CultureInfo = cultureInfo,
                BaseUrl     = baseUrl,
                StoreName   = storeName,
                WebsiteId   = SitemapNavigator.CurrentHomePageId
            });

            return(storeUrl);
        }
        public virtual ActionResult StoreLocatorInHeader()
        {
            var model = new StoreLocatorInHeaderViewModel
            {
                Url = StoreUrlProvider.GetStoreLocatorUrl(new GetStoreLocatorUrlParam
                {
                    BaseUrl     = RequestUtils.GetBaseUrl(Request).ToString(),
                    CultureInfo = ComposerContext.CultureInfo
                })
            };

            return(View("StoreLocatorInHeader", model));
        }
예제 #7
0
        protected virtual StorePaginationViewModel BuildPagination(int totalCount, GetStoresParam param)
        {
            StorePageViewModel prevPage = null, nextPage = null;

            if (param.PageSize * param.PageNumber < totalCount)
            {
                nextPage = new StorePageViewModel
                {
                    DisplayName = LocalizationProvider.GetLocalizedString(new GetLocalizedParam
                    {
                        Category    = "Store",
                        Key         = "B_PaginationNext",
                        CultureInfo = param.CultureInfo
                    }),
                    Url = StoreUrlProvider.GetStoresDirectoryUrl(new GetStoresDirectoryUrlParam
                    {
                        BaseUrl     = param.BaseUrl,
                        CultureInfo = param.CultureInfo,
                        Page        = param.PageNumber + 1
                    })
                };
            }
            if (param.PageNumber > 1)
            {
                prevPage = new StorePageViewModel
                {
                    DisplayName = LocalizationProvider.GetLocalizedString(new GetLocalizedParam
                    {
                        Category    = "Store",
                        Key         = "B_PaginationPrev",
                        CultureInfo = param.CultureInfo
                    }),
                    Url = StoreUrlProvider.GetStoresDirectoryUrl(new GetStoresDirectoryUrlParam
                    {
                        BaseUrl     = param.BaseUrl,
                        CultureInfo = param.CultureInfo,
                        Page        = param.PageNumber - 1
                    })
                };
            }
            var pager = new StorePaginationViewModel
            {
                PreviousPage = prevPage,
                NextPage     = nextPage
            };

            return(pager);
        }
        public virtual StoreViewModel CreateStoreViewModel(CreateStoreViewModelParam param)
        {
            var store          = param.Store;
            var storeViewModel = ViewModelMapper.MapTo <StoreViewModel>(store, param.CultureInfo);

            storeViewModel.Address = CreateStoreAddressViewModel(param);
            storeViewModel.LocalizedDisplayName  = GetStoreLocalizedDisplayName(storeViewModel, param.CultureInfo);
            storeViewModel.FulfillmentLocationId = store.FulfillmentLocation.Id;
            storeViewModel.GoogleDirectionsLink  = GetGoogleDirectionsLink(storeViewModel.Address);
            storeViewModel.GoogleStaticMapUrl    = GetGoogleStaticMapUrl(storeViewModel.Address);

            storeViewModel.Url = StoreUrlProvider.GetStoreUrl(new GetStoreUrlParam()
            {
                BaseUrl     = param.BaseUrl,
                CultureInfo = param.CultureInfo,
                StoreNumber = store.Number,
                StoreName   = storeViewModel.Name
            });

            if (param.SearchPoint != null && storeViewModel.Address.Latitude != null &&
                storeViewModel.Address.Longitude != null)
            {
                double earthRadius = GoogleMaps.GoogleMapsSettings.LengthMeasureUnit == Enums.LengthMeasureUnitEnum.km ? EarthRadiusMeasurement.Kilometers : EarthRadiusMeasurement.Miles;
                storeViewModel.DestinationToSearchPoint = Math.Round(GeoCodeCalculator.CalcDistance(
                                                                         storeViewModel.Address.Latitude.Value, storeViewModel.Address.Longitude.Value,
                                                                         param.SearchPoint.Lat, param.SearchPoint.Lng, earthRadius), 2);

                storeViewModel.LengthMeasureUnit = GoogleMaps.GoogleMapsSettings.LengthMeasureUnit.ToString();
            }

            storeViewModel.Schedule = CreateStoreScheduleViewModel(param);

            if (param.Store.FulfillmentLocation != null)
            {
                storeViewModel.SupportDelivery     = param.Store.FulfillmentLocation.SupportDelivery;
                storeViewModel.SupportPickUp       = param.Store.FulfillmentLocation.SupportPickUp;
                storeViewModel.InventoryLocationId = param.Store.FulfillmentLocation.InventoryLocationId;
            }

            return(storeViewModel);
        }
        protected virtual async Task <List <StoreDirectoryAnchorViewModel> > GetStoreDirectoryCountryGroupAnchorsAsync(
            IList <Overture.ServiceModel.Customers.Stores.Store> stores,
            StoreDirectoryGroupViewModel countryGroup,
            GetStoresParam viewModelParam)
        {
            var countryCode = countryGroup.Key.ToString();
            var anchors     = new SortedDictionary <string, StoreDirectoryAnchorViewModel>();
            int ind         = 0;

            foreach (var store in stores)
            {
                ind++;
                var region = store.FulfillmentLocation.Addresses[0].RegionCode;

                if (store.FulfillmentLocation.Addresses[0].CountryCode != countryCode || anchors.Keys.Contains(region))
                {
                    continue;
                }

                var pageNumber = GetTotalPages(ind, viewModelParam.PageSize);
                anchors.Add(region, new StoreDirectoryAnchorViewModel
                {
                    DisplayName = await CountryService.RetrieveRegionDisplayNameAsync(new RetrieveRegionDisplayNameParam
                    {
                        CultureInfo = viewModelParam.CultureInfo,
                        IsoCode     = countryCode,
                        RegionCode  = region
                    }),
                    Key = "#" + region,
                    Url = pageNumber == viewModelParam.PageNumber
                    ? string.Empty
                    : StoreUrlProvider.GetStoresDirectoryUrl(new GetStoresDirectoryUrlParam
                    {
                        BaseUrl     = viewModelParam.BaseUrl,
                        CultureInfo = viewModelParam.CultureInfo,
                        Page        = pageNumber
                    })
                });
            }
            return(anchors.Values.ToList());
        }
예제 #10
0
        public virtual StoreLocatorViewModel GetEmptyStoreLocatorViewModel(GetEmptyStoreLocatorViewModelParam viewModelParam)
        {
            if (string.IsNullOrWhiteSpace(viewModelParam.BaseUrl))
            {
                throw new ArgumentException(GetMessageOfNullWhiteSpace(nameof(viewModelParam.BaseUrl)), nameof(viewModelParam));
            }
            if (viewModelParam.CultureInfo == null)
            {
                throw new ArgumentException(GetMessageOfNull(nameof(viewModelParam.CultureInfo)), nameof(viewModelParam));
            }

            var model = new StoreLocatorViewModel
            {
                Stores             = new List <StoreViewModel>(),
                StoresDirectoryUrl = StoreUrlProvider.GetStoresDirectoryUrl(new GetStoresDirectoryUrlParam
                {
                    CultureInfo = viewModelParam.CultureInfo,
                    BaseUrl     = viewModelParam.BaseUrl,
                    Page        = 1
                })
            };

            return(model);
        }
예제 #11
0
        public virtual StoreStructuredDataViewModel CreateStoreStructuredDataViewModel(CreateStoreViewModelParam param)
        {
            var store = param.Store;
            var model = new StoreStructuredDataViewModel
            {
                Name      = store.Name,
                Telephone = store.PhoneNumber,
                Url       = StoreUrlProvider.GetStoreUrl(new GetStoreUrlParam()
                {
                    BaseUrl     = param.BaseUrl,
                    CultureInfo = param.CultureInfo,
                    StoreNumber = store.Number,
                    StoreName   = store.Name
                })
            };
            var address = store.FulfillmentLocation?.Addresses?.FirstOrDefault();

            if (address != null)
            {
                model.StreetAddress   = address.Line1;
                model.AddressLocality = address.City;
                model.AddressRegion   = address.RegionCode;
                model.AddressCountry  = address.CountryCode;
                model.PostalCode      = address.PostalCode;
                model.Longitude       = address.Longitude;
                model.Latitude        = address.Latitude;
                if (string.IsNullOrWhiteSpace(model.Telephone))
                {
                    model.Telephone = address.PhoneNumber;
                }
            }

            if (store.StoreSchedule != null)
            {
                //// fixed datetime formats based on https://developers.google.com/structured-data/local-businesses/
                var dataTimeFormat = @"hh\:mm\:ss";
                var dateFormat     = @"yyyy-MM-dd";
                model.OpeningHoursSpecifications = new List <StructuredDataOpeningHoursSpecificationViewModel>();
                var groups = store.StoreSchedule.OpeningHours
                             .Where(it => !it.IsClosed)
                             .GroupBy(
                    x =>
                    new
                {
                    x.OpeningTimes.FirstOrDefault()?.BeginingTime,
                    x.OpeningTimes.FirstOrDefault()?.EndingTime
                });
                foreach (var group in groups)
                {
                    var opens        = group.Key.BeginingTime ?? DateTime.Today.TimeOfDay;
                    var closes       = group.Key.EndingTime ?? DateTime.Today.AddTicks(-1).AddDays(1).TimeOfDay;
                    var openHourSpec = new StructuredDataOpeningHoursSpecificationViewModel
                    {
                        Opens      = opens.ToString(dataTimeFormat),
                        Closes     = closes.ToString(dataTimeFormat),
                        DayOfWeeks = new List <DayOfWeek>()
                    };
                    foreach (var item in group)
                    {
                        openHourSpec.DayOfWeeks.Add(item.Day);
                    }
                    model.OpeningHoursSpecifications.Add(openHourSpec);
                }

                var exceptions = StoreScheduleProvider.GetOpeningHourExceptions(store.StoreSchedule, DateTime.Today, 1);
                foreach (var item in exceptions)
                {
                    var opens        = item.IsClosed ? DateTime.Today.TimeOfDay : item.OpeningTime.BeginingTime;
                    var closes       = item.IsClosed ? DateTime.Today.AddSeconds(1).TimeOfDay : item.OpeningTime.EndingTime;
                    var openHourSpec = new StructuredDataOpeningHoursSpecificationViewModel
                    {
                        ValidFrom    = item.StartDate.ToString(dateFormat),
                        ValidThrough = item.EndDate.ToString(dateFormat),
                        Opens        = opens.ToString(dataTimeFormat),
                        Closes       = closes.ToString(dataTimeFormat),
                    };
                    model.OpeningHoursSpecifications.Add(openHourSpec);
                }
            }
            return(model);
        }