public ProposalItemWithPrice(string proposalUId, BacklogItem item, decimal value)
 {
     Price = value;
     BacklogItemUId = item.BacklogItemUId;
     Item = item;
     ProposalUId = ProposalUId;
 }
 public ProposalItemViewModel(ProposalViewModel proposal, BacklogItem item, BacklogItemGroup group)
 {
     this.proposal = proposal;
     this.Item = item;
     this.ItemGroup = group;
     OnPropertyChanged("IsAtProposal");
 }
Example #3
0
        public void ChangeBacklogItemIssueType(string backlogItemUId, short issueType)
        {
            BacklogItem item = GetBacklogItem(backlogItemUId);

            Project project = projectsService.GetProject(item.ProjectUId);

            VerifyPermissionForCreateEditItem(item, project);

            item.IssueType = issueType;
            backlogRepository.SaveBacklogItemIgnoreHours(item);
        }
Example #4
0
        public void ChangeBacklogItemGroup(string backlogItemUId, string groupUId)
        {
            BacklogItem item = GetBacklogItem(backlogItemUId);

            Project project = projectsService.GetProject(item.ProjectUId);

            VerifyPermissionForCreateEditItem(item, project);

            item.GroupUId = groupUId;
            backlogRepository.SaveBacklogItemIgnoreHours(item);
        }
        public void CanAddUserStoryWithComponents()
        {
            var backlog = new Backlog();
            var component = new Component("A");
            var item = new BacklogItem("US1", component);
            backlog.Add(item);

            var backlogItem = backlog.Items.Single();

            Assert.AreEqual(new Component("A"), backlogItem.FindComponentFor(new Skill("A")));
        }
