public ProjectOverview GetOverview(int projectId) { if (!db.Projects.Any(k => k.ID == projectId)) { throw new ClientException("Team dont exist"); } // supervising teams List <TeamKeyValue> teams = db.TeamsProjects .Where(k => k.ProjectId == projectId) .Select(k => new TeamKeyValue(k.Team.ID, k.Team.Name)) .ToList(); List <int> teamsId = teams.Select(k => k.Id).ToList(); ProjectOverview overview = new ProjectOverview() { Teams = teams, Members = teams.Count > 0 ? db.Users.Where(k => teamsId.Contains(k.TeamId.Value)) .Select(k => new Models.Users.UserKeyValue(k.Id, k.FirstName + " " + k.LastName) { TeamId = k.TeamId }) .ToList() : new List <Models.Users.UserKeyValue>() }; IQueryable <DataSets.ProjectTask> q_tasks = db.ProjectTasks .Where(t => t.ProjectId == projectId); overview.TasksPerformance = GetTasksPerformance(q_tasks); // timesheet activities if (overview.Members.Count > 0) { //List<string> membersIds = overview.Members.Select(k => k.Id).ToList(); var q_tsActivities = db.TimeSheetActivities .Where(k => !k.DeletedAt.HasValue && k.TimeSheetTask.ProjectTask.ProjectId == projectId); overview.ActivitiesFrequency = q_tsActivities .OrderByDescending(k => k.FromDate) .GroupBy(k => k.FromDate.Date) .Take(30) .AsEnumerable() .Select((key) => new KeyValuePair <DateTime, int>(key.Key, key.Count())) .ToList(); // # overview.ActiveActivities = q_tsActivities .OrderByDescending(k => k.FromDate) .Where(k => !k.ToDate.HasValue) .Select(k => new TimeSheetActivity() { ID = k.ID, FromDate = k.FromDate, User = new User() { Id = k.TimeSheetTask.TimeSheet.User.Id, FirstName = k.TimeSheetTask.TimeSheet.User.FirstName, LastName = k.TimeSheetTask.TimeSheet.User.LastName, }, ProjectTask = new ProjectTask() { ID = k.TimeSheetTask.ProjectTask.ID, Title = k.TimeSheetTask.ProjectTask.Title, } }) .ToList(); //List<int> tasksIds = db.TimeSheetTasks.Where(k => k.ProjectTask.ProjectId == projectId) // .Select(k => k.ID) // .ToList(); overview.Workload = db.TimeSheetTasks.Where(k => k.ProjectTask.ProjectId == projectId) .Select(k => new { k.TimeSheet.UserId, Name = k.TimeSheet.User.FirstName + " " + k.TimeSheet.User.LastName, k.ProjectTask.StatusCode, }) .GroupBy(k => new { k.UserId, k.Name, }) .AsEnumerable() .Select(k => new KeyValuePair <Models.Users.UserKeyValue, TasksWorkload>(new Models.Users.UserKeyValue(k.Key.UserId, k.Key.Name), new TasksWorkload() { DoneCount = k.Count(t => t.StatusCode == (short)ProjectTaskStatus.Done), PendingCount = k.Count(t => t.StatusCode == (short)ProjectTaskStatus.Pending), ProgressCount = k.Count(t => t.StatusCode == (short)ProjectTaskStatus.InProgress) })) .ToList(); // add the users that are not in workloads that have no timesheets var memebresWithNoTimeSheets = overview.Members.Where(k => !overview.Workload.Any(w => w.Key.Id == k.Id)).ToList(); if (memebresWithNoTimeSheets.Count > 0) { overview.Workload.AddRange(memebresWithNoTimeSheets.Select(k => new KeyValuePair <Models.Users.UserKeyValue, TasksWorkload>(k, new TasksWorkload() { }))); } } return(overview); }
internal ToolStripMenuItem[] ProjectScanner(/*Action<int, int, string> onProgressChanged*/) { List <ToolStripMenuItem> returned = new List <ToolStripMenuItem>(); string FilesLocation = Properties.Settings.Default.DirProject; if (string.IsNullOrEmpty(FilesLocation)) { Log.System("Project Path not set, no scanning will be done"); return(null); } Log.System(string.Format("Scanning For projectfiles at : {0}", FilesLocation)); List <string> Filenames = Directory.EnumerateFiles(FilesLocation, "*" + Properties.Settings.Default.FileExtensionPm2, SearchOption.AllDirectories).ToList(); Log.System(string.Format("[Scanning Found projectfiles {0} out of {1} files, at : {2}]", Filenames.Count, Directory.EnumerateFiles(FilesLocation, "*.*", SearchOption.AllDirectories).Count(), FilesLocation)); Log.Spacer(); //Checking each found project. for (int i = 0; i < Filenames.Count; i++) { string shortfilename = "...\\" + Filenames[i].Substring(FilesLocation.Length + 1); string message = string.Format("[Scanning {0} out of {1}] {2}", i + 1, Filenames.Count, shortfilename); Log.System(message); // onProgressChanged(i + 1, Filenames.Count, message); Stopwatch sw = Stopwatch.StartNew(); try { BinaryFormatter binaryFmt = new BinaryFormatter(); // string FileName = string.Format(@"{0}\{1}{2}", Properties.Settings.Default.DirProjectTemp, p.ProjectName, Properties.Settings.Default.FileExtensionPm2); FileStream fs = new FileStream(Filenames[i], FileMode.Open); Project p = (Project)binaryFmt.Deserialize(fs); if (!p.projectDone) { message = string.Format("[Scanning {0} out of {1}] {2}", i + 1, Filenames.Count, "Project not done, will be added to list"); try { ToolStripMenuItem tsmi = new ToolStripMenuItem(string.Format("{0}. {1}", i, p.ProjectName)); switch (p.CurretPriority) { case 0: tsmi.Image = Properties.Resources.pmtpGrayIcon16; break; case 1: tsmi.Image = Properties.Resources.pmtpGrayIcon16; break; case 2: tsmi.Image = Properties.Resources.pmtpBlueIcon16; break; case 3: tsmi.Image = Properties.Resources.pmtpYellowIcon16; break; case 4: tsmi.Image = Properties.Resources.pmtpRedIcon16; break; default: tsmi.Image = Properties.Resources.pmtpGrayIcon16; break; } tsmi.Click += (sender, ex) => { ProjectOverview po = new ProjectOverview(p); foreach (Form f in Application.OpenForms) { if (f is Main) { po.MdiParent = f; po.Show(); break; } else { MessageBox.Show("Could not find main form."); po.Dispose(); } } }; returned.Add(tsmi); Log.System(message); } catch (System.Runtime.Serialization.SerializationException e) { Log.Error(string.Format("Following error occured during runtime {0}, with message {1}", e.GetType(), e.Message)); } } fs.Close(); } catch { Log.Error(string.Format("Coldnot load Project {0} migth be a to old version.", shortfilename[i])); } sw.Stop(); Log.LapsTime(sw.Elapsed, DateTime.Now, "Scanning Project Files"); Log.System(string.Format("[Scanning {0} out of {1}] Scanned in {2} s", i + 1, Filenames.Count, sw.Elapsed.TotalSeconds)); Log.Spacer(); } return(returned.ToArray()); }