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