Example #6
0
 public ActionResult Edit([Bind(Include = "BacklogItemId,Description,Estimate,SprintId")] BacklogItem backlogitem)
 {
     if (ModelState.IsValid)
     {
         db.Entry(backlogitem).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     ViewBag.SprintId = new SelectList(db.Sprints.OrderBy(s => s.SprintName), "SprintId", "SprintName", backlogitem.SprintId);
     return(View(backlogitem));
 }
        /// <summary>
        /// Saves a backlog item.
        /// If the item planned hours is old, it also replan the hours for the current planning number.
        /// </summary>
        /// <param name="item">The iem to be saved</param>
        public int AddBacklogItem(BacklogItem item)
        {
            if (item.Project == null)
                throw new Exception("Can not save a backlogitem without a Project property");

            var client = ClientHelper.GetClient(authorizator);
            HttpResponseMessage response = client.Post(Url("BacklogItems"), new ObjectContent<BacklogItem>(item, JsonValueMediaTypeFormatter.DefaultMediaType));
            ClientHelper.HandleHTTPErrorCode(response);
            item.BacklogItemNumber = response.Content.ReadAs<int>();
            return item.BacklogItemNumber;
        }
Example #8
0
        public void UpdateItemStatusToWorking(Task task)
        {
            BacklogItem item = GetBacklogItem(task.BacklogItemUId);

            if (item.Status != (short)BacklogItemStatus.ITEM_REQUIRED || task.EffectiveHours == 0)
            {
                return;
            }
            item.Status = (short)BacklogItemStatus.ITEM_WORKING;
            backlogRepository.SaveBacklogItemIgnoreHours(item);
        }
Example #9
0
        public void ESAggregateA_Applies_Domain_Events()
        {
            var id = new BacklogItemId();

            var item = BacklogItem.FromSummary(id, "summary");

            Assert.Equal(id, item.Id);
            Assert.Equal("summary", item.Summary);
            Assert.Equal(0, item.Version);

            Assert.Contains(item.DomainEvents, e => e is BacklogItemCreated);
        }
 public void Update(object data)
 {
     try
     {
         BacklogItem item = (BacklogItem)data;
         //We can do something here with the data for now just print a console line
         Console.WriteLine("Notification Received: " + item.description + " Has been updated");
     } catch {
         //Normally use logger here, for now print line
         Console.WriteLine("Can't cast data object to backlogitem");
     }
 }
Example #11
0
        public void Commit(BacklogItem backlogItem)
        {
            var ordering = this.backlogItems.Count + 1;

            var committedBacklogItem = new CommittedBacklogItem(
                this.TenantId,
                this.SprintId,
                backlogItem.BacklogItemId,
                ordering);

            this.backlogItems.Add(committedBacklogItem);
        }
Example #12
0
 public static DBBacklogItem ToEntity(this BacklogItem backlogItem)
 {
     return(new DBBacklogItem
     {
         Created = backlogItem.Created,
         Description = backlogItem.Description,
         EstimatedTime = backlogItem.EstimatedTime,
         Id = backlogItem.Id,
         Tasks = backlogItem.Tasks.Select(task => task.ToEntity()),
         Title = backlogItem.Title
     });
 }
Example #13
0
        public void Commit(BacklogItem backlogItem)
        {
            var ordering = _backlogItems.Count + 1;

            var committedBacklogItem = new CommittedBacklogItem(
                TenantId,
                SprintId,
                backlogItem.BacklogItemId,
                ordering);

            _backlogItems.Add(committedBacklogItem);
        }
Example #14
0
        private BacklogItem PrepareDefaultItem(Project project, string name, string groupName, int sprintNumber, DefaultItemGroups defaultGroup, ItemOccurrenceContraints constraint)
        {
            // create the new item
            BacklogItem item = new BacklogItem {
                BacklogItemUId       = Guid.NewGuid().ToString(),
                ProjectUId           = project.ProjectUId,
                Name                 = name,
                Description          = null,
                Status               = (short)BacklogItemStatus.ITEM_REQUIRED,
                BusinessPriority     = 1,
                OccurrenceConstraint = (short)constraint,
                SizeFactor           = 0,
                CreateDate           = DateTime.Now
            };

            item.Project = project;
            item.SyncPlannedHoursAndRoles(sprintNumber);

            // assign group
            ICollection <BacklogItemGroup> groups = GetBacklogItemGroups(project.ProjectUId);
            var group = groups.FirstOrDefault(g => g.DefaultGroup == (short)defaultGroup);

            if (group == null)
            {
                group = CreateDefaultGroup(project.ProjectUId, defaultGroup, groupName);
            }
            item.Group    = group;
            item.GroupUId = group.GroupUId;


            // assign size
            ItemSize size = backlogRepository.GetItemSizeByConstraint((short)constraint);

            if (size != null)
            {
                item.ItemSizeUId = size.ItemSizeUId;
                item.SizeFactor  = 1;
                item.Size        = size.Size * item.SizeFactor;

                // tries to set the ideal hour values
                foreach (var h in size.SizeIdealHours)
                {
                    var ph = item.PlannedHours.SingleOrDefault(p => p.Role.RoleShortName.ToLower() == h.RoleShortName.ToLower());
                    if (ph != null)
                    {
                        ph.Hours = h.Hours;
                    }
                }
            }

            return(item);
        }
Example #15
0
        public void EntitiesWithSameIdentityAndProps_ShouldBeEqual()
        {
            var guid = Guid.NewGuid();

            var id = new BacklogItemId(guid);

            var item0 = BacklogItem.FromSummary(id, "item summary");
            var item1 = BacklogItem.FromSummary(id, "item summary");

            Assert.True(item0.Equals(item1));
            Assert.Equal(item0, item1);
            Assert.True(item0 == item1);
        }
        public ForumTest()
        {
            Backlog     backlog     = new Backlog();
            Developer   dev         = new Developer();
            ScrumMaster scrumMaster = new ScrumMaster();
            Sprint      sprint      = new Sprint("Sprint 1", new DateTime(), new DateTime().AddDays(7), scrumMaster);

            sprint.addTeamMember(dev);
            Forum forum = new Forum(sprint);

            _backlogItem = new BacklogItem(backlog, "a new item", 12);
            _thread      = forum.addThread(_backlogItem, "there is a issue", "description", dev);
        }
        // GET: BacklogItem/Create
        public ActionResult Create(int?id)
        {
            if (id == null)
            {
                return(View());
            }
            var item = new BacklogItem
            {
                ProjectID = (int)id
            };

            return(View(item));
        }
Example #18
0
        static void Main(string[] args)
        {
            BacklogItem backlogItem = new BacklogItem();
            Dictionary <string, FormDrafter.ValueSetter> formInputs        = backlogItem.GetFormInputs();
            Dictionary <string, FormDrafter.ValueGetter> formCurrentValues = backlogItem.GetFormCurrentValues();
            FormDrafter formDrafter = new FormDrafter();

            formDrafter.Draw(formInputs, formCurrentValues);
            Console.WriteLine();
            formDrafter.Draw(formInputs, formCurrentValues);

            Console.ReadKey();
        }
Example #19
0
        public void UpdateBacklogItem(string backlogItemUId, BacklogItem item, Project project)
        {
            // updates the planning number
            foreach (PlannedHour h in item.PlannedHours)
            {
                if (h.PlanningNumber < project.CurrentPlanningNumber)
                {
                    h.PlanningNumber = project.CurrentPlanningNumber;
                }
            }

            backlogRepository.SaveBacklogItem(item);
        }
Example #20
0
        public void ToggleViewedBacklog(BacklogItem i)
        {
            try
            {
                i.Episode.HasBeenViewed = !i.Episode.HasBeenViewed;

                UpdateViewedOnBacklog(i.Episode);
            }
            catch (Exception ex)
            {
                ErrorManager.Log(ex);
            }
        }
Example #21
0
        private void SendTicketEmail(BacklogItem ticket, Project project, bool PONotification)
        {
            try {
                // get members and attach to the project
                mailer.AttachProjectMembers(project);

                // create body from the template
                ReportHelper.Report reports = new ReportHelper.Report();

                var template = "ticket_created";
                if (PONotification)
                {
                    template = "ticket_createdPO";
                }

                // get project scrum masters
                string scrumMasterStr = "";
                if (project.Roles != null && project.Memberships != null)
                {
                    var scrumMasterRoles = project.Roles.Where(r => r.PermissionSet == (short)PermissionSets.SCRUM_MASTER).Select(r => r.RoleUId).ToArray();
                    var scrumMasters     = project.Memberships.Where(m => m.IsActive && scrumMasterRoles.Contains(m.RoleUId)).Select(m => m.MemberUId).ToArray();
                    scrumMasterStr = string.Join(", ", scrumMasters);
                }

                ReportHelper.ReportConfig reportConfig = new ReportHelper.ReportConfig("EmailNotifications", template, Helper.ReportTemplate.ServerUrl);
                reportConfig.ReportObjects.Add(project);
                reportConfig.ReportObjects.Add(ticket);
                reportConfig.ReportVars.Add("ProjectScrumMasters", scrumMasterStr);


                string body = reports.CreateReportXAML(Helper.ReportTemplate.ServerUrl, reportConfig, true);

                // subject
                string subject = String.Format(TicketEmailSubject, project.ProjectNumber + "." + ticket.BacklogItemNumber);

                if (!String.IsNullOrEmpty(ticket.ExternalId))
                {
                    subject = String.Format(TicketEmailSubject, ticket.ExternalId);
                }

                // send it to all project members
                bool send = mailer.SendEmail(project, subject, body, PONotification);
                if (!send)
                {
                    ScrumFactory.Services.Logic.Helper.Log.LogMessage("Ticket email was not send.");
                }
            } catch (System.Exception ex) {
                ScrumFactory.Services.Logic.Helper.Log.LogError(ex);
            }
        }
Example #22
0
        // GET: /BacklogItem/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            BacklogItem backlogitem = db.BacklogItems.Find(id);

            if (backlogitem == null)
            {
                return(HttpNotFound());
            }
            return(View(backlogitem));
        }
