/// <summary> /// Executes the workflow associated with retrieving list of supported channel currencies. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override GetChannelCurrencyAmountResponse Process(GetChannelCurrencyAmountRequest request) { ThrowIf.Null(request, "request"); ThrowIf.Null(request.CurrenciesToConvert, "request.CurrencyToConvert"); if (!request.CurrenciesToConvert.Any()) { throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_CurrencyNotFound); } GetChannelCurrencyAmountResponse response; if (!request.IsTotalToBeCalculated) { CurrencyRequest currencyToConvert = request.CurrenciesToConvert.Single(); // Set default store currency if the currency Iso code is not set. if (string.IsNullOrWhiteSpace(currencyToConvert.CurrencyCode)) { var channelConfiguration = this.Context.GetChannelConfiguration(); currencyToConvert.CurrencyCode = channelConfiguration.Currency; } var serviceRequest = new GetChannelCurrencyServiceRequest(currencyToConvert.CurrencyCode, currencyToConvert.AmountToConvert, request.QueryResultSettings); var serviceResponse = this.Context.Execute <GetChannelCurrencyServiceResponse>(serviceRequest); response = new GetChannelCurrencyAmountResponse(serviceResponse.ChannelCurrencies); } else { var serviceRequest = new CalculateTotalAmountServiceRequest(request.CurrenciesToConvert); var serviceResponse = this.Context.Execute <CalculateTotalAmountServiceResponse>(serviceRequest); response = new GetChannelCurrencyAmountResponse(new ReadOnlyCollection <CurrencyAmount>(new[] { serviceResponse.TotalCurrencyAmount }).AsPagedResult()); } return(response); }
/// <summary> /// Gets all supported channel currency value and exchange rate for the given amount. /// </summary> /// <param name="request">Request contains the amount to be converted.</param> /// <returns>The converted amount with exchange rates.</returns> private static GetChannelCurrencyServiceResponse GetSupportedChannelCurrencies(GetChannelCurrencyServiceRequest request) { string fromCurrencyCode = request.CurrencyCode; GetChannelCurrenciesDataRequest dataRequest = new GetChannelCurrenciesDataRequest(request.QueryResultSettings ?? QueryResultSettings.AllRecords); PagedResult <CurrencyAmount> pagedChannelCurrencies = request.RequestContext.Execute <EntityDataServiceResponse <CurrencyAmount> >(dataRequest).PagedEntityCollection; ReadOnlyCollection <CurrencyAmount> channelCurrencies = pagedChannelCurrencies.Results; if (channelCurrencies == null || !channelCurrencies.Any()) { NetTracer.Warning("Cannot find channel currencies"); return(new GetChannelCurrencyServiceResponse()); } var currencyList = channelCurrencies.ToList(); foreach (var toCurrency in currencyList) { var getCurrencyValueRequest = new GetCurrencyValueServiceRequest(fromCurrencyCode, toCurrency.CurrencyCode, request.Amount); GetCurrencyValueServiceResponse serviceResponse = GetCurrencyConversion(request.RequestContext, getCurrencyValueRequest); toCurrency.ExchangeRate = serviceResponse.ExchangeRate; toCurrency.ConvertedAmount = serviceResponse.ConvertedAmount; toCurrency.RoundedConvertedAmount = serviceResponse.RoundedConvertedAmount; } var storeCurrencyList = currencyList.Where(currency => currency.ExchangeRate > 0M).ToList(); // If the from currency does not exists add to the list. if (storeCurrencyList.All(currency => string.CompareOrdinal(currency.CurrencyCode, fromCurrencyCode) != 0)) { CurrencyAmount conversionResult = GetFromCurrencyAmount(request.RequestContext, request.Amount, fromCurrencyCode); storeCurrencyList.Add(conversionResult); } pagedChannelCurrencies.Results = storeCurrencyList.AsReadOnly(); return(new GetChannelCurrencyServiceResponse(pagedChannelCurrencies)); }