public void SaveSprint(Sprint sprint)
        {
            using (var context = new ScrumFactoryEntities(this.connectionString)) {
                Sprint oldSprint = GetSprint(sprint.SprintUId);

                // if is a new item insert it
                if (oldSprint == null)
                {
                    context.Sprints.AddObject(sprint);

                    // updates the item
                }
                else
                {
                    context.AttachTo("Sprints", oldSprint);
                    context.ApplyCurrentValues <Sprint>("Sprints", sprint);
                }

                context.SaveChanges();
            }
        }
        public ICollection <ProjectEvent> GetUserProjectEvents(string memberUId)
        {
            List <ProjectEvent> events = new List <ProjectEvent>();

            using (var context = new ScrumFactoryEntities(this.connectionString)) {
                System.DateTime limitDate = System.DateTime.Today.AddDays(4);

                ICollection <Project> projects = context.Projects.Include("Sprints").Where(p =>
                                                                                           (p.Status == (short)ProjectStatus.PROJECT_STARTED || p.Status == (short)ProjectStatus.PROPOSAL_APPROVED) &&
                                                                                           p.ProjectType != (short)ProjectTypes.SUPPORT_PROJECT &&
                                                                                           p.Memberships.Any(ms => ms.MemberUId == memberUId && ms.IsActive == true) &&
                                                                                           p.Sprints.Any(s =>
                                                                                                         (s.StartDate < limitDate && s.StartDate >= System.DateTime.Today) || // sprints que vão começar
                                                                                                         (s.EndDate < limitDate && s.EndDate >= System.DateTime.Today)))      // sprints que vão acabar
                                                 .ToList();


                foreach (Project p in projects)
                {
                    ProjectEvent e = new ProjectEvent()
                    {
                        ProjectUId = p.ProjectUId, ProjectName = p.ProjectName, ProjectNumber = p.ProjectNumber, EventType = (short)ProjectEventTypes.SPRINT_END
                    };
                    Sprint sprintThatWillStart = p.Sprints.OrderBy(s => s.SprintNumber).FirstOrDefault(s => s.StartDate.Date < limitDate && s.StartDate.Date >= System.DateTime.Today);
                    Sprint sprintThatWillEnd   = p.Sprints.OrderBy(s => s.SprintNumber).FirstOrDefault(s => s.EndDate.Date < limitDate && s.EndDate.Date >= System.DateTime.Today);

                    if (sprintThatWillEnd != null)
                    {
                        if (sprintThatWillEnd == p.LastSprint)
                        {
                            e.EventType = (short)ProjectEventTypes.PROJECT_END;
                        }
                        e.When         = sprintThatWillEnd.EndDate;
                        e.SprintNumber = sprintThatWillEnd.SprintNumber;
                    }
                    else
                    {
                        if (sprintThatWillStart != null)
                        {
                            e.When         = sprintThatWillStart.StartDate;
                            e.SprintNumber = sprintThatWillStart.SprintNumber;
                            if (e.SprintNumber == 1)
                            {
                                e.EventType = (short)ProjectEventTypes.PROJECT_START;
                            }
                            else
                            {
                                e.EventType = (short)ProjectEventTypes.SPRINT_START;
                            }
                        }
                    }

                    events.Add(e);
                }

                // late projects
                try
                {
                    var today = System.DateTime.Today;
                    ICollection <Project> lateProjects = context.Projects.Include("Sprints").Where(p =>
                                                                                                   (p.Status == (short)ProjectStatus.PROJECT_STARTED || p.Status == (short)ProjectStatus.PROPOSAL_APPROVED) &&
                                                                                                   p.ProjectType != (short)ProjectTypes.SUPPORT_PROJECT &&
                                                                                                   p.IsSuspended == false &&
                                                                                                   p.Memberships.Any(ms => ms.MemberUId == memberUId && ms.IsActive == true && ms.Role.PermissionSet == (short)PermissionSets.SCRUM_MASTER) &&
                                                                                                   p.Sprints.Max(s => s.EndDate) < today).ToList();

                    foreach (var p in lateProjects)
                    {
                        var e2 = new ProjectEvent()
                        {
                            ProjectUId = p.ProjectUId, ProjectName = p.ProjectName, ProjectNumber = p.ProjectNumber, EventType = (short)ProjectEventTypes.PROJECT_LATE
                        };
                        e2.When = p.LastSprint.EndDate.Date;
                        events.Add(e2);
                    }
                }
                catch (System.Exception) { }
            }

            return(events);
        }