Example #23
0
        public BacklogItem[] ChangeItemSprint(string backlogItemUId, int sprintNumber, bool lowPriority)
        {
            // get item
            BacklogItem item = GetBacklogItem(backlogItemUId);

            // verify permission
            authorizationService.VerifyPermissionAtProject(item.ProjectUId, PermissionSets.SCRUM_MASTER);

            ICollection <BacklogItem> backlog = GetCurrentBacklog(item.ProjectUId, (short)BacklogFiltersMode.ALL);

            Project project = projectsService.GetProject(item.ProjectUId);

            return(ChangeItemSprint(item, backlog, project, sprintNumber, lowPriority));
        }
Example #24
0
        public int AddBacklogItem(BacklogItem item)
        {
            Project project = projectsService.GetProject(item.ProjectUId);

            VerifyPermissionForCreateEditItem(item, project);

            backlogRepository.SaveBacklogItem(item);

            if (project.ProjectType == (short)ProjectTypes.TICKET_PROJECT && ShouldCreateTicketFolders) {
                CreateTicketFolder(project, item);
            }

            return item.BacklogItemNumber;
        }
Example #25
0
        //------------------------------------------------------------------------------------
        /// <summary>
        /// Begins the process of loading the current's team's planner schedule from the
        /// repository.
        /// </summary>
        //------------------------------------------------------------------------------------
        public void InitializeRepository(bool shouldClearProductGroup)
        {
            ExperienceItem.InitializeFilters();
            BacklogItem.InitializeFilters();

            if (shouldClearProductGroup)
            {
                BeginProductGroupQuery(null);
            }
            else
            {
                BeginOpenProductGroup();
            }
        }
Example #26
0
        private ICollection <BacklogItem> IncludeBacklogItemsThatHasTasks(string projectUId, ICollection <BacklogItem> items)
        {
            ICollection <Task> dailyTasks   = tasksService.GetProjectTasks(projectUId, DateTime.MinValue, DateTime.MinValue, true, null);
            List <Task>        outsideTasks = dailyTasks.Where(t => !items.Any(i => i.BacklogItemUId == t.BacklogItemUId)).ToList();

            foreach (Task task in outsideTasks)
            {
                BacklogItem item = GetBacklogItem(task.BacklogItemUId);
                if (!items.Any(i => i.BacklogItemUId == item.BacklogItemUId))
                {
                    items.Add(item);
                }
            }
            return(items);
        }
Example #27
0
        // GET: /BacklogItem/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            BacklogItem backlogitem = db.BacklogItems.Find(id);

            if (backlogitem == null)
            {
                return(HttpNotFound());
            }
            ViewBag.SprintId = new SelectList(db.Sprints.OrderBy(s => s.SprintName), "SprintId", "SprintName", backlogitem.SprintId);
            return(View(backlogitem));
        }
        public async Task Update(BacklogItem backlogItem)
        {
            var backlogItemToUpdate = await _context.BacklogItems.FirstOrDefaultAsync(b => b.Id == backlogItem.Id);

            if (backlogItemToUpdate == default)
            {
                throw new Exception("Provided backlogItem id is invalid");
            }

            backlogItemToUpdate.Created       = backlogItem.Created;
            backlogItemToUpdate.Description   = backlogItem.Description;
            backlogItemToUpdate.Title         = backlogItem.Title;
            backlogItemToUpdate.EstimatedTime = backlogItem.EstimatedTime;

            await _context.SaveChangesAsync();
        }
Example #29
0
        public void PlannedProductBacklogItem(BacklogItem backlogItem)
        {
            AssertionConcern.AssertArgumentEquals(this.TenantId, backlogItem.TenantId, "The product and backlog item must have same tenant.");
            AssertionConcern.AssertArgumentEquals(this.ProductId, backlogItem.ProductId, "The backlog item must belong to product.");

            int ordering = this.backlogItems.Count + 1;

            ProductBacklogItem productBacklogItem =
                new ProductBacklogItem(
                    this.TenantId,
                    this.ProductId,
                    backlogItem.BacklogItemId,
                    ordering);

            this.backlogItems.Add(productBacklogItem);
        }
