Its the cause which leads client to quit checkout.
I solved it by using cache
My solution if someone needs it :)
protected virtual async Task<CheckoutPickupPointsModel> PrepareCheckoutPickupPointsModelAsync(IList<ShoppingCartItem> cart)
{
var model = new CheckoutPickupPointsModel
{
AllowPickupInStore = _shippingSettings.AllowPickupInStore
};
if (!model.AllowPickupInStore)
return model;
model.DisplayPickupPointsOnMap = _shippingSettings.DisplayPickupPointsOnMap;
model.GoogleMapsApiKey = _shippingSettings.GoogleMapsApiKey;
var customer = await _workContext.GetCurrentCustomerAsync();
var store = await _storeContext.GetCurrentStoreAsync();
var pickupPointProviders = await _pickupPluginManager.LoadActivePluginsAsync(customer, store.Id);
if (pickupPointProviders.Any())
{
var languageId = (await _workContext.GetWorkingLanguageAsync()).Id;
var address = customer.BillingAddressId.HasValue
? await _addressService.GetAddressByIdAsync(customer.BillingAddressId.Value)
: null;
var pickupPointsResponse = await _shippingService.GetPickupPointsAsync(cart, address,
customer, storeId: store.Id);
if (pickupPointsResponse.Success)
model.PickupPoints = await PrepareCheckoutPickupPointListModelAsync(pickupPointsResponse.PickupPoints, languageId,store,customer);
else
foreach (var error in pickupPointsResponse.Errors)
model.Warnings.Add(error);
}
//only available pickup points
var shippingProviders = await _shippingPluginManager.LoadActivePluginsAsync(customer, store.Id);
if (!shippingProviders.Any())
{
if (!pickupPointProviders.Any())
{
model.Warnings.Add(await _localizationService.GetResourceAsync("Checkout.ShippingIsNotAllowed"));
model.Warnings.Add(await _localizationService.GetResourceAsync("Checkout.PickupPoints.NotAvailable"));
}
model.PickupInStoreOnly = true;
model.PickupInStore = true;
return model;
}
return model;
}
Helper functions
protected virtual async Task<List<CheckoutPickupPointModel>> PrepareCheckoutPickupPointListModelAsync(IList<PickupPoint> pickupPoints, int languageId, Store store, Customer customer) {
var cacheKey = _staticCacheManager.PrepareKeyForDefaultCache(NopModelCacheDefaults.PickUpPointsAllKey);
var points = await _staticCacheManager.GetAsync(cacheKey, async () => await PrepareCheckoutPickupPointListModelAsync(pickupPoints, languageId, store, customer, string.Empty));
return points;
}
protected virtual async Task<List<CheckoutPickupPointModel>> PrepareCheckoutPickupPointListModelAsync(IList<PickupPoint> pickupPoints, int languageId, Store store, Customer customer, string loaded = null)
{
var list = new List<CheckoutPickupPointModel>();
list = await pickupPoints.SelectAwait(async point =>
{
var country = await _countryService.GetCountryByTwoLetterIsoCodeAsync(point.CountryCode);
var state = await _stateProvinceService.GetStateProvinceByAbbreviationAsync(point.StateAbbreviation, country?.Id);
var pickupPointModel = new CheckoutPickupPointModel
{
Id = point.Id,
Name = point.Name,
Description = point.Description,
ProviderSystemName = point.ProviderSystemName,
Address = point.Address,
City = point.City,
County = point.County,
StateName = state != null ? await _localizationService.GetLocalizedAsync(state, x => x.Name, languageId) : string.Empty,
CountryName = country != null ? await _localizationService.GetLocalizedAsync(country, x => x.Name, languageId) : string.Empty,
ZipPostalCode = point.ZipPostalCode,
Latitude = point.Latitude,
Longitude = point.Longitude,
OpeningHours = point.OpeningHours
};
var cart = await _shoppingCartService.GetShoppingCartAsync(customer, ShoppingCartType.ShoppingCart, store.Id);
var amount = await _orderTotalCalculationService.IsFreeShippingAsync(cart) ? 0 : point.PickupFee;
var currentCurrency = await _workContext.GetWorkingCurrencyAsync();
if (amount > 0)
{
(amount, _) = await _taxService.GetShippingPriceAsync(amount, customer);
amount = await _currencyService.ConvertFromPrimaryStoreCurrencyAsync(amount, currentCurrency);
pickupPointModel.PickupFee = await _priceFormatter.FormatShippingPriceAsync(amount, true);
}
//adjust rate
var (shippingTotal, _) = await _orderTotalCalculationService.AdjustShippingRateAsync(point.PickupFee, cart, true);
var (rateBase, _) = await _taxService.GetShippingPriceAsync(shippingTotal, customer);
var rate = await _currencyService.ConvertFromPrimaryStoreCurrencyAsync(rateBase, currentCurrency);
pickupPointModel.PickupFee = await _priceFormatter.FormatShippingPriceAsync(rate, true);
return pickupPointModel;
}).ToListAsync();
return list;
}