コード例 #1
0
ファイル: MasterDataService.cs プロジェクト: mrsunil/bp2
        public async Task <IEnumerable <FxRate> > GetFxRatesAsync(DateTime?fxRateDate, string viewMode)
        {
            if (fxRateDate == null && viewMode != FxRateViewMode.Spot)
            {
                throw new Exception("The fxRateDate is required for viewMode other than Spot.");
            }

            if (viewMode != FxRateViewMode.Spot && viewMode != FxRateViewMode.Daily && viewMode != FxRateViewMode.Monthly)
            {
                throw new Exception("Invalid value for viewMode.");
            }

            IEnumerable <Currency> currencies = (await GetCurrenciesAsync()).ToList();

            IEnumerable <FxRateRecord> fxRateRecords = await _masterDataRepository.GetFxRatesAsync(fxRateDate, viewMode);

            var fxRatesJoinList =
                (from fxRate in fxRateRecords
                 join currency in currencies on fxRate.CurrencyCodeFrom equals currency.CurrencyCode into currenciesFrom
                 from cf in currenciesFrom.DefaultIfEmpty()
                 join currency in currencies on fxRate.CurrencyCodeTo equals currency.CurrencyCode into currenciesTo
                 from ct in currenciesTo.DefaultIfEmpty()
                 select new { FxRate = fxRate, CurrencyFrom = cf, CurrencyTo = ct }).ToList();

            // Filters out the values which do not meet the codes & types (for ex, EUR=>INR, or USD=>EUR if EUR is of type 'M')
            var fxRateRecordsFiltered = fxRatesJoinList
                                        .Where(r => (r.CurrencyFrom != null && r.CurrencyTo != null) && (r.CurrencyFrom.IsDollar() || r.CurrencyTo.IsDollar()))
                                        .Where(r => (r.CurrencyFrom != null && r.CurrencyFrom.IsDollar() && r.CurrencyTo.RoeType == "D") ||
                                               (r.CurrencyTo != null && r.CurrencyFrom.RoeType == "M" && r.CurrencyTo.IsDollar())).ToList();

            var fxRates =
                (from r in fxRateRecordsFiltered
                 let c = r.CurrencyFrom.RoeType == "M" && !r.CurrencyFrom.IsDollar() ? r.CurrencyFrom : r.CurrencyTo
                         select new FxRate
            {
                CurrencyCode = c.CurrencyCode,
                CurrencyRoeType = c.RoeType,
                Date = r.FxRate.ValidDateFrom,
                Rate = r.FxRate.Rate,
                FwdMonth1 = r.FxRate.FwdMonth1,
                FwdMonth2 = r.FxRate.FwdMonth2,
                FwdMonth3 = r.FxRate.FwdMonth3,
                FwdMonth6 = r.FxRate.FwdMonth6,
                FwdYear1 = r.FxRate.FwdYear1,
                FwdYear2 = r.FxRate.FwdYear2,
                CurrencyIsDeactivated = c.IsDeactivated,
                CreatedBy = r.FxRate.CreatedBy,
                CreatedDateTime = r.FxRate.CreatedDateTime,
                ModifiedBy = r.FxRate.ModifiedBy,
                ModifiedDateTime = r.FxRate.ModifiedDateTime
            })
                .ToList();

            foreach (var currency in currencies)
            {
                if (fxRates.All(r => r.CurrencyCode != currency.CurrencyCode))
                {
                    fxRates.Add(new FxRate
                    {
                        CurrencyCode          = currency.CurrencyCode,
                        CurrencyRoeType       = currency.RoeType,
                        CurrencyIsDeactivated = currency.IsDeactivated,
                        CurrencyDescription   = currency.Description
                    });
                }
            }

            return(fxRates);
        }