public virtual JsonResult RequestGlobalReportData(string EventName, GlobalMoodReportDataRequestModel requestModel) { try { Event evnt = GetEvent(EventName); this.logger.Info("App", string.Format("Request for global report data - reportId=[{0}] startDate=[{0}] endDate=[{0}]", requestModel.ReportId, requestModel.StartDate, requestModel.EndDate)); GlobalMoodReportModel model = GetGlobalMoodReport(evnt, evnt.MoodCategories.First(), requestModel.StartDate, requestModel.EndDate, evnt.ApplicationConfig.ReportMoodIsStaleMins, false); model.ReportId = requestModel.ReportId; return(Json(model)); } catch (Exception ex) { this.logger.Error("App", ex, "Failed request for personal mood report from app - model is null"); return(Json(new { Success = false })); } }
protected Image GetGlobalMoodImage(Event evnt, MoodCategory category, DateTime reportStart, DateTime reportEnd, int moodIsStaleMins, float tension, bool showDataPoints, int width, int height) { GlobalMoodReportModel report = GetGlobalMoodReport(evnt, category, reportStart, reportEnd, moodIsStaleMins, false); GlobalMoodMapImage moodMap = new GlobalMoodMapImage() { Width = width, Height = height, ReportStart = reportStart, ReportEnd = reportEnd, Tension = tension, ShowDataPoints = showDataPoints }; bool first = true; foreach (var snaphot in report.Snapshots.OrderBy(s => s.t)) { //var moods = snaphot.Moods.OrderBy(m => m.DisplayIndex).Select(m => m.Mood).ToArray(); //var moodColors = snaphot.Moods.OrderBy(m => m.DisplayIndex).Select(m => ColorTranslator.FromHtml(m.DisplayColor)).ToArray(); //var responseCounts = snaphot.Moods.OrderBy(m => m.DisplayIndex).Select(m => m.ResponseCount).ToArray(); //var responsePercentages = snaphot.Moods.OrderBy(m => m.DisplayIndex).Select(m => m.ResponsePercentage).ToArray(); var moodData = from s in snaphot.d join m in report.Moods on s.i equals m.DisplayIndex select new MyMood.Web.GlobalMoodMapImage.MoodMapItem { DisplayColor = ColorTranslator.FromHtml(m.DisplayColor), DisplayIndex = m.DisplayIndex, MoodType = m.MoodType, Name = m.Name, ResponseCount = s.c, ResponsePercentage = s.p }; if (first) { if (snaphot.t > reportStart) { moodMap.AddSnapshot(reportStart, moodData.OrderBy(m => m.DisplayIndex).ToList()); } first = false; } moodMap.AddSnapshot(snaphot.t, moodData.OrderBy(m => m.DisplayIndex).ToList()); } return(moodMap.ToBitmap()); }
protected GlobalMoodReportModel GetGlobalMoodReport(Event evnt, MoodCategory cat, DateTime reportStart, DateTime reportEnd, int moodIsStaleMins, bool includeActivities, int roundPercentagesToNPlaces) { var moods = this.db.Get <Mood>().Where(m => m.Category.Id == cat.Id); // get last previous snapshot var roundedReportEnd = MoodResponse.GetRoundedResponseTime(reportEnd); var snapshots = (from s in this.db.Get <Snapshot>() where s.Category.Id == cat.Id && s.Category.Id == cat.Id && s.TimeStamp >= reportStart && s.TimeStamp <= roundedReportEnd group s by s.TimeStamp into sg select new MoodSnaphotReportModel() { t = sg.Key, r = sg.Sum(r => r.ResponseCount), d = sg.Select(r => new MoodSnapshotDataModel() { c = r.ResponseCount, i = r.Mood.DisplayIndex, p = Math.Round(((decimal)r.ResponseCount / (decimal)sg.Sum(sgr => sgr.ResponseCount)) * 100M, roundPercentagesToNPlaces) }) }).OrderBy(s => s.t).ToList(); var first = snapshots.FirstOrDefault(); if (first == null || first.t != reportStart) { var startSnapTime = (from s in this.db.Get <Snapshot>() where s.Category.Id == cat.Id && s.Category.Id == cat.Id && s.TimeStamp < reportStart orderby s.TimeStamp descending select s.TimeStamp).FirstOrDefault(); if (startSnapTime != DateTime.MinValue && startSnapTime >= reportStart.AddMinutes(-(evnt.ApplicationConfig.ReportMoodIsStaleMins))) { var startSnap = (from s in this.db.Get <Snapshot>() where s.Category.Id == cat.Id && s.Category.Id == cat.Id && s.TimeStamp == startSnapTime group s by s.TimeStamp into sg select new MoodSnaphotReportModel() { //t = sg.Key, t = reportStart, r = sg.Sum(r => r.ResponseCount), d = sg.Select(r => new MoodSnapshotDataModel() { c = r.ResponseCount, i = r.Mood.DisplayIndex, p = Math.Round(((decimal)r.ResponseCount / (decimal)sg.Sum(sgr => sgr.ResponseCount)) * 100M, roundPercentagesToNPlaces) }) }).Single(); snapshots.Insert(0, startSnap); } else { var allMoods = this.db.Get <Mood>().Where(m => m.Category.Event.Id == evnt.Id).OrderBy(m => m.DisplayIndex).ToList(); snapshots.Insert(0, new MoodSnaphotReportModel() { t = reportStart, r = 0, d = allMoods.Select(m => new MoodSnapshotDataModel() { c = 0, i = m.DisplayIndex, p = Math.Round(100M / (decimal)allMoods.Count(), roundPercentagesToNPlaces) }) }); } } var prompts = this.db.Get <MoodPrompt>().Where(p => p.Event.Id == evnt.Id && p.Activity.TimeStamp >= reportStart && p.Activity.TimeStamp <= reportEnd).OrderBy(p => p.Activity.TimeStamp); var activities = from a in this.db.Get <Activity>() join p in prompts on a.Id equals p.Activity.Id into ga from pa in ga.DefaultIfEmpty() select new { Activity = a, HasPrompt = pa != null }; var model = new GlobalMoodReportModel() { Snapshots = snapshots, Prompts = includeActivities ? prompts.Select(p => new GlobalActivityModel() { Id = p.Id, Title = p.Activity.Title, TimeStamp = p.Activity.TimeStamp }).ToList() : null, Activities = includeActivities ? activities.Where(a => a.HasPrompt == false).Select(e => new GlobalActivityModel() { Id = e.Activity.Id, Title = e.Activity.Title, TimeStamp = e.Activity.TimeStamp }).ToList() : null, Moods = moods.Select(m => new MoodModel() { Id = m.Id, Name = m.Name, DisplayColor = m.DisplayColor, DisplayIndex = m.DisplayIndex, MoodType = m.MoodType }).ToList() }; return(model); }