public void ShowDialog(ScrumFactory.Services.AuthProviders.IOAuthProvider provider)
        {
            if (provider == null)
                 return;

             this.provider = provider;
             this.Title = provider.ProviderName;
             this.badLogin.Text = String.Format(Properties.Resources.bad_login, provider.ProviderName);
             this.badLogin.Visibility = Visibility.Collapsed;
             this.ShowDialog();
        }
        public void ShowDialog(ScrumFactory.Services.AuthProviders.IOAuthProvider provider)
        {
            if (provider == null)
                return;

            this.provider = provider;
            webView.Navigate(provider.LoginUrl);

            this.Owner = Application.Current.MainWindow;

            this.ShowDialog();
        }
        public void SaveProjectMember(ScrumFactory.ProjectMember member)
        {
            using (var context = new Sql.ScrumFactoryEntities(this.connectionString))
            {
                var memberEntity = context.ProjectMembers.Where(m => m.ProjectId == member.ProjectId && m.MemberId == member.MemberId).SingleOrDefault();

                if (memberEntity == null)
                {
                    memberEntity = new ProjectMember { MemberId = member.MemberId, ProjectId = member.ProjectId, RoleId = member.RoleId };
                    context.AddToProjectMembers(memberEntity);
                }

                memberEntity.RoleId = member.RoleId;

                context.SaveChanges();
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SprintViewModel"/> class.
        /// </summary>
        /// <param name="sprint">The sprint.</param>
        /// <param name="backlog">The backlog.</param>
        public SprintViewModel(
            IProjectsService projectsService,
            IBackgroundExecutor backgroundExecutor,
            IEventAggregator eventAggregator,
            Sprint sprint,
            ICollection<BacklogItemViewModel> backlog,
            ScrumFactory.Composition.Configuration sfConfig,
            ICalendarService calendar)
        {
            this.projectsService = projectsService;
            this.executor = backgroundExecutor;
            this.aggregator = eventAggregator;

            this.calendar = calendar;

            SFConfig = sfConfig;

            Sprint = sprint;
            backlogViewSource = new CollectionViewSource();
            backlogViewSource.Source = backlog;
            backlogViewSource.SortDescriptions.Add(new SortDescription("Item.OccurrenceConstraint", ListSortDirection.Ascending));
            backlogViewSource.SortDescriptions.Add(new SortDescription("Item.BusinessPriority", ListSortDirection.Ascending));
            backlogViewSource.Filter += new FilterEventHandler(backlogViewSource_Filter);
        }
        /// <summary>
        /// Moves the item to another item position or sprint according the drag and drop parameters.
        /// </summary>
        /// <param name="p">The drag and drop parameters.</param>
        private void MoveItemTo(ScrumFactory.Windows.Helpers.DragDrop.DropCommandParameter p)
        {
            BacklogItemViewModel item = p.Item as BacklogItemViewModel;
            BacklogItemViewModel targetItem = p.DropTargetItem as BacklogItemViewModel;

            // no item no move
            if (item == null)
                return;

            // if is a plan or delivery item, cant move it
            if (item.Item.OccurrenceConstraint != (short)ItemOccurrenceContraints.DEVELOPMENT_OCC)
                return;

            // if there is no target item, just move to the end of the backlog
            if (targetItem == null) {
                //item.ChangeSprint(Project.Sprints.Count, true);
                return;
            }

            // else move to the other position item
            item.MoveItemTo(targetItem.Item);
        }
        private void ChangeTaskItem(ScrumFactory.Windows.Helpers.DragDrop.DropCommandParameter p)
        {
            // no task, no change
            TaskViewModel taskVM = p.Item as TaskViewModel;
            if (taskVM == null)
                return;

            // no item, no change
            BacklogItem item = p.DropTargetItem as BacklogItem;
            if (item == null)
                return;

            taskVM.ChangeTaskItemCommand.Execute(item.BacklogItemUId);
        }
        private void MoveTask(ScrumFactory.Windows.Helpers.DragDrop.DropCommandParameter p)
        {
            // no group, no move
            if (p==null || p.Group == null)
                return;

            // no task, no move
            TaskViewModel taskVM = p.Item as TaskViewModel;
            if (taskVM == null)
                return;

            short newStatus = (short) p.Group.Name;
            taskVM.MoveTaskToCommand.Execute(newStatus);
        }
        private void BurndownConfig(ReportHelper.ReportConfig config, ScrumFactory.Project project)
        {
            var leftHoursByDay = backlogService.GetBurndownHoursByDay(project.ProjectUId, project.CurrentPlanningNumber.ToString());

            if (leftHoursByDay == null) return;

            var burndownVM = new BurnDownViewModel();
            burndownVM.ActualHours = leftHoursByDay.Where(h => h.LeftHoursMetric == LeftHoursMetrics.LEFT_HOURS).ToArray();
            burndownVM.ActualHoursAhead = leftHoursByDay.Where(h => h.LeftHoursMetric == LeftHoursMetrics.LEFT_HOURS_AHEAD).ToArray();
            burndownVM.PlannedHours = leftHoursByDay.Where(h => h.LeftHoursMetric == LeftHoursMetrics.PLANNING).ToArray();

            config.ReportViewModels.Add("burndown", burndownVM);
        }
        public BacklogItemViewModel(
            IBacklogService backlogService,
            IBackgroundExecutor backgroundExecutor,
            IEventAggregator eventAggregator,
            IAuthorizationService authorizator,
            Project project,
            BacklogItem item,
            ScrumFactory.Composition.Configuration sfConfig)
        {
            Init(backlogService, backgroundExecutor, eventAggregator, authorizator, project, item);

                SFConfig = sfConfig;

                ShowRepositoryLogCommand = new DelegateCommand(ShowRepositoryLog);
        }
        public void UpdateProject(ScrumFactory.Project project)
        {
            using (var context = new ScrumFactoryEntities(this.connectionString)) {

                var projectOld = GetProject(project.ProjectUId);
                context.AttachTo("Projects", projectOld);
                context.ApplyCurrentValues<Project>("Projects", project);

                if (projectOld.Memberships == null)
                    projectOld.Memberships = new List<ProjectMembership>();

                if (project.Memberships == null)
                    project.Memberships = new List<ProjectMembership>();

                var insertedMemberships = project.Memberships.Where(m => !projectOld.Memberships.Any(o => (o.MemberUId == m.MemberUId && o.RoleUId == m.RoleUId))).ToList();
                var updatedMemberships = project.Memberships.Where(m => projectOld.Memberships.Any(o => (o.MemberUId == m.MemberUId && o.RoleUId == m.RoleUId))).ToList();
                var deletedMemberships = projectOld.Memberships.Where(m => !project.Memberships.Any(o => (o.MemberUId == m.MemberUId && o.RoleUId == m.RoleUId))).ToList();

                foreach (ProjectMembership m in insertedMemberships)
                    context.AddObject("ProjectMemberships", m);
                foreach (ProjectMembership m in updatedMemberships)
                    context.ApplyCurrentValues<ProjectMembership>("ProjectMemberships", m);
                foreach (ProjectMembership m in deletedMemberships)
                    context.DeleteObject(m);

                context.SaveChanges();
            }
        }
        public void SaveProjectRole(ScrumFactory.Role role)
        {
            using (var context = new ScrumFactoryEntities(this.connectionString)) {
                Role oldRole = GetProjectRole(role.RoleUId);

                if (oldRole == null) {
                    context.Roles.AddObject(role);
                } else {
                    context.AttachTo("Roles", oldRole);
                    context.ApplyCurrentValues<Role>("Roles", role);
                }
                context.SaveChanges();
            }
        }
        public int InsertProject(ScrumFactory.Project project)
        {
            using (var context = new ScrumFactoryEntities(this.connectionString)) {
                context.Projects.AddObject(project);

                if(project.Memberships!=null)
                    foreach (ProjectMembership m in project.Memberships)
                        context.AddObject("ProjectMemberships", m);

                context.SaveChanges();
            }

            return project.ProjectNumber;
        }
        private ReportHelper.ReportConfig CreateReportConfig(ScrumFactory.Project project, string group, string template, string name)
        {
            var config = new ReportHelper.ReportConfig(group, template, name);

            // add project
            config.ReportObjects.Add(project);

            // get project members
            var members = teamService.GetProjectMembers(project.ProjectUId);
            foreach (var mm in project.Memberships)
                mm.Member = members.SingleOrDefault(m => m.MemberUId == mm.MemberUId);

            // add risks
            ICollection<Risk> risks = projectService.GetProjectRisks(project.ProjectUId);
            config.ReportObjects.Add(risks);

            // add groups
            ICollection<BacklogItemGroup> groups = backlogService.GetBacklogItemGroups(project.ProjectUId);
            config.ReportObjects.Add(groups);

            // add itens
            ICollection<BacklogItem> items = backlogService.GetBacklog(project.ProjectUId, null, (short)ScrumFactory.Services.BacklogFiltersMode.ALL);

            foreach (BacklogItem item in items) {
                item.ValidPlannedHours = item.GetValidPlannedHours();

                int? firstSprint = item.ValidPlannedHours.Min(h => h.SprintNumber);
                item.FirstSprintWorked = firstSprint.HasValue ? firstSprint.Value : project.LastSprint.SprintNumber;

                int? lastSprint = item.ValidPlannedHours.Max(h => h.SprintNumber);
                item.LastSprintWorked = lastSprint.HasValue ? lastSprint.Value : project.LastSprint.SprintNumber;

                if (item.FirstSprintWorked < project.CurrentValidSprint.SprintNumber)
                    item.OrderSprintWorked = item.LastSprintWorked;
                else
                    item.OrderSprintWorked = item.FirstSprintWorked;

                item.Group = groups.SingleOrDefault(g => g.GroupUId == item.GroupUId);
            }

            config.ReportObjects.Add(items);

            // add constraints
            ICollection<ProjectConstraint> constraints = constraintsService.GetProjectConstraints(project.ProjectUId);
            config.ReportObjects.Add(constraints);

            // add end date
            config.AddReportVar("ProjectEndDate", project.LastSprint.EndDate);

            if (project.CurrentSprint != null) {
                if (project.CurrentSprint.SprintNumber > 1) {
                    config.ReportVars.Add("ProjectCurrentSprintNumber", project.CurrentSprint.SprintNumber.ToString());
                    config.ReportVars.Add("ProjectPreviousSprintNumber", (project.CurrentSprint.SprintNumber - 1).ToString());
                }
                else {
                    if (project.Sprints.Count > project.CurrentSprint.SprintNumber + 1)
                        config.ReportVars.Add("ProjectCurrentSprintNumber", (project.CurrentSprint.SprintNumber + 1).ToString());
                    else
                        config.ReportVars.Add("ProjectCurrentSprintNumber", project.CurrentSprint.SprintNumber.ToString());

                    config.ReportVars.Add("ProjectPreviousSprintNumber", project.CurrentSprint.SprintNumber.ToString());
                }
            }

            return config;
        }
 public void HandleScrumFactoryException(ScrumFactory.Exceptions.ScrumFactoryException ex)
 {
     if (ex is ScrumFactory.Exceptions.NotAuthorizedException)
         aggregator.Publish(ScrumFactoryEvent.NotAuthorizedServerExceptionThrowed);
     else
         ShowAlertMessage(ex);
 }
 public IDialogViewModel NewDialog(string title, ScrumFactory.Composition.View.IView contentView)
 {
     MessageBoxViewModel vm = new MessageBoxViewModel(title, new MessageBox(), contentView);
     return vm;
 }
        private void ShowAlertMessage(ScrumFactory.Exceptions.ScrumFactoryException ex)
        {
            if (!ex.IsLocalized)
                ex.LocalizeException(Properties.Resources.ResourceManager);

            string exceptionType = ex.GetType().ToString().Replace('.', '_');
            string imageSource = Properties.Resources.ResourceManager.GetString(exceptionType + "_errorImageSource");
            if (imageSource != null)
                AlertMessageViewModel.ImageSource = Properties.Resources.ResourceManager.GetString(exceptionType + "_errorImageSource");
            else
                AlertMessageViewModel.ResetErrorImage();

            AlertMessageViewModel.Title = ex.LocalizedMessageTitle;
            AlertMessageViewModel.Message = ex.LocalizedMessage;

            ShowTopMenu = true;
            AlertMessageViewModel.Show();
        }
        /// <summary>
        /// Moves the item to another item position or sprint according the drag and drop parameters.
        /// </summary>
        /// <param name="p">The drag and drop parameters.</param>
        private void MoveItemTo(ScrumFactory.Windows.Helpers.DragDrop.DropCommandParameter p)
        {
            BacklogItemViewModel item = p.Item as BacklogItemViewModel;
            BacklogItemViewModel targetItem = p.DropTargetItem as BacklogItemViewModel;
            int? sprintNumber = p.DropTargetListTag as int?;

            // move to the product backlog
            if (sprintNumber == null)
                sprintNumber = -1;

            // no item no move
            if (item==null)
                return;

            // if is a plan or delivery item, cant move it
            if (item.Item.OccurrenceConstraint != (short)ItemOccurrenceContraints.DEVELOPMENT_OCC)
                return;

            // if there is no target item, just move to the end of the sprint
            if (targetItem == null && sprintNumber != null) {
                item.ChangeSprint((int)sprintNumber, true);
                return;
            }

            // else move to the other position item
            item.MoveItemTo(targetItem.Item);
        }