Пример #1
0
        private static AvaTaxController GetTaxController()
        {
            var avalaraUsername    = "******";
            var avalaraPassword    = "******";
            var avalaraServiceUrl  = "https://development.avalara.net";
            var avalaraCompanyCode = "APITrialCompany";

            const string _usernamePropertyName          = "Avalara.Tax.Credentials.AccountNumber";
            const string _passwordPropertyName          = "Avalara.Tax.Credentials.LicenseKey";
            const string _serviceUrlPropertyName        = "Avalara.Tax.Credentials.ServiceUrl";
            const string _companyCodePropertyName       = "Avalara.Tax.Credentials.CompanyCode";
            const string _isEnabledPropertyName         = "Avalara.Tax.IsEnabled";
            const string _isValidateAddressPropertyName = "Avalara.Tax.IsValidateAddress";

            var settings = new List <SettingEntry>
            {
                new SettingEntry
                {
                    Value     = avalaraUsername,
                    Name      = _usernamePropertyName,
                    ValueType = SettingValueType.ShortText
                },
                new SettingEntry
                {
                    Value     = avalaraPassword,
                    Name      = _passwordPropertyName,
                    ValueType = SettingValueType.ShortText
                },
                new SettingEntry
                {
                    Value     = avalaraServiceUrl,
                    Name      = _serviceUrlPropertyName,
                    ValueType = SettingValueType.ShortText
                },
                new SettingEntry
                {
                    Value     = avalaraCompanyCode,
                    Name      = _companyCodePropertyName,
                    ValueType = SettingValueType.ShortText
                },
                new SettingEntry {
                    Value = "True", Name = _isEnabledPropertyName, ValueType = SettingValueType.Boolean
                }
            };

            var settingsManager = new Moq.Mock <ISettingsManager>();

            settingsManager.Setup(manager => manager.GetValue(_usernamePropertyName, string.Empty)).Returns(() => settings.First(x => x.Name == _usernamePropertyName).Value);
            settingsManager.Setup(manager => manager.GetValue(_passwordPropertyName, string.Empty)).Returns(() => settings.First(x => x.Name == _passwordPropertyName).Value);
            settingsManager.Setup(manager => manager.GetValue(_serviceUrlPropertyName, string.Empty)).Returns(() => settings.First(x => x.Name == _serviceUrlPropertyName).Value);
            settingsManager.Setup(manager => manager.GetValue(_companyCodePropertyName, string.Empty)).Returns(() => settings.First(x => x.Name == _companyCodePropertyName).Value);
            settingsManager.Setup(manager => manager.GetValue(_isEnabledPropertyName, true)).Returns(() => true);
            settingsManager.Setup(manager => manager.GetValue(_isValidateAddressPropertyName, true)).Returns(() => true);

            var avalaraTax = new AvaTaxSettings(_usernamePropertyName, _passwordPropertyName, _serviceUrlPropertyName, _companyCodePropertyName, _isEnabledPropertyName, _isValidateAddressPropertyName, settingsManager.Object);

            var controller = new AvaTaxController(avalaraTax);

            return(controller);
        }
        protected virtual async Task <AvaTaxSettings> GetAvataxSettingsForOrder(CustomerOrder order)
        {
            if (order == null)
            {
                throw new ArgumentNullException(nameof(order));
            }
            AvaTaxSettings result = null;

            if (!string.IsNullOrEmpty(order.StoreId))
            {
                var store = await _storeService.GetByIdAsync(order.StoreId);

                var taxProviders = await _taxProviderSearchService.SearchTaxProvidersAsync(new TaxProviderSearchCriteria
                {
                    Keyword  = typeof(AvaTaxRateProvider).Name,
                    StoreIds = new[] { store.Id }
                });

                var avaTaxProvider = taxProviders.Results.FirstOrDefault(x => x.IsActive);
                if (avaTaxProvider != null)
                {
                    result = AvaTaxSettings.FromSettings(avaTaxProvider.Settings, _options);
                    if (result.SourceAddress == null && store.MainFulfillmentCenterId != null)
                    {
                        result.SourceAddress = (await _fulfillmentCenterService.GetByIdsAsync(new[] { store.MainFulfillmentCenterId }))?.FirstOrDefault()?.Address;
                    }
                }
            }
            return(result);
        }
