public VirtualState Handle( DateTimeOffset date, UserId user, VirtualPeriod period = VirtualPeriod.AllTime, BrokerId?brokerId = null) { var state = _stateManager.ReadState(date, user); var periodStart = GetPeriodStart(date, period); _logger.LogTrace($"Period ({period}) start: {periodStart}"); var inventory = state.Brokers .Where(broker => (brokerId == null) || (broker.Id == brokerId)) .SelectMany(broker => broker.Inventory .Where(asset => asset.Count > 0) .Select(asset => { var metadata = _metadataManager.GetMetadataWithFallback(asset.Isin, user); var name = metadata.Name; var type = metadata.Type; var currency = asset.Currency; var realSum = GetRealPriceSum(user, asset, periodStart); var realPrice = realSum / asset.Count; var virtualPrice = _priceManager.GetVirtualPricePerOne(asset.Isin, date) ?? realPrice; var virtualSum = virtualPrice * asset.Count; var dividend = _priceManager.GetDividendState(date, user, asset.Id); return(new VirtualAsset( asset.Id, broker.Id, asset.Isin, name, type, asset.Count, realPrice, virtualPrice, realSum, virtualSum, dividend, currency)); })) .ToArray(); var balances = CalculateBalances(inventory); var summary = CalculateSummary(balances, date, user); return(new VirtualState(summary, balances)); }
DateTimeOffset GetPeriodStart(DateTimeOffset date, VirtualPeriod period) => period switch {