/// <inheritdoc /> public async Task <PagedList <UserTransactionDto> > GetTransactions(int userId, PagedFilterDefinition <TransactionFilter> filter) { var allTransactions = await _transactionsRepository.GetAllUserTransactions(userId); var transactions = allTransactions.Select(t => new UserTransactionDto { Date = t.Date, Price = t.Price, Quantity = t.Quantity < 0 ? -t.Quantity : t.Quantity, Action = t.Quantity < 0 ? Action.Sell : Action.Buy, Id = t.Id, CompanyName = t.Company.Code, Total = t.Quantity < 0 ? -t.Quantity * t.Price : t.Quantity * t.Price, Profit = 0 }).ToList(); foreach (var pagedTransaction in transactions) { if (pagedTransaction.Action == Action.Buy) { continue; } var pastTransactions = transactions .Where(item => item.CompanyName == pagedTransaction.CompanyName && item.Date < pagedTransaction.Date) .OrderBy(item => item.Date) .ToList(); var quantity = 0m; var price = 0m; foreach (var pastTransaction in pastTransactions) { if (pastTransaction.Action == Action.Buy) { price = (price * quantity + pastTransaction.Price * pastTransaction.Quantity) / (quantity + pastTransaction.Quantity); quantity += pastTransaction.Quantity; } else { quantity -= pastTransaction.Quantity; } } pagedTransaction.Profit = pagedTransaction.Quantity * (pagedTransaction.Price - price); } if (!string.IsNullOrWhiteSpace(filter.Search)) { transactions = transactions.Where(item => item.CompanyName.Contains(filter.Search.ToUpper())).ToList(); } transactions = transactions.OrderBy(filter.OrderBys).ToList(); return(transactions.ToPagedList(filter.Start, filter.Length)); }
/// <inheritdoc /> public async Task <IList <UserTransaction> > GetAllUserTransactions(int userId) { return(await _baseRepository.GetAllUserTransactions(userId)); }