protected virtual async Task <Store> ConvertStoreAndLoadDependeciesAsync(StoreApi.Store storeDto, Currency currency = null) { var result = storeDto.ToStore(); if (currency != null) { var paymentSearchCriteria = new PaymentMethodsSearchCriteria { StoreId = result.Id }; var paymentsSearchResult = await _paymentModule.SearchPaymentMethodsAsync(paymentSearchCriteria); result.PaymentMethods = paymentsSearchResult.Results .Where(pm => pm.IsActive != null && pm.IsActive.Value) .Select(pm => { var paymentMethod = pm.ToStorePaymentMethod(currency); paymentMethod.Name = pm.TypeName; paymentMethod.DisplayName = pm.Name; return(paymentMethod); }).ToArray(); } var taxSearchCriteria = new TaxProviderSearchCriteria { StoreId = result.Id }; var taxProviderSearchResult = await _taxModule.SearchTaxProvidersAsync(taxSearchCriteria); result.FixedTaxRate = GetFixedTaxRate(taxProviderSearchResult.Results.Select(xp => xp.JsonConvert <TaxProvider>()).ToArray()); //use url for stores from configuration file with hight priority than store url defined in manager result.Url = _storefrontOptions.StoreUrls[result.Id] ?? result.Url; return(result); }
public virtual async Task <TaxProviderSearchResult> SearchTaxProvidersAsync(TaxProviderSearchCriteria criteria) { var cacheKey = CacheKey.With(GetType(), "SearchTaxProvidersAsync", criteria.GetCacheKey()); return(await _memCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) => { cacheEntry.AddExpirationToken(TaxCacheRegion.CreateChangeToken()); var result = AbstractTypeFactory <TaxProviderSearchResult> .TryCreateInstance(); var tmpSkip = 0; var tmpTake = 0; var sortInfos = BuildSortExpression(criteria); using (var repository = _repositoryFactory()) { var query = BuildQuery(repository, criteria); result.TotalCount = await query.CountAsync(); if (criteria.Take > 0) { var providerIds = await query.OrderBySortInfos(sortInfos).ThenBy(x => x.Id) .Select(x => x.Id).Skip(criteria.Skip) .Take(criteria.Take).ToArrayAsync(); result.Results = (await _taxProviderService.GetByIdsAsync(providerIds, criteria.ResponseGroup)).AsQueryable().OrderBySortInfos(sortInfos).ToList(); } } tmpSkip = Math.Min(result.TotalCount, criteria.Skip); tmpTake = Math.Min(criteria.Take, Math.Max(0, result.TotalCount - criteria.Skip)); criteria.Skip = criteria.Skip - tmpSkip; criteria.Take = criteria.Take - tmpTake; if (criteria.Take > 0 && !criteria.WithoutTransient) { var transientProvidersQuery = AbstractTypeFactory <TaxProvider> .AllTypeInfos.Select(x => AbstractTypeFactory <TaxProvider> .TryCreateInstance(x.Type.Name)) .OfType <TaxProvider>().AsQueryable(); if (!string.IsNullOrEmpty(criteria.Keyword)) { transientProvidersQuery = transientProvidersQuery.Where(x => x.Code.Contains(criteria.Keyword)); } var allPersistentProvidersTypes = result.Results.Select(x => x.GetType()).Distinct(); transientProvidersQuery = transientProvidersQuery.Where(x => !allPersistentProvidersTypes.Contains(x.GetType())); result.TotalCount += transientProvidersQuery.Count(); var transientProviders = transientProvidersQuery.Skip(criteria.Skip) .Take(criteria.Take) .ToList(); foreach (var transientProvider in transientProviders) { await _settingManager.DeepLoadSettingsAsync(transientProvider); } result.Results = result.Results.Concat(transientProviders).AsQueryable() .OrderBySortInfos(sortInfos).ThenBy(x => x.Id).ToList(); } return result; })); }
public async Task <Store> GetStoreByIdAsync(string id, Currency currency) { var storeDto = await _storeApi.GetStoreByIdAsync(id); var result = storeDto.ToStore(); if (!storeDto.PaymentMethods.IsNullOrEmpty() && currency != null) { result.PaymentMethods = storeDto.PaymentMethods .Where(pm => pm.IsActive != null && pm.IsActive.Value) .Select(pm => pm.ToStorePaymentMethod(currency)).ToArray(); } else if (storeDto.PaymentMethods.IsNullOrEmpty() && currency != null) { var paymentSearchCriteria = new PaymentMethodsSearchCriteria { StoreId = id }; var paymentsSearchResult = await _paymentModule.SearchPaymentMethodsAsync(paymentSearchCriteria); result.PaymentMethods = paymentsSearchResult.Results .Where(pm => pm.IsActive != null && pm.IsActive.Value) .Select(pm => { var paymentMethod = pm.JsonConvert <StorePaymentMethod>().ToStorePaymentMethod(currency); paymentMethod.Name = pm.TypeName; return(paymentMethod); }).ToArray(); } if (storeDto.TaxProviders.IsNullOrEmpty()) { var taxSearchCriteria = new TaxProviderSearchCriteria { StoreId = id }; var taxProviderSearchResult = await _taxModule.SearchTaxProvidersAsync(taxSearchCriteria); result.FixedTaxRate = GetFixedTaxRate(taxProviderSearchResult.Results.Select(xp => xp.JsonConvert <TaxProvider>()).ToArray()); } else { result.FixedTaxRate = GetFixedTaxRate(storeDto.TaxProviders); } //use url for stores from configuration file with hight priority than store url defined in manager result.Url = _storefrontOptions.StoreUrls[result.Id] ?? result.Url; return(result); }
protected virtual IList <SortInfo> GetSortInfos(TaxProviderSearchCriteria criteria) { var sortInfos = criteria.SortInfos; if (sortInfos.IsNullOrEmpty()) { sortInfos = new[] { new SortInfo { SortColumn = "Name" } }; } return(sortInfos); }
protected virtual IList <SortInfo> BuildSortExpression(TaxProviderSearchCriteria criteria) { var sortInfos = criteria.SortInfos; if (sortInfos.IsNullOrEmpty()) { sortInfos = new[] { new SortInfo { SortColumn = nameof(StoreTaxProviderEntity.Code) } }; } return(sortInfos); }
public async Task <Store> GetStoreByIdAsync(string id, Currency currency) { var storeDto = await _storeApi.GetStoreByIdAsync(id); var result = storeDto.ToStore(); if (!storeDto.PaymentMethods.IsNullOrEmpty() && currency != null) { result.PaymentMethods = storeDto.PaymentMethods .Where(pm => pm.IsActive != null && pm.IsActive.Value) .Select(pm => pm.ToStorePaymentMethod(currency)).ToArray(); } else if (storeDto.PaymentMethods.IsNullOrEmpty() && currency != null) { var paymentSearchCriteria = new PaymentMethodsSearchCriteria { StoreId = id }; var paymentsSearchResult = await _paymentModule.SearchPaymentMethodsAsync(paymentSearchCriteria); result.PaymentMethods = paymentsSearchResult.Results .Where(pm => pm.IsActive != null && pm.IsActive.Value) .Select(pm => { var paymentMethod = pm.JsonConvert <StorePaymentMethod>().ToStorePaymentMethod(currency); paymentMethod.Name = pm.TypeName; return(paymentMethod); }).ToArray(); } if (storeDto.TaxProviders.IsNullOrEmpty()) { var taxSearchCriteria = new TaxProviderSearchCriteria { StoreId = id }; var taxProviderSearchResult = await _taxModule.SearchTaxProvidersAsync(taxSearchCriteria); result.FixedTaxRate = GetFixedTaxRate(taxProviderSearchResult.Results.Select(xp => xp.JsonConvert <TaxProvider>()).ToArray()); } else { result.FixedTaxRate = GetFixedTaxRate(storeDto.TaxProviders); } return(result); }
public async Task TestAddressValidation(Address address, bool expectedIsValid) { const string storeId = "some-test-store"; // Arrange var storeService = new Mock <IStoreService>(); var taxProviderSearchService = new Mock <ITaxProviderSearchService>(); var taxProviderSearchCriteria = new TaxProviderSearchCriteria { StoreIds = new[] { storeId }, Keyword = typeof(AvaTaxRateProvider).Name }; taxProviderSearchService.Setup(x => x.SearchTaxProvidersAsync(taxProviderSearchCriteria)).ReturnsAsync(new TaxProviderSearchResult { TotalCount = 1, Results = new List <TaxProvider> { new AvaTaxRateProvider { IsActive = true, Settings = Settings } } }); storeService.Setup(x => x.GetByIdAsync(storeId, null)).ReturnsAsync(new Store { Id = storeId }); var options = new Mock <IOptions <AvaTaxSecureOptions> >(); options.Setup(x => x.Value).Returns(Options); var target = new AddressValidationService(storeService.Object, CreateAvaTaxClient, taxProviderSearchService.Object, options.Object); // Act var result = await target.ValidateAddressAsync(address, storeId); // Assert Assert.Equal(expectedIsValid, result.AddressIsValid); }
protected virtual IQueryable <StoreTaxProviderEntity> GetQuery(ITaxRepository repository, TaxProviderSearchCriteria criteria, IEnumerable <SortInfo> sortInfos) { var query = repository.StoreTaxProviders; if (!string.IsNullOrEmpty(criteria.Keyword)) { query = query.Where(x => x.Code.Contains(criteria.Keyword) || x.Id.Contains(criteria.Keyword)); } if (!criteria.StoreId.IsNullOrEmpty()) { query = query.Where(x => x.StoreId == criteria.StoreId); } query = query.OrderBySortInfos(sortInfos); return(query); }
protected virtual IQueryable <StoreTaxProviderEntity> BuildQuery(ITaxRepository repository, TaxProviderSearchCriteria criteria) { var query = repository.StoreTaxProviders; if (!string.IsNullOrEmpty(criteria.Keyword)) { query = query.Where(x => x.Code.Contains(criteria.Keyword) || x.Id.Contains(criteria.Keyword)); } if (!criteria.StoreId.IsNullOrEmpty()) { query = query.Where(x => x.StoreId == criteria.StoreId); } if (!criteria.StoreIds.IsNullOrEmpty()) { query = query.Where(x => criteria.StoreIds.Contains(x.StoreId)); } return(query); }
public async Task <ActionResult <TaxProviderSearchResult> > SearchTaxProviders([FromBody] TaxProviderSearchCriteria criteria) { var result = await _taxProviderSearchService.SearchTaxProvidersAsync(criteria); return(Ok(result)); }
public async Task <AddressValidationResult> ValidateAddressAsync(Address address, string storeId) { var store = await _storeService.GetByIdAsync(storeId); if (store == null) { throw new ArgumentException("Store with specified storeId does not exist.", nameof(storeId)); } var taxProviderSearchCriteria = new TaxProviderSearchCriteria() { StoreIds = new[] { store.Id }, Keyword = typeof(AvaTaxRateProvider).Name }; var avaTaxProviders = await _taxProviderSearchService.SearchTaxProvidersAsync(taxProviderSearchCriteria); var avaTaxProvider = avaTaxProviders.Results.FirstOrDefault(x => x.IsActive); if (avaTaxProvider == null) { throw new ArgumentException($"Store '{storeId}' does not use AvaTaxRateProvider, so it can't be used for address validation."); } var avaTaxSettings = AvaTaxSettings.FromSettings(avaTaxProvider.Settings, _options); var addressValidationInfo = AbstractTypeFactory <AvaAddressValidationInfo> .TryCreateInstance(); addressValidationInfo.FromAddress(address); var avaTaxClient = _avaTaxClientFactory(avaTaxSettings); bool addressIsValid; var messages = new List <string>(); try { var addressResolutionModel = avaTaxClient.ResolveAddressPost(addressValidationInfo); // If the address cannot be resolved, it's coordinates will be null. // This might mean that the address is invalid. addressIsValid = addressResolutionModel.coordinates != null; if (!addressResolutionModel.messages.IsNullOrEmpty()) { messages.AddRange(addressResolutionModel.messages.Select(x => $"{x.summary} {x.details}")); } } catch (AvaTaxError e) { addressIsValid = false; var errorResult = e.error.error; if (!errorResult.details.IsNullOrEmpty()) { messages.AddRange(errorResult.details.Select(x => x.description)); } } return(new AddressValidationResult { Address = address, AddressIsValid = addressIsValid, Messages = messages.ToArray() }); }