Пример #3
0
        public override void Initialize()
        {
            var settingsManager = _container.Resolve <ISettingsManager>();

            var avalaraTax = new AvaTaxSettings(_usernamePropertyName, _passwordPropertyName, _serviceUrlPropertyName, _companyCodePropertyName, _isEnabledPropertyName, _isValidateAddressPropertyName, settingsManager);

            var logManager = _container.Resolve <ILog>();

            _container.RegisterType <AvaTaxController>
                (new InjectionConstructor(
                    avalaraTax, logManager));

            _container.RegisterInstance <ITaxSettings>(avalaraTax);

            //Subscribe to cart changes. Calculate taxes
            _container.RegisterType <IObserver <CartChangeEvent>, CalculateCartTaxesObserver>("CalculateCartTaxesObserver");

            //Subscribe to order changes. Calculate taxes
            _container.RegisterType <IObserver <OrderChangeEvent>, CalculateOrderTaxesObserver>("CalculateOrderTaxesObserver");

            //Subscribe to order changes. Calculate taxes
            _container.RegisterType <IObserver <OrderChangeEvent>, CancelOrderTaxesObserver>("CancelOrderTaxesObserver");

            //Subscribe to order changes. Adjust taxes
            _container.RegisterType <IObserver <OrderChangeEvent>, CalculateTaxAdjustmentObserver>("CalculateTaxAdjustmentObserver");
        }
Пример #4
0
        public override void Initialize()
        {
            var eventListener = new ObservableEventListener();

            eventListener.EnableEvents(
                VirtoCommerceEventSource.Log,
                EventLevel.LogAlways,
                Keywords.All);



            var assetsConnection = ConfigurationManager.ConnectionStrings["AssetsConnectionString"];

            if (assetsConnection != null)
            {
                var properties             = assetsConnection.ConnectionString.ToDictionary(";", "=");
                var provider               = properties["provider"];
                var assetsConnectionString = properties.ToString(";", "=", "provider");

                if (string.Equals(provider, FileSystemBlobProvider.ProviderName, StringComparison.OrdinalIgnoreCase))
                {
                    eventListener.LogToRollingFlatFile("AvaTax.log",
                                                       10000,
                                                       "hh",
                                                       RollFileExistsBehavior.Increment,
                                                       RollInterval.Day);
                }
                else
                if (string.Equals(provider, AzureBlobProvider.ProviderName, StringComparison.OrdinalIgnoreCase))
                {
                    eventListener.LogToWindowsAzureTable(
                        "VirtoCommerce2", assetsConnectionString);
                }
            }


            var settingsManager = _container.Resolve <ISettingsManager>();

            var avalaraTax = new AvaTaxSettings(_usernamePropertyName, _passwordPropertyName, _serviceUrlPropertyName, _companyCodePropertyName, _isEnabledPropertyName, _isValidateAddressPropertyName, settingsManager);

            _container.RegisterType <AvaTaxController>
                (new InjectionConstructor(
                    avalaraTax));

            _container.RegisterInstance <ITaxSettings>(avalaraTax);

            //Subscribe to cart changes. Calculate taxes
            _container.RegisterType <IObserver <CartChangeEvent>, CalculateCartTaxesObserver>("CalculateCartTaxesObserver");

            //Subscribe to order changes. Calculate taxes
            _container.RegisterType <IObserver <OrderChangeEvent>, CalculateOrderTaxesObserver>("CalculateOrderTaxesObserver");

            //Subscribe to order changes. Calculate taxes
            _container.RegisterType <IObserver <OrderChangeEvent>, CancelOrderTaxesObserver>("CancelOrderTaxesObserver");

            //Subscribe to order changes. Adjust taxes
            _container.RegisterType <IObserver <OrderChangeEvent>, CalculateTaxAdjustmentObserver>("CalculateTaxAdjustmentObserver");
        }
