/// <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> /// Calculate the total currency amount after converting to channel currency for the given list of currencies. /// </summary> /// <param name="request">The list of currencies that requires to be summed.</param> /// <returns>Returns the response that contains the sum of currencies amount.</returns> private static CalculateTotalAmountServiceResponse CalculateTotalCurrencyAmount(CalculateTotalAmountServiceRequest request) { var channelConfiguration = request.RequestContext.GetChannelConfiguration(); decimal totalAmount = 0m; foreach (var currency in request.CurrenciesToConvert) { var getCurrencyValueRequest = new GetCurrencyValueServiceRequest(currency.CurrencyCode, channelConfiguration.Currency, currency.AmountToConvert); GetCurrencyValueServiceResponse response = request.RequestContext.Execute <GetCurrencyValueServiceResponse>(getCurrencyValueRequest); totalAmount += response.RoundedConvertedAmount; } return(new CalculateTotalAmountServiceResponse(new CurrencyAmount { RoundedConvertedAmount = totalAmount, CurrencyCode = channelConfiguration.Currency })); }