private CalendarDayData CreateCalendarDayData(DateTime date, List <ITransaction> transactions, List <LimitModel> limits) { // create calendar day data object var calendarDayData = new CalendarDayData(date) { CalendarData = _data }; // fill existing records and money transfers in this day calendarDayData.Transactions = transactions.Where(x => x.TransactionDate.Day == calendarDayData.DayOfMonth && x.TransactionDate.Month == calendarDayData.Month && x.TransactionDate.Year == calendarDayData.Year).ToList(); calendarDayData.FilteredTransactions = calendarDayData.Transactions; // populate initial limit state in this day calendarDayData.Limits = limits.Where(x => x.DateFrom <= calendarDayData.Date && calendarDayData.Date <= x.DateUntil) .Select(x => new Model.Calendar.LimitState() { Limit = x, SpentValue = x.SpentValue, Categories = _data.Categories.Where(e => x.CategoryIds.Contains(e.Id)).ToList() }).ToList(); calendarDayData.FilteredLimits = calendarDayData.Limits; // populate storage initial state calendarDayData.Storages = _data.Storages.Select(x => new StorageState() { Storage = x, Amount = x.Value }).ToList(); calendarDayData.FilteredStorages = calendarDayData.Storages; return(calendarDayData); }
private void UpdateLimitState(CalendarDayData calendarDay, List <ITransaction> transactions, bool isPast) { // for past days remove from spent value, for future - add var sign = isPast ? -1 : 1; foreach (var limitState in calendarDay.Limits) { // update limit state (Note: Transaction amount is negative for expense) limitState.SpentValue += sign * (-transactions .Where(x => limitState.Limit.DateFrom <= x.TransactionDate && x.TransactionDate <= limitState.Limit.DateUntil && (limitState.Limit.CategoryIds.Count == 0 || limitState.Limit.CategoryIds.Contains(x.TransactionCategory?.Id ?? -1)) && x.IsExpense) .Sum(x => x.TransactionAmount)); } }
public CalendarCellsViewModel() { DateTitle = $"{CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(DateTime.Today.Month)} {DateTime.Today.Year}"; Days = new ObservableCollection <CalendarDayData>(); for (int i = 1; i <= 31; i++) { var day = new CalendarDayData { DayNumber = i, Message = "Test" }; if (i == DateTime.Today.Day) { SelectedDay = day; } Days.Add(day); } }
private void UpdateFutureDateStorageState(CalendarDayData calendarDay, List <ITransaction> transactions) { foreach (var storageState in calendarDay.Storages) { // update storage state by records storageState.Amount += transactions .Where(x => (x.TransactionType == TransactionType.Expense || x.TransactionType == TransactionType.Income) && x.TransactionStorage.Id == storageState.Storage.Id).Sum(x => x.TransactionAmount); // get related money transfers var moneyTransfers = transactions .Where(x => x.TransactionStorageIds.Contains(storageState.Storage.Id) && x.TransactionType == TransactionType.MoneyTransfer) .Select(x => (x as PlannedTransactionModel <EventModel>).Event as MoneyTransferEventModel) .ToList(); // apply money transfers storageState.Amount -= moneyTransfers.Where(x => x.StorageFromId == storageState.Storage.Id).Sum(x => x.StorageFromValue); storageState.Amount += moneyTransfers.Where(x => x.StorageToId == storageState.Storage.Id).Sum(x => x.StorageToValue); } }
private void SetDay(int iCol, int iRow, CalendarDayData data) { var cellMap = _cellMapping.FirstOrDefault(x => x.ICol == iCol && x.IRow == iRow); if (cellMap == null) { // create new cellMap = new CellMapping() { ICol = iCol, IRow = iRow, Control = new CalendarDayControl() }; // add to the list _cellMapping.Add(cellMap); // fill cell in grid Grid.SetColumn(cellMap.Control, cellMap.ICol); Grid.SetRow(cellMap.Control, cellMap.IRow); daysGrid.Children.Add(cellMap.Control); } // make sure grid contains correspond row if (daysGrid.Rows < iRow + 1) { daysGrid.Rows = iRow + 1; } if (cellMap.Control.Parent == null) { daysGrid.Children.Add(cellMap.Control); } cellMap.Control.Visibility = Visibility.Visible; cellMap.Control.Data = data; }