Пример #5
0
        public Task <ActionResult> TestConnection([FromBody] AvaTaxSettings taxSetting)
        {
            ActionResult result = BadRequest();

            LogInvoker <AvalaraLogger.TaxRequestContext> .Execute(log =>
            {
                if (taxSetting == null)
                {
                    const string errorMessage = "The connectionInfo parameter is required to test the connection.";
                    result = BadRequest(errorMessage);
                    throw new Exception(errorMessage);
                }

                taxSetting.AccountNumber = _options.AccountNumber;
                taxSetting.LicenseKey    = _options.LicenseKey;

                if (!taxSetting.IsValid)
                {
                    const string errorMessage = "AvaTax credentials are not provided.";
                    result = BadRequest(errorMessage);
                    throw new Exception(errorMessage);
                }

                var avaTaxClient = _avaTaxClientFactory(taxSetting);

                PingResultModel pingResult;
                try
                {
                    pingResult = avaTaxClient.Ping();
                }
                catch (JsonException e)
                {
                    var errorMessage = $"Avalara API service responded with some unexpected data. Please verify the link to Avalara API service.\nInner error: {e.Message}";
                    result           = BadRequest(errorMessage);
                    throw new Exception(errorMessage, e);
                }
                catch (Exception e)
                {
                    var errorMessage = $"Failed to connect to the Avalara API due to error: {e.Message}";
                    result           = BadRequest(errorMessage);
                    throw new Exception(errorMessage, e);
                }

                if (pingResult.authenticated != true)
                {
                    var errorMessage = "Provided Avalara credentials are invalid. Please verify the account number and the license key.";
                    result           = BadRequest(errorMessage);
                    throw new Exception(errorMessage);
                }

                result = Ok(pingResult);
            })
            .OnError(_logger, AvalaraLogger.EventCodes.TaxPingError)
            .OnSuccess(_logger, AvalaraLogger.EventCodes.Ping);

            return(Task.FromResult(result));
        }
        protected virtual List <TaxRate> GetTaxRates(TaxEvaluationContext evalContext)
        {
            var retVal = new List <TaxRate>();

            LogInvoker <AvalaraLogger.TaxRequestContext> .Execute(log =>
            {
                var avaSettings = AvaTaxSettings.FromSettings(Settings, _options);
                Validate(avaSettings);

                var companyCode            = avaSettings.CompanyCode;
                var createTransactionModel = AbstractTypeFactory <AvaCreateTransactionModel> .TryCreateInstance();
                createTransactionModel.FromContext(evalContext, companyCode);
                createTransactionModel.commit = false;

                log.docCode      = createTransactionModel.code;
                log.docType      = createTransactionModel.type.ToString();
                log.customerCode = createTransactionModel.customerCode;
                if (createTransactionModel.IsValid)
                {
                    var avaTaxClient = _avaTaxClientFactory(avaSettings);
                    var transaction  = avaTaxClient.CreateTransaction(string.Empty, createTransactionModel);

                    if (!transaction.lines.IsNullOrEmpty())
                    {
                        foreach (var taxLine in transaction.lines)
                        {
                            var rate = new TaxRate
                            {
                                Rate        = taxLine.tax ?? 0.0m,
                                Currency    = evalContext.Currency,
                                TaxProvider = this,
                                Line        = evalContext.Lines.FirstOrDefault(x => x.Id == taxLine.lineNumber)
                            };
                            if (rate.Line != null)
                            {
                                retVal.Add(rate);
                            }
                        }
                    }
                }
            })
            .OnError(_logger, AvalaraLogger.EventCodes.TaxCalculationError)
            .OnSuccess(_logger, AvalaraLogger.EventCodes.GetSalesInvoiceRequestTime);

            return(retVal);
        }
        private AvaTaxController GetTaxController()
        {
            const string _isValidateAddressPropertyName = "Avalara.Tax.IsValidateAddress";

            var settingsManager = new Mock <ISettingsManager>();

            settingsManager.Setup(manager => manager.GetValue(_usernamePropertyName, string.Empty)).Returns(() => _settings.First(x => x.Name == _usernamePropertyName).Value);
            settingsManager.Setup(manager => manager.GetValue(_passwordPropertyName, string.Empty)).Returns(() => _settings.First(x => x.Name == _passwordPropertyName).Value);
            settingsManager.Setup(manager => manager.GetValue(_serviceUrlPropertyName, string.Empty)).Returns(() => _settings.First(x => x.Name == _serviceUrlPropertyName).Value);
            settingsManager.Setup(manager => manager.GetValue(_companyCodePropertyName, string.Empty)).Returns(() => _settings.First(x => x.Name == _companyCodePropertyName).Value);
            settingsManager.Setup(manager => manager.GetValue(_isEnabledPropertyName, true)).Returns(() => true);
            settingsManager.Setup(manager => manager.GetValue(_isValidateAddressPropertyName, true)).Returns(() => true);

            var avalaraTax = new AvaTaxSettings(_usernamePropertyName, _passwordPropertyName, _serviceUrlPropertyName, _companyCodePropertyName, _isEnabledPropertyName, _isValidateAddressPropertyName, settingsManager.Object);
            var logger     = new Mock <ILog>();

            var controller = new AvaTaxController(avalaraTax, logger.Object);

            return(controller);
        }
        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()
            });
        }