Example #30
0
        private static Project ToProject(XmlProject xmlProject)
        {
            ArgumentChecks.AssertNotNull(xmlProject, nameof(xmlProject));

            var project = new Project(xmlProject.Id)
            {
                Title = xmlProject.Title
            };

            foreach (var xmlItem in xmlProject.Items)
            {
                var item = new Item(xmlItem.Id)
                {
                    PublicIdentifier                   = xmlItem.PublicIdentifier,
                    Summary                            = xmlItem.Summary,
                    Description                        = xmlItem.Description,
                    EstimatedCostOfDelayPerDay         = xmlItem.EstimatedCostOfDelayPerDay,
                    EstimatedDevelopmentDurationInDays = xmlItem.EstimatedDevelopmentDurationInDays
                };

                project.Items.Add(item);
            }

            foreach (var xmlBacklog in xmlProject.Backlogs)
            {
                var backlog = new Backlog(xmlBacklog.Id)
                {
                    Name = xmlBacklog.Name
                };

                foreach (var xmlBacklogItem in xmlBacklog.BacklogItems)
                {
                    var referencedItem = project.Items.Single(i => i.Id == xmlBacklogItem.ItemId);
                    var backlogItem    = new BacklogItem(referencedItem)
                    {
                        Rank = xmlBacklogItem.Rank
                    };

                    backlog.BacklogItems.Add(backlogItem);
                }

                project.Backlogs.Add(backlog);
            }

            return(project);
        }
        public void Should_AddCommentToPost()
        {
            //arrange
            BacklogItem backlogItem = new BacklogItem()
            {
                Title = "new featue",
                State = new BacklogComponentStateDoing()
            };
            string content = "some content";
            User   user1   = new User()
            {
                FirstName  = "Patrick",
                MiddleName = "van",
                LastName   = "Batenburg",
                Email      = "*****@*****.**"
            };
            User user2 = new User()
            {
                FirstName  = "Patrick2",
                MiddleName = "van",
                LastName   = "Batenburg"
            };
            Comment comment = new Comment()
            {
                Author  = user2,
                Content = "test"
            };
            Mock <Post> mock = new Mock <Post>(backlogItem, content, user1)
            {
                CallBase = true
            };

            //act
            mock.Object.Add(comment);

            //assert
            mock.Verify(x => x.Add(It.IsAny <Comment>()), Times.Exactly(1));
            Assert.Single(mock.Object.Comments);
            Assert.Equal(user1, mock.Object.Author);
            Assert.Equal(user1.Email, mock.Object.Author.Email);
            Assert.Equal(user1.FullName, mock.Object.Author.FullName);
            Assert.Equal(user2, mock.Object.Comments[0].Author);
            Assert.Equal(backlogItem.Title, mock.Object.Title);
            Assert.Equal(content, mock.Object.Content);
        }
Example #32
0
        public void ProgressTest()
        {
            //arrange
            Mock <Sprint> sprint = new Mock <Sprint>();

            Backlog backlog = new Backlog(sprint.Object);

            BacklogItem headItem = new BacklogItem("Desc");

            backlog.AddBacklogItem(headItem);

            //act
            headItem.Progress();

            //assert

            Assert.IsTrue(headItem.state.GetType().Equals("doing"));
        }
        public void AddBacklogItemToSprintTest()
        {
            //Arrange
            ScrumBoard  board       = new ScrumBoard();
            ScrumMaster master      = new ScrumMaster();
            Sprint      sprint      = new Sprint("sprint 1", DateTime.Now, DateTime.Now.AddDays(14), master);
            Backlog     backlog     = new Backlog();
            BacklogItem backlogitem = new BacklogItem(backlog, "test", 8);

            //Act
            project.AddBoard(board);
            board.AddSprint(sprint);
            board.AddBacklogItem(backlogitem);

            //Assert
            Assert.IsNotNull(project.GetBoard().getSprints());
            Assert.IsTrue(sprint.backlog.backlogItems.Contains(backlogitem));
        }
Example #34
0
        public void CheckSetBackHeadItem()
        {
            //arrange
            Mock <Sprint> sprint = new Mock <Sprint>();

            Backlog backlog = new Backlog(sprint.Object);

            BacklogItem headItem = new BacklogItem("Desc");

            backlog.AddBacklogItem(headItem);

            //act
            headItem.Progress();
            headItem.state.SetBack();

            //assert
            Assert.IsTrue(headItem.state.GetType().Equals("todo"));
        }
