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