/// <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));
 }