Example #35
0
        public void UpdateBacklogItem(string backlogItemUId, BacklogItem item)
        {
            Project project = projectsService.GetProject(item.ProjectUId);

            VerifyPermissionForCreateEditItem(item, project);

            UpdateBacklogItem(backlogItemUId, item, project);
        }
        public void ShowDetail(IChildWindow parentViewModel, BacklogItem item)
        {
            Item = item;
            SuggestedHours = null;

            ((DelegateCommand)NavigateToNextItemCommand).NotifyCanExecuteChanged();
            ((DelegateCommand)NavigateToPreviousItemCommand).NotifyCanExecuteChanged();

            if (!View.IsVisible)
                Show(parentViewModel);

            oldItem = Item.Clone();
            SetIdealHours();
            SetIsInEditMode();

            ArtifactListViewModel.ChangeContext(ArtifactContexts.BACKLOGITEM_ARTIFACT, Item.BacklogItemUId, RefreshBacklogItemArtifactCount);

            TaskListViewModel.Item = this.Item;
        }
        internal BacklogItem PrepareNewBacklogItem(string name, ItemOccurrenceContraints occurrenceConstraint, int? sprintNumber)
        {
            // if no sprint number was informed, tries to fit it at the avaiable sprints
            if (sprintNumber == null)
                sprintNumber = GetSprintNumberForInsert();

            // create the new item
            BacklogItem newItem = new BacklogItem {
                BacklogItemUId = Guid.NewGuid().ToString(),
                ProjectUId = Project.ProjectUId,
                Project = Project,
                Name = name,
                Description = null,
                Status = (short)BacklogItemStatus.ITEM_REQUIRED,
                BusinessPriority = NextBusinessPriority,
                OccurrenceConstraint = (short)occurrenceConstraint,
                SizeFactor = 0,
                CreateDate = DateTime.Now
            };

            SetItemGroupAndSize(newItem);

            // if is a SCRUM MASTER plan it at the sprint
            // if is a PRODUCT OWNER than sprintNumber will be null
            if(Project.HasPermission(authorizator.SignedMemberProfile.MemberUId, PermissionSets.SCRUM_MASTER))
                newItem.SyncPlannedHoursAndRoles(sprintNumber);

            return newItem;
        }
 internal void DuplicateBacklogItemHours(BacklogItem newItem, BacklogItem fromItem, int? sprintNumber)
 {
     newItem.PlannedHours = new List<PlannedHour>();
     Role[] orderedRoles = Project.Roles.OrderBy(r => r.PermissionSet).ThenBy(r => r.RoleName).ThenBy(r => r.RoleShortName).ToArray();
     for(int i=0; i<orderedRoles.Length && i<fromItem.PlannedHours.Count; i++) {
         PlannedHour h = fromItem.PlannedHours[i];
         PlannedHour hour = new PlannedHour { BacklogItemUId = newItem.BacklogItemUId, Hours = h.Hours, SprintNumber = sprintNumber, PlanningNumber = Project.CurrentPlanningNumber, RoleUId = orderedRoles[i].RoleUId };
         newItem.PlannedHours.Add(hour);
     }
 }
 internal void DuplicateBacklogItemHoursSameProject(BacklogItem newItem, BacklogItem fromItem, int? sprintNumber)
 {
     newItem.PlannedHours = new List<PlannedHour>();
     foreach (PlannedHour h in fromItem.CurrentPlannedHours) {
         if (Project.Roles.Any(r => r.RoleUId == h.RoleUId)) {
             PlannedHour hour = new PlannedHour { BacklogItemUId = newItem.BacklogItemUId, Hours = h.Hours, SprintNumber = sprintNumber, PlanningNumber = Project.CurrentPlanningNumber, RoleUId = h.RoleUId };
             newItem.PlannedHours.Add(hour);
         }
     }
 }
        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);
        }
        internal BacklogItem DuplicateBacklogItem(BacklogItem fromItem)
        {
            int? sprintNumber = GetSprintNumberForInsert();

            // create item
            BacklogItem newItem = new BacklogItem {
                BacklogItemUId = Guid.NewGuid().ToString(),
                ProjectUId = Project.ProjectUId,
                Project = Project,
                Name = fromItem.Name,
                Description = fromItem.Description,
                Status = fromItem.Status,
                BusinessPriority = NextBusinessPriority,
                OccurrenceConstraint = fromItem.OccurrenceConstraint,
                SizeFactor = fromItem.SizeFactor,
                Size = fromItem.Size,
                ItemSizeUId = fromItem.ItemSizeUId,
                CancelReason = fromItem.CancelReason,
                DeliveryDate = fromItem.DeliveryDate,
                StartedAt = fromItem.StartedAt,
                FinishedAt = fromItem.FinishedAt,
                IssueType = fromItem.IssueType,
                CreateDate = DateTime.Now
            };

            // copy planned hours
            if (fromItem.ProjectUId == Project.ProjectUId)
                DuplicateBacklogItemHoursSameProject(newItem, fromItem, sprintNumber);
            else
                DuplicateBacklogItemHours(newItem, fromItem, sprintNumber);

            newItem.SyncPlannedHoursAndRoles(sprintNumber);

            return newItem;
        }
 private void ShowTasksForItem(BacklogItem item)
 {
     ListMode = ListModes.LIST_MODE;
     SelectedBacklogItem = item;
     LoadItems();
     aggregator.Publish<IProjectTabViewModel>(ScrumFactoryEvent.ShowProjectTab, this);
 }
Example #43
0
        private void SendTicketEmail(BacklogItem ticket, string folder, Project project)
        {
            try {
                // get members and attach to the project
                mailer.AttachProjectMembers(project);

                // create body from the template
                ReportHelper.Report reports = new ReportHelper.Report();
                ReportHelper.ReportConfig reportConfig = new ReportHelper.ReportConfig("EmailNotifications", "ticket_created", Helper.ReportTemplate.ServerUrl);
                reportConfig.ReportObjects.Add(project);
                reportConfig.ReportObjects.Add(ticket);
                reportConfig.ReportVars.Add("TicketFolder", folder);

                string body = reports.CreateReportXAML(Helper.ReportTemplate.ServerUrl, reportConfig);

                // subject
                string subject = "Ticket #" + project.ProjectNumber + "." + ticket.BacklogItemNumber;

                // send it to all project members
                bool send = mailer.SendEmail(project, subject, body);
                if (!send)
                    ScrumFactory.Services.Logic.Helper.Log.LogMessage("Ticket email was not send.");
            } catch (System.Exception ex) {
                ScrumFactory.Services.Logic.Helper.Log.LogError(ex);
            }
        }
