public override async Task <PortalCentralBankExchangeRateSearchGetResponse> ExecuteAsync(PortalCentralBankExchangeRateSearchGetRequest request)
        {
            var searchQuery = _dbContext.CentralBankExchangeRates
                              .AsQueryable();

            if (request.IsAdvancedSearch)
            {
                searchQuery = searchQuery
                              .Where(x => (string.IsNullOrEmpty(request.SearchStruct.LocalCurrencyCode) || x.LocalCurrencyCode == request.SearchStruct.LocalCurrencyCode) &&
                                     (string.IsNullOrEmpty(request.SearchStruct.ForeignCurrencyCode) || x.ForeignCurrencyCode == request.SearchStruct.ForeignCurrencyCode));
            }
            else
            {
                searchQuery = searchQuery.Where(x => string.IsNullOrEmpty(request.SearchTerm) ||
                                                x.LocalCurrencyCode.Contains(request.SearchTerm) ||
                                                x.ForeignCurrencyCode.Contains(request.SearchTerm));
            }

            var totalCount = await searchQuery.CountAsync();

            var records = await searchQuery
                          .OrderBy(x => x.LocalCurrencyCode)
                          .ThenBy(x => x.DefaultOrder)
                          .ApplyMetadata(request.Metadata, ignoreOrdering: true)
                          .Select(x => new PortalCentralBankExchangeRateSearchRecord()
            {
                Id = x.Id,
                LocalCurrencyCode   = x.LocalCurrencyCode,
                ForeignCurrencyCode = x.ForeignCurrencyCode,
                DefaultOrder        = x.DefaultOrder,
            })
                          .ToArrayAsync();

            // calculate current rates
            var currentUserTime = TimeZones.GetCustomerNow(_currentUser);

            foreach (var record in records)
            {
                record.Rate = await _centralBankExchangeRateManager.GetCurrentRateAsync(record.Id, currentUserTime) ?? 0;
            }

            return(new PortalCentralBankExchangeRateSearchGetResponse
            {
                Total = totalCount,
                Records = records,
                Currencies = CurrencyHelper.GetCurrencyListOptions(),
                IsNewAllowed = _currentUser.Role == UserRoleEnum.GlobalAdmin,
            });
        }
Пример #2
0
        private async Task <decimal> GetExchangeRateAsync()
        {
            var          ukrainianNow        = TimeZones.GetTimeZoneNow(TimeZones.UkrainianTime);
            const string LocalCurrencyCode   = "UAH";
            const string ForeignCurrencyCode = "PLN";

            // todo: cache
            var exchangeRate = await _centralBankExchangeRateManager.GetCurrentRateAsync(LocalCurrencyCode, ForeignCurrencyCode, ukrainianNow);

            if (exchangeRate == null)
            {
                throw new InvalidOperationException($"CB exchange rate for {LocalCurrencyCode}-{ForeignCurrencyCode} is not presented.");
            }

            return(exchangeRate.Value);
        }