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);
        }
Ejemplo n.º 2
0
        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());
        }