Example #44
0
        /// <summary>
        /// Moves the item to the target item position - 1
        /// </summary>
        /// <param name="item"></param>
        /// <param name="targetItem"></param>
        /// <returns></returns>
        private BacklogItem[] MoveItem(BacklogItem item, BacklogItem targetItem)
        {
            // verify permission
            authorizationService.VerifyPermissionAtProject(targetItem.ProjectUId, PermissionSets.SCRUM_MASTER);

            if (targetItem.OccurrenceConstraint == 0) // can not move to before a plan item
                return null;

            // get the sprint itens
            List<BacklogItem> sprintItems = GetCurrentBacklog(targetItem.ProjectUId, (short)BacklogFiltersMode.ALL)
                .Where(b => b.SprintNumber == targetItem.SprintNumber)
                .OrderBy(b => b.OccurrenceConstraint).ThenBy(b => b.BusinessPriority).ToList();

            Project project = projectsService.GetProject(item.ProjectUId);

            return MoveItem(item, targetItem, sprintItems, project);
        }
Example #45
0
        private BacklogItem[] ChangeItemSprint(BacklogItem item, ICollection<BacklogItem> backlog, Project project, int sprintNumber, bool lowPriority)
        {
            // if is moving back to the product backlog
            if (sprintNumber < 0) {
                item.SprintNumber = null;
                UpdateBacklogItem(item.BacklogItemUId, item, project);
                return new BacklogItem[] { item };
            }

            // if moving to a previous sprint or is low priority
            // insert it at the end of the sprint
            if (lowPriority || item.SprintNumber > sprintNumber) {
                BacklogItem targetItem = GetLastSprintDevelopmentItem(backlog, sprintNumber);
                int priority = 1;
                if (targetItem != null)
                    priority = targetItem.BusinessPriority + 1;
                item.SprintNumber = sprintNumber;
                item.BusinessPriority = priority;
                UpdateBacklogItem(item.BacklogItemUId, item, project);
                return new BacklogItem[] { item };
            }

            // if moving to a sprint ahead, insert it at the begining
            if (item.SprintNumber == null || item.SprintNumber < sprintNumber) {
                BacklogItem targetItem = GetFirstSprintDevelopmentItem(backlog, sprintNumber);
                // if the sprint has no items
                if (targetItem == null) {
                    item.SprintNumber = sprintNumber;
                    item.BusinessPriority = 1;
                    UpdateBacklogItem(item.BacklogItemUId, item, project);
                    return new BacklogItem[] { item };
                }
                List<BacklogItem> sprintItems = backlog.Where(i => i.SprintNumber == sprintNumber).ToList();
                return MoveItem(item, targetItem, sprintItems, project);

            }

            return null;
        }
Example #46
0
        public void UpdateBacklogItem(string backlogItemUId, BacklogItem item, Project project)
        {
            // updates the planning number
            foreach (PlannedHour h in item.PlannedHours)
                h.PlanningNumber = project.CurrentPlanningNumber;

            backlogRepository.SaveBacklogItem(item);
        }
 public void UpdateChangedItems(BacklogItem[] changedItems)
 {
     AskForRefresh();
 }
Example #48
0
 private void Store(BacklogItem backlogItem)
 {
     _session.Store(backlogItem);
 }
Example #49
0
 public void UpdateBacklogItemIgnoringHours(string backlogItemUId, BacklogItem item)
 {
     VerifyPermissionForCreateEditItem(item);
     backlogRepository.SaveBacklogItemIgnoreHours(item);
 }
 private void OnItemsSelectedChanged(BacklogItem item)
 {
     OnPropertyChanged("SelectedItemsCount");
     OnPropertyChanged("SelectedItemsPlannedHours");
     OnPropertyChanged("SelectedItemsEffectiveHours");
 }
Example #51
0
        private void CreateTicketFolder(Project project, BacklogItem item)
        {
            string path = "";

            try {

                if (!string.IsNullOrEmpty(project.DocRepositoryPath)) {

                    // creates the folder
                    if (project.DocRepositoryPath.EndsWith("\\"))
                        path = project.DocRepositoryPath + "Ticket " + item.BacklogItemNumber;
                    else
                        path = project.DocRepositoryPath + "\\Ticket " + item.BacklogItemNumber;

                    System.IO.Directory.CreateDirectory(path);

                    // adds as an artifact at the item
                    Artifact artifact = new Artifact();
                    artifact.ArtifactPath = path;
                    artifact.ArtifactName = "Ticket " + item.BacklogItemNumber;
                    artifact.ArtifactUId = Guid.NewGuid().ToString();
                    artifact.ArtifactContext = (short)ArtifactContexts.BACKLOGITEM_ARTIFACT;
                    artifact.ContextUId = item.BacklogItemUId;
                    artifact.ProjectUId = project.ProjectUId;

                    artifactService.AddArtifact(artifact);
                }

            } catch (Exception ex) {
                ScrumFactory.Services.Logic.Helper.Log.LogError(ex);
            }

            try {
                SendTicketEmail(item, path, project);
            } catch (Exception ex) {
                ScrumFactory.Services.Logic.Helper.Log.LogError(ex);
            }
        }
        private void PasteTextItems(string text)
        {
            if (String.IsNullOrEmpty(text))
                return;

            string[] items = text.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

            if (items.Length == 0)
                return;

            List<BacklogItem> clipItems = new List<BacklogItem>();
            foreach (string item in items) {

                string[] fields = item.Replace("\r","").Split(new char[] { '\t' }, StringSplitOptions.None);

                BacklogItem newItem = new BacklogItem() {
                    Name = fields[0],
                    BacklogItemUId = Guid.NewGuid().ToString(),
                    Status = (short)BacklogItemStatus.ITEM_REQUIRED,
                    OccurrenceConstraint = (int)ItemOccurrenceContraints.DEVELOPMENT_OCC,
                    SizeFactor = 1,
                    CreateDate = DateTime.Now
                };

                newItem.PlannedHours = new List<PlannedHour>();
                for (int i = 2; i < fields.Length; i++) {
                    decimal hours;
                    decimal.TryParse(fields[i], out hours);
                    newItem.PlannedHours.Add(new PlannedHour() { BacklogItemUId = newItem.BacklogItemUId, Hours = hours });
                }

                clipItems.Add(newItem);
            }

            PasteObjectItems(clipItems);
        }
