/// <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);
            }
Пример #2
0
            /// <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
                }));
            }