示例#1
0
        public static DateFrameFilter Create(DateFrameSelector dateFrameSelector)
        {
            switch (dateFrameSelector.Type)
            {
            case DateFrameType.BookDate:
                return(new DateFrameFilter(dateFrameSelector, x => x.BookDate));

            case DateFrameType.CreationDate:
                return(new DateFrameFilter(dateFrameSelector, x => x.InstanceCreationDate));

            case DateFrameType.EditDate:
                return(new DateFrameFilter(dateFrameSelector, x => x.LastEditDate));
            }

            return(null);
        }
        static TransactionBalanceCalculatorTests()
        {
            var notSelectedStock = new Stock("ns".GenerateGuid());

            _selectedStocks = new[] { new Stock("selected".GenerateGuid())
                                      {
                                          IsUserStock = true
                                      } };
            var selectedUserStock = _selectedStocks[0];

            selectedUserStock.IsPropertyChangedEnabled         = true;
            selectedUserStock.Balance.IsPropertyChangedEnabled = true;
            selectedUserStock.Balance.Value = 60000m;
            var income = new TransactionType {
                Income = true
            };
            var outcome = new TransactionType {
                Outcome = true
            };

            _firstBookDate = DateTime.Today.AddDays(-30);
            _dateFilter    = new DateFrameSelector(DateFrameType.BookDate);
            _transactions  = new[]
            {
                new Transaction
                {
                    BookDate  = DateTime.Today.AddDays(-10),
                    UserStock = selectedUserStock,
                    Type      = outcome,
                    Positions = new TrulyObservableCollection <Position>
                    {
                        new Position {
                            Value = new PaymentValue(1000, 1000, 0)
                        }
                    }
                },
                new Transaction
                {
                    BookDate  = DateTime.Today.AddDays(-12),
                    UserStock = notSelectedStock,
                    Type      = outcome,
                    Positions = new TrulyObservableCollection <Position>
                    {
                        new Position {
                            Value = new PaymentValue(100, 100, 0)
                        }
                    }
                },
                new Transaction
                {
                    BookDate  = DateTime.Today.AddDays(-22),
                    UserStock = selectedUserStock,
                    Type      = outcome,
                    Positions = new TrulyObservableCollection <Position>
                    {
                        new Position {
                            Value = new PaymentValue(10, 10, 0)
                        }
                    }
                },
                new Transaction
                {
                    BookDate  = _firstBookDate,
                    UserStock = selectedUserStock,
                    Type      = income,
                    Positions = new TrulyObservableCollection <Position>
                    {
                        new Position {
                            Value = new PaymentValue(10000, 10000, 0)
                        }
                    }
                },
            };
        }
        public IEnumerable <TransactionBalance> CalculateBalance(IEnumerable <Transaction> transactions, Stock[] selectedStocks, DateFrameSelector dateFilter,
                                                                 Func <Transaction, DateTime> groupingSelector, bool showTransfers)
        {
            var stockDate = selectedStocks.Max(x => x.Balance.BookDate).Date;

            if (stockDate == DateTime.MinValue)
            {
                stockDate = DateTime.Today;
            }
            decimal stockValue = selectedStocks.Sum(x => x.Balance.Value);

            var firstMatch = transactions
                             .Where(x => selectedStocks.Contains(x.UserStock));
            decimal transactionsValueBeforeLastStockUpdate =
                firstMatch.Where(z => z.BookDate <= stockDate).Sum(y => y.ValueAsProfit);
            decimal startValue = stockValue - transactionsValueBeforeLastStockUpdate;
            var     firstTransactionBookDate = transactions.Min(x => x.BookDate).Date;
            var     values = firstMatch
                             .GroupBy(groupingSelector)
                             .Where(x => x.Key <= stockDate)
                             .OrderBy(x => x.Key)
                             .Select(x =>
            {
                startValue += showTransfers ? x.Sum(y => y.ValueWithSign) : x.Sum(y => y.ValueAsProfit);
                return(new TransactionBalance(x.Key, startValue));
            })
                             .Where(x => !dateFilter.IsChecked ||
                                    x.BookDate >= dateFilter.From && x.BookDate <= dateFilter.To)
                             .Concat(!dateFilter.IsChecked || firstTransactionBookDate > dateFilter.From
                                     ? new[] { new TransactionBalance(firstTransactionBookDate.AddDays(-1), startValue) }
                                     : new TransactionBalance[0])
                             .Concat(!dateFilter.IsChecked || stockDate.Date <= dateFilter.To
                                     ? new[] { new TransactionBalance(stockDate, stockValue) }
                                     : new TransactionBalance[0]);

            return(values);
        }
示例#4
0
 private DateFrameFilter(DateFrameSelector dateFrameSelector, Func <IBookable, DateTime> selector)
 {
     _dateFrameSelector = dateFrameSelector;
     _selector          = selector;
     _dateFrameSelector.PropertyChanged += DateFrameOnPropertyChanged;
 }
        public DataPoint[] GetWealthValues(IEnumerable <Transaction> transactions, Stock[] selectedStocks, DateFrameSelector dateFilter, Func <Transaction, DateTime> groupingSelector, bool showTransfers)
        {
            if (selectedStocks == null || !selectedStocks.Any())
            {
                return(new DataPoint[0]);
            }
            if (transactions == null || !transactions.Any())
            {
                return(new DataPoint[0]);
            }

            var values = CalculateBalance(transactions, selectedStocks, dateFilter, groupingSelector, showTransfers);

            return(values
                   .Select(x => new DataPoint(DateTimeAxis.ToDouble(x.BookDate), (double)x.Value))
                   .OrderBy(x => x.X)
                   .ToArray());
        }