Example #53
0
        private BacklogItem[] MoveItem(BacklogItem item, BacklogItem targetItem, List<BacklogItem> sprintItems, Project project)
        {
            int itemIndex = sprintItems.IndexOf(sprintItems.Where(b => b.BacklogItemUId == item.BacklogItemUId).SingleOrDefault());
            int targetIndex = sprintItems.IndexOf(sprintItems.Where(b => b.BacklogItemUId == targetItem.BacklogItemUId).SingleOrDefault());

            if (itemIndex == targetIndex)
                return null;

            // The item sprint may change, so link it to its project before do that
            // -> item.SprintNumber requires a project
            item.Project = project;

            // keep tracking of the changing items
            List<BacklogItem> changedItems = new List<BacklogItem>();
            changedItems.Add(item);

            // item was at other sprint
            if (itemIndex == -1) {

                // update item priority and resets the delivery date
                item.BusinessPriority = CalcsNewPriority(sprintItems, targetIndex);
                item.SprintNumber = targetItem.SprintNumber;
                item.DeliveryDate = null;
                UpdateBacklogItem(item.BacklogItemUId, item, project);

                for (int i = targetIndex; i < sprintItems.Count - 1; i++) {
                    if (sprintItems[i].OccurrenceConstraint == 1) {
                        sprintItems[i].BusinessPriority = sprintItems[i].BusinessPriority + 10;
                        UpdateBacklogItem(sprintItems[i].BacklogItemUId, sprintItems[i], project);
                        changedItems.Add(sprintItems[i]);
                    }
                }

                //BacklogItem last = sprintItems.Last();
                //last.BusinessPriority = last.BusinessPriority + 1;
                //UpdateBacklogItem(last.BacklogItemUId, last, project);
                //changedItems.Add(last);
            }

            // item at the same sprint and moving an item up
            else if (itemIndex > targetIndex) {

                // update item priority
                item.BusinessPriority = targetItem.BusinessPriority;
                item.SprintNumber = targetItem.SprintNumber;
                UpdateBacklogItem(item.BacklogItemUId, item, project);

                for (int i = targetIndex; i < itemIndex; i++) {
                        sprintItems[i].BusinessPriority = sprintItems[i + 1].BusinessPriority;
                        UpdateBacklogItem(sprintItems[i].BacklogItemUId, sprintItems[i], project);
                        changedItems.Add(sprintItems[i]);

                }
            }

            // item at the same sprint and moving an item down
            else if (itemIndex < targetIndex) {

                int realTargetIndex = targetIndex - 1;
                int itemPriority = sprintItems[realTargetIndex].BusinessPriority;

                for (int i = realTargetIndex; i >= itemIndex + 1; i--) {
                    sprintItems[i].BusinessPriority = sprintItems[i - 1].BusinessPriority;
                    UpdateBacklogItem(sprintItems[i].BacklogItemUId, sprintItems[i], project);
                    changedItems.Add(sprintItems[i]);
                }

                // update item priority
                item.BusinessPriority = itemPriority;
                item.SprintNumber = targetItem.SprintNumber;
                UpdateBacklogItem(item.BacklogItemUId, item, project);

            }

            return changedItems.ToArray();
        }
        private void SetItemGroupAndSize(BacklogItem item)
        {
            // find out the size of the new item
            if (ItemSizeListViewModel.PlanningSize == null)
                throw new Exception("Size list was not loaded yet");

            ItemSize size = null;

            if (item.OccurrenceConstraint == (int)ItemOccurrenceContraints.DEVELOPMENT_OCC) {
                if (GroupList.SelectedGroup != null)
                    item.Group = GroupList.SelectedGroup;
                else
                    item.Group = GroupList.DevelopmentGroup;
            }

            if (item.OccurrenceConstraint == (int)ItemOccurrenceContraints.PLANNING_OCC) {
                size = ItemSizeListViewModel.PlanningSize.ItemSize;
                item.Group = GroupList.PlanGroup;
            }

            if (item.OccurrenceConstraint == (int)ItemOccurrenceContraints.DELIVERY_OCC) {
                size = ItemSizeListViewModel.DeliverySize.ItemSize;
                item.Group = GroupList.DeliveryGroup;
            }

            // SINGLE SIZE MODE
            if (size==null) {
                size = ItemSizeListViewModel.SingleSize.ItemSize;
            }

            if (size != null) {
                item.Size = size.Size * item.SizeFactor;
                item.ItemSizeUId = size.ItemSizeUId;
            }

            item.GroupUId = item.Group.GroupUId;
        }
