public ActionResult ChartData(DynamicsViewModel model) { if (model.ByCategories) { return(Json(_dynamicsService.GetChartDataByCategories(model, User), JsonRequestBehavior.AllowGet)); } else { return(Json(_dynamicsService.GetChartDataByTypes(model, User), JsonRequestBehavior.AllowGet)); } }
/// <summary> /// Get chart data by categories /// </summary> /// <param name="model">model with settins</param> /// <param name="user">user</param> /// <returns></returns> public IEnumerable <IEnumerable <object> > GetChartDataByCategories(DynamicsViewModel model, IPrincipal user) { var currancyName = Database.Currencies.Get(model.CurrencyId).Name; var operations = Database.Operations.Find(x => x.UserId == user.Identity.GetUserId()).ToList(); var categories = Database.Categories.Find(x => x.UserId == user.Identity.GetUserId()).ToList(); var data = new List <IEnumerable <object> >(); var groups = operations.GroupBy(x => x.CreateDate, (date, items) => new { Date = date, Items = items.GroupBy(x => x.CategoryId) .Select(g => new { CategoryId = g.First().CategoryId, Date = g.First().CreateDate.Date, Sum = GetAmountInCurrency(currancyName, g.Sum(c => c.AmountInBYN), g.First().CreateDate) }) }); var legendItem = new List <object> { "" }; categories.ForEach(x => legendItem.Add(x.Name)); data.Add(legendItem); for (var i = model.DateFrom.Date; i <= model.DateTo.Date; i = i.AddDays(1)) { var item = new List <object> { i.ToShortDateString() }; var group = groups.FirstOrDefault(x => x.Date.Date == i); foreach (var cat in categories) { if (group == null) { item.Add(0); } else { item.Add(group.Items.FirstOrDefault(x => x.CategoryId == cat.Id)?.Sum ?? 0); } } data.Add(item); } return(data); }
/// <summary> /// Fill dictionaries for settings of chart /// </summary> /// <param name="model">model with settings</param> /// <returns></returns> public DynamicsViewModel FillDictionaries(DynamicsViewModel model) { model.DateFrom = DateTime.Now.AddDays(-30); model.DateTo = DateTime.Now; model.CurrenciesList = Database.Currencies.GetAll() .Select(x => new SelectListItem { Value = x.Id.ToString(), Text = x.Name }); return(model); }
/// <summary> /// Get data for chart by operations types /// </summary> /// <param name="model">model with settings</param> /// <param name="user">user</param> /// <returns></returns> public IEnumerable <IEnumerable <object> > GetChartDataByTypes(DynamicsViewModel model, IPrincipal user) { var currancyName = Database.Currencies.Get(model.CurrencyId).Name; var operations = Database.Operations.Find(x => x.UserId == user.Identity.GetUserId() && model.DateFrom.Date <= x.CreateDate.Date && x.CreateDate.Date <= model.DateTo.Date).ToList(); //operations by date range var incomeOperations = operations.Where(x => x.OperationType == OperationType.Income) .GroupBy(x => x.CreateDate.Date) .Select(g => new { Date = g.First().CreateDate.Date, Sum = GetAmountInCurrency(currancyName, g.Sum(c => c.AmountInBYN), g.First().CreateDate) //chart data of income operations }); var spendingOperations = operations.Where(x => x.OperationType == OperationType.Spending) .GroupBy(x => x.CreateDate.Date) .Select(g => new { Date = g.First().CreateDate.Date, Sum = GetAmountInCurrency(currancyName, g.Sum(c => c.AmountInBYN), g.First().CreateDate) //data of spending operations }); var data = new List <IEnumerable <object> >(); data.Add(new List <object> { "", "Доходы", "Расходы" }); //adding legend info for (var i = model.DateFrom.Date; i <= model.DateTo.Date; i = i.AddDays(1)) //date range { var currIncome = incomeOperations.FirstOrDefault(x => x.Date == i)?.Sum ?? 0; //if has't operation in date - sum=0 var currSpending = spendingOperations.FirstOrDefault(x => x.Date == i)?.Sum ?? 0; // data.Add(new List <object> { i.ToShortDateString(), currIncome, currSpending }); } return(data); }