Exemple #1
0
        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;
            }));
        }
Exemple #3
0
        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);
        }
Exemple #7
0
        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()
            });
        }