Example #55
0
        private BacklogItem PrepareDefaultItem(Project project, string name, string groupName, int sprintNumber, DefaultItemGroups defaultGroup, ItemOccurrenceContraints constraint)
        {
            // create the new item
            BacklogItem item = new BacklogItem {
                BacklogItemUId = Guid.NewGuid().ToString(),
                ProjectUId = project.ProjectUId,
                Name = name,
                Description = null,
                Status = (short)BacklogItemStatus.ITEM_REQUIRED,
                BusinessPriority = 1,
                OccurrenceConstraint = (short)constraint,
                SizeFactor = 0,
                CreateDate = DateTime.Now
            };
            item.Project = project;
            item.SyncPlannedHoursAndRoles(sprintNumber);

            // assign group
            ICollection<BacklogItemGroup> groups = GetBacklogItemGroups(project.ProjectUId);
            var group = groups.FirstOrDefault(g => g.DefaultGroup == (short)defaultGroup);
            if (group == null)
                group = CreateDefaultGroup(project.ProjectUId, defaultGroup, groupName);
            item.Group = group;
            item.GroupUId = group.GroupUId;

            // assign size
            ItemSize size = backlogRepository.GetItemSizeByConstraint((short)constraint);
            if (size != null) {
                item.ItemSizeUId = size.ItemSizeUId;
                item.SizeFactor = 1;
                item.Size = size.Size * item.SizeFactor;
            }

            return item;
        }
 private void ShowDetailWindow(BacklogItem item)
 {
     itemDetail.ShowDetail(projectContainer.Value, item);
 }
Example #57
0
        private void VerifyPermissionForCreateEditItem(BacklogItem item, Project project = null)
        {
            PermissionSets[] permissions = new PermissionSets[] { PermissionSets.SCRUM_MASTER, PermissionSets.PRODUCT_OWNER };

            if (project == null)
                project = projectsService.GetProject(item.ProjectUId);

            if (project.IsTicketProject)
                permissions = new PermissionSets[] { PermissionSets.SCRUM_MASTER, PermissionSets.PRODUCT_OWNER, PermissionSets.TEAM };

            authorizationService.VerifyPermissionAtProject(item.ProjectUId, permissions);

            if (!project.IsTicketProject && !authorizationService.IsProjectScrumMaster(item.ProjectUId) && item.SprintNumber != null)
                throw new WebFaultException<String>("Product owners can not plan items", System.Net.HttpStatusCode.BadRequest);
        }
        public void UpdateChangedItems(BacklogItem[] changedItems)
        {
            if (changedItems == null || Items==null)
                return;
            foreach (BacklogItem changedItem in changedItems) {
                BacklogItemViewModel itemVM = Items.SingleOrDefault(b => b.Item.BacklogItemUId == changedItem.BacklogItemUId);
                if (itemVM != null) {
                    itemVM.Item.SprintNumber = changedItem.SprintNumber;
                    itemVM.Item.BusinessPriority = changedItem.BusinessPriority;
                    itemVM.Item.Status = changedItem.Status;
                    if (changedItem.ArtifactCount != null)
                        itemVM.Item.ArtifactCount = changedItem.ArtifactCount;
                    //itemVM.IgnoreChangeCommands = true;
                    //itemVM.RefreshUI();
                    //itemVM.IgnoreChangeCommands = false;
                }
            }

            if (changedItems.Length == 1) {
                BacklogItemViewModel firstItem = Items.SingleOrDefault(b => b.Item.BacklogItemUId == changedItems[0].BacklogItemUId);
                ((IEditableCollectionView)backlogViewSource.View).EditItem(firstItem);
                ((IEditableCollectionView)backlogViewSource.View).CommitEdit();
            }
            else
                backlogViewSource.View.Refresh();

            OnPropertyChanged("ItemsLeftTotalHours");
            OnPropertyChanged("ItemsLeftTotalSize");
            OnPropertyChanged("RequiredVelocity");
        }
        private void CloseItem(BacklogItem item)
        {
            executor.StartBackgroundTask(() => {
                backlogService.ChangeBacklogItemStatus(item.BacklogItemUId, (short) BacklogItemStatus.ITEM_DONE);
            },
            () => {
                ((IEditableCollectionView)backlogViewSource.View).EditItem(item);
                item.Status = (short)BacklogItemStatus.ITEM_DONE;
                ((IEditableCollectionView)backlogViewSource.View).CommitEdit();
                aggregator.Publish<BacklogItem[]>(ScrumFactoryEvent.BacklogItemsChanged, new BacklogItem[] { item });

            });
        }
        /// <summary>
        /// Creates the new backlog item and saves it.
        /// </summary>
        private void CreateNewBacklogItem(BacklogItem newItem)
        {
            // save its
            executor.StartBackgroundTask(
                () => { backlogService.AddBacklogItem(newItem); },
                () => {
                    NewItemName = String.Empty;
                    BacklogItemViewModel vm = new BacklogItemViewModel();
                    vm.Init(backlogService, executor, aggregator, authorizator, Project, newItem);

                    // TO THIS STRANGE CHECK 'CUZ WHEN LIST IS EMPTY COMMITNEW THROWS STRANGE EXCEPTION
                    if (FilteredBacklog.IsEmpty || Items.Count == 0) {
                        Items.Add(vm);
                        backlogViewSource.View.Refresh();
                    }
                    else {
                        ((System.Windows.Data.ListCollectionView)backlogViewSource.View).AddNewItem(vm);
                        ((System.Windows.Data.ListCollectionView)backlogViewSource.View).CommitNew();
                    }
                    vm.NotifyAdded();
                    aggregator.Publish<BacklogItem[]>(ScrumFactoryEvent.BacklogItemsChanged, new BacklogItem[] { newItem });
                });
        }