public async Task <IActionResult> CompleteMerge(MergeViewModel mergeViewModel)
        {
            await PerformExtraValidationsAsync(mergeViewModel);

            if (ModelState.IsValid)
            {
                var rekeningen = await _rekeningenService.GetRawListByIdsAsync(mergeViewModel.RekeningIds);

                if (rekeningen.Count != mergeViewModel.RekeningIds.Count)
                {
                    //Niet alle aangegeven rekeningen konden gevonden worden
                    return(NotFound());
                }

                //Alles naar de eerste toe zetten
                var uiteindelijkeRekening = rekeningen.First();
                var overigeRekeningen     = rekeningen.Skip(1).ToList();
                _mapper.Map(mergeViewModel, uiteindelijkeRekening);
                foreach (var overigeRekening in overigeRekeningen)
                {
                    //Transactie verplaatsen meteen awaiten.
                    //Anders zou een transactie met een boeking naar zichzelf mogelijk kunnen worden
                    //Vb: RekA, RekB, RekC allen naar RekA toe. Transactie tussen RekB en RekC zou asynchroon de boeking-naar-zichzelf-check kunnen missen
                    await MoveTranssactiesAsync(uiteindelijkeRekening, overigeRekening);

                    _rekeningenService.Remove(overigeRekening);
                }
                await _rekeningenService.SaveChangesAsync();

                return(RedirectToAction(nameof(Details), new { id = uiteindelijkeRekening.RekeningId }));
            }
            await SetSelectListsAsync(mergeViewModel);

            return(View(nameof(Merge), mergeViewModel));
        }
Beispiel #2
0
        public JsonNetResult Merge(MergeViewModel vm)
        {
            if (ModelState.IsValid)
            {
                AdminUser user = this.userTasks.GetAdminUser(User.Identity.Name);

                if (user != null)
                {
                    if (this.orgTasks.MergeUnits(vm.ToKeepId, vm.ToDeleteId, user.UserID, ((PrfPrincipal)User).HasPermission(AdminPermission.CanViewPersonResponsibilities)) == 1)
                    {
                        return(JsonNet(null));
                    }
                    else
                    {
                        Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                        return(JsonNet(new { merge = "There was a database error merging the units." }));
                    }
                }
                else
                {
                    Response.StatusCode = (int)HttpStatusCode.NotFound;
                    return(JsonNet(new { user = "******" }));
                }
            }
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            return(JsonNet(GetErrorsForJson()));
        }
        public async Task <IActionResult> Merge(IList <RekeningViewModel> rekeningViewModels)
        {
            var rekeningIds = rekeningViewModels.Where(r => r.Selected).Select(r => r.RekeningId).ToList();

            if (rekeningIds.Count < 2)
            {
                //Kan niet mergen met minder dat 2 rekeningen
                return(RedirectToAction(nameof(Index)));
            }
            var rekeningen = await _rekeningenService.GetRawListByIdsAsync(rekeningIds);

            if (rekeningen.Count != rekeningIds.Count)
            {
                //Niet alle aangegeven rekeningen konden gevonden worden
                return(NotFound());
            }

            var categorieIds = rekeningen.Where(r => r.StandaardCategorieId.HasValue).Select(r => r.StandaardCategorieId.Value).Distinct().ToList();

            var mergeViewModel = new MergeViewModel
            {
                RekeningIds          = rekeningIds,
                Naam                 = string.Join(", ", rekeningen.Select(r => r.Naam)),
                Rekeningnummer       = string.Join(", ", rekeningen.Select(r => r.Rekeningnummer).Where(s => !string.IsNullOrEmpty(s))),
                IsEigenRekening      = rekeningen.Any(r => r.IsEigenRekening),                      //Als één van de rekeningen eigen is, is de gemergede standaard eigen
                StandaardCategorieId = categorieIds.Count == 1 ? categorieIds.First() : (int?)null, //Als er één categorie is, deze voorvullen
                CategorieIds         = categorieIds
            };

            await Task.WhenAll(
                SetSelectListsAsync(mergeViewModel),
                SetSaldoAsync(mergeViewModel));

            return(View(mergeViewModel));
        }
Beispiel #4
0
        public void MergeViewModel_DoDeactivate_CanSave_MessageBoxYes()
        {
            //------------Setup for test--------------------------
            _firstResource = CreateResource(ResourceType.WorkflowService);

            var mockWorkSurfaceViewModel = new Mock <IMergePreviewWorkflowDesignerViewModel>();

            mockWorkSurfaceViewModel.Setup(model => model.Server).Returns(_environmentModel.Object);
            mockWorkSurfaceViewModel.Setup(model => model.ResourceModel).Returns(_firstResource.Object);

            var currentTree = new List <ConflictTreeNode>();
            var diffTree    = new List <ConflictTreeNode>();

            _mockParseServiceForDifferences.Setup(parser =>
                                                  parser.GetDifferences(It.IsAny <IContextualResourceModel>(), It.IsAny <IContextualResourceModel>(),
                                                                        false)).Returns((currentTree, diffTree));

            //------------Execute Test---------------------------

            var popupController = new Mock <IPopupController>();

            popupController.Setup(controller => controller.Show(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <MessageBoxButton>(), MessageBoxImage.Information, "", false, false, true, false, false, false)).Returns(MessageBoxResult.Yes);
            CustomContainer.Register(popupController.Object);

            var mockConflictRow = new Mock <IToolConflictRow>();

            mockConflictRow.Setup(cr => cr.HasConflict).Returns(true);
            var conflicts = new List <IToolConflictRow>();

            conflicts.Add(mockConflictRow.Object);

            var viewModel = new Mock <IMergeWorkflowViewModel>();

            viewModel.Setup(model => model.MergePreviewWorkflowDesignerViewModel).Returns(mockWorkSurfaceViewModel.Object);
            var vm = new MergeViewModel(_eventAggregator.Object, viewModel.Object, popupController.Object, new Mock <IView>().Object);

            Assert.IsNotNull(vm);
            Assert.IsFalse(vm.HasVariables);
            Assert.IsFalse(vm.HasDebugOutput);
            Assert.IsNull(vm.DisplayName);
            Assert.AreEqual("MergeConflicts", vm.ResourceType);
            Assert.IsNull(vm.HelpText);
            Assert.IsFalse(vm.IsDirty);

            var mergeWorkflowViewModel = new MergeWorkflowViewModel(_firstResource.Object, _firstResource.Object, false);

            mergeWorkflowViewModel.Conflicts       = conflicts;
            mergeWorkflowViewModel.HasMergeStarted = true;
            mergeWorkflowViewModel.DisplayName     = "Merge";

            vm.ViewModel = mergeWorkflowViewModel;

            vm.DoDeactivate(true);

            //------------Assert Results-------------------------

            Assert.IsTrue(vm.IsDirty);
            Assert.IsNull(vm.HelpText);
        }
        private void UpdateMerges(
            IEnumerable <Branch> sourceBranches,
            RepositoryViewModel repositoryViewModel)
        {
            var branches    = repositoryViewModel.Branches;
            var commits     = repositoryViewModel.Commits;
            var commitsById = repositoryViewModel.CommitsById;
            var merges      = repositoryViewModel.Merges;

            var mergePoints = commits
                              .Where(c => c.IsMergePoint && c.Commit.HasSecondParent && sourceBranches.Contains(c.Commit.SecondParent.Branch))
                              .ToList();

            var branchStarts = branches.Where(b =>
                                              b.Branch.HasParentBranch && sourceBranches.Contains(b.Branch.ParentCommit.Branch))
                               .Select(b => b.Branch.FirstCommit)
                               .ToList();

            bool isMergeInProgress =
                repositoryMgr.Repository.Status.IsMerging &&
                branches.Any(b => b.Branch == repositoryMgr.Repository.CurrentBranch) &&
                repositoryViewModel.MergingBranch != null &&
                branches.Any(b => b.Branch.Id == repositoryViewModel.MergingBranch.Id) &&
                repositoryMgr.Repository.UnComitted != null;

            int mergeCount = mergePoints.Count + branchStarts.Count + (isMergeInProgress ? 1 : 0);

            SetNumberOfItems(merges, mergeCount, _ => new MergeViewModel());

            int index = 0;

            foreach (CommitViewModel childCommit in mergePoints)
            {
                CommitViewModel parentCommit = commitsById[childCommit.Commit.SecondParent.Id];

                MergeViewModel merge = merges[index++];

                SetMerge(merge, branches, childCommit, parentCommit);
            }

            foreach (Commit childCommit in branchStarts)
            {
                CommitViewModel parentCommit = commitsById[childCommit.FirstParent.Id];

                MergeViewModel merge = merges[index++];

                SetMerge(merge, branches, commitsById[childCommit.Id], parentCommit, false);
            }

            if (isMergeInProgress)
            {
                CommitId        mergeSourceId = new CommitId(repositoryViewModel.MergingCommitSha);
                CommitViewModel parentCommit  = commitsById[mergeSourceId];
                MergeViewModel  merge         = merges[index++];
                SetMerge(merge, branches, commitsById[parentCommit.Commit.Repository.UnComitted.Id], parentCommit);
            }
        }
Beispiel #6
0
        /// <summary>
        /// Returns range of item ids, which are visible in the area currently shown
        /// </summary>
        protected override IEnumerable <int> GetItemIds(Rect viewArea)
        {
            if (VirtualArea == Rect.Empty || viewArea == Rect.Empty)
            {
                yield break;
            }

            if (openRepos.Any())
            {
                yield return(0 + minOpenRepoIndex);

                yield break;
            }

            // Get the part of the rectangle that is visible
            viewArea.Intersect(VirtualArea);

            int viewAreaTopIndex    = Converters.ToTopRowIndex(viewArea, commits.Count);
            int viewAreaBottomIndex = Converters.ToBottomRowIndex(viewArea, commits.Count);

            if (viewAreaBottomIndex > viewAreaTopIndex)
            {
                // Return visible branches
                for (int i = 0; i < branches.Count; i++)
                {
                    BranchViewModel branch = branches[i];

                    if (IsVisible(
                            viewAreaTopIndex, viewAreaBottomIndex, branch.TipRowIndex, branch.FirstRowIndex))
                    {
                        yield return(i + minBranchIndex);
                    }
                }

                // Return visible merges
                for (int i = 0; i < merges.Count; i++)
                {
                    MergeViewModel merge = merges[i];
                    if (IsVisible(viewAreaTopIndex, viewAreaBottomIndex, merge.ChildRow, merge.ParentRow))
                    {
                        yield return(i + minMergeIndex);
                    }
                }

                // Return visible commits
                for (int i = viewAreaTopIndex; i <= viewAreaBottomIndex; i++)
                {
                    if (i >= 0 && i < commits.Count)
                    {
                        yield return(i + minCommitIndex);
                    }
                }
            }
        }
Beispiel #7
0
        /// <summary>
        /// Request the Merge Dashboard.
        /// </summary>
        /// <param name="project"></param>
        /// <param name="source"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public ActionResult Merge(string project, string source, string target)
        {
            var teamProject = _teamRepository.GetProject(project);
            var model       = new MergeViewModel
            {
                ApiPath     = Url.Action("GetMergeViewModel", "Source"),
                Project     = teamProject,
                Environment = teamProject.MergeEnvironments
                              .FirstOrDefault(m => string.Compare(m.Source.ToString(), source, StringComparison.OrdinalIgnoreCase) == 0 && string.Compare(m.Target.ToString(), target, StringComparison.OrdinalIgnoreCase) == 0)
            };

            return(model.Environment == null?View("Error") : View("Index", model));
        }
        private async Task SetSaldoAsync(MergeViewModel mergeViewModel)
        {
            List <Task <decimal> > saldoTasks = new List <Task <decimal> >();

            foreach (var rekeningId in mergeViewModel.RekeningIds)
            {
                var saldoTask = _rekeningenService.GetSaldoAsync(new Rekening {
                    RekeningId = rekeningId
                });
                saldoTasks.Add(saldoTask);
            }
            var saldos = await Task.WhenAll(saldoTasks);

            mergeViewModel.Saldo = saldos.Sum();
        }
Beispiel #9
0
        public void MergeViewModel_PropertyChanged_DataListViewModel_IsTrue()
        {
            //------------Setup for test--------------------------
            _firstResource = CreateResource(ResourceType.WorkflowService);

            var mockWorkSurfaceViewModel = new Mock <IMergePreviewWorkflowDesignerViewModel>();

            mockWorkSurfaceViewModel.Setup(model => model.Server).Returns(_environmentModel.Object);
            mockWorkSurfaceViewModel.Setup(model => model.ResourceModel).Returns(_firstResource.Object);

            var currentTree = new List <ConflictTreeNode>();
            var diffTree    = new List <ConflictTreeNode>();

            _mockParseServiceForDifferences.Setup(parser =>
                                                  parser.GetDifferences(It.IsAny <IContextualResourceModel>(), It.IsAny <IContextualResourceModel>(),
                                                                        false)).Returns((currentTree, diffTree));

            //------------Execute Test---------------------------

            var viewModel = new Mock <IMergeWorkflowViewModel>();

            viewModel.Setup(model => model.MergePreviewWorkflowDesignerViewModel).Returns(mockWorkSurfaceViewModel.Object);
            var vm = new MergeViewModel(_eventAggregator.Object, viewModel.Object, new Mock <IPopupController>().Object, new Mock <IView>().Object);

            var mergeWorkflowViewModel = new MergeWorkflowViewModel(_firstResource.Object, _firstResource.Object, false);

            mergeWorkflowViewModel.HasMergeStarted = true;

            vm.ViewModel = mergeWorkflowViewModel;

            bool wasCalled = false;

            vm.PropertyChanged += (sender, args) =>
            {
                if (args.PropertyName == "DataListViewModel")
                {
                    wasCalled = true;
                }
            };

            Assert.IsNotNull(vm);
            Assert.IsFalse(vm.HasVariables);
            Assert.IsFalse(vm.HasDebugOutput);
            Assert.AreEqual(mergeWorkflowViewModel.DisplayName, vm.DisplayName);
            Assert.AreEqual("MergeConflicts", vm.ResourceType);
            Assert.IsNull(vm.HelpText);
            Assert.IsTrue(vm.IsDirty);
        }
Beispiel #10
0
        public void MergeViewModel_DoDeactivate_CanSave_ExpectedFalse()
        {
            //------------Setup for test--------------------------
            _firstResource = CreateResource(ResourceType.WorkflowService);

            var mockWorkSurfaceViewModel = new Mock <IMergePreviewWorkflowDesignerViewModel>();

            mockWorkSurfaceViewModel.Setup(model => model.Server).Returns(_environmentModel.Object);
            mockWorkSurfaceViewModel.Setup(model => model.ResourceModel).Returns(_firstResource.Object);

            var currentTree = new List <ConflictTreeNode>();
            var diffTree    = new List <ConflictTreeNode>();

            _mockParseServiceForDifferences.Setup(parser =>
                                                  parser.GetDifferences(It.IsAny <IContextualResourceModel>(), It.IsAny <IContextualResourceModel>(),
                                                                        false)).Returns((currentTree, diffTree));

            //------------Execute Test---------------------------

            var viewModel = new Mock <IMergeWorkflowViewModel>();

            viewModel.Setup(model => model.MergePreviewWorkflowDesignerViewModel).Returns(mockWorkSurfaceViewModel.Object);
            var vm = new MergeViewModel(_eventAggregator.Object, viewModel.Object, new Mock <IPopupController>().Object, new Mock <IView>().Object);

            Assert.IsNotNull(vm);
            Assert.IsFalse(vm.HasVariables);
            Assert.IsFalse(vm.HasDebugOutput);
            Assert.IsNull(vm.DisplayName);
            Assert.AreEqual("MergeConflicts", vm.ResourceType);
            Assert.IsNull(vm.HelpText);
            Assert.IsFalse(vm.IsDirty);

            vm.HelpText = string.Empty;

            var mergeWorkflowViewModel = new MergeWorkflowViewModel(_firstResource.Object, _firstResource.Object, false);

            vm.ViewModel = mergeWorkflowViewModel;

            var expectedValue = vm.DoDeactivate(false);

            //------------Assert Results-------------------------

            Assert.IsFalse(vm.ViewModel.IsDirty);
            Assert.IsTrue(vm.IsDirty);
            Assert.AreEqual(string.Empty, vm.HelpText);
            Assert.IsTrue(expectedValue);
            _shellViewModel.Verify(model => model.HelpViewModel.UpdateHelpText(It.IsAny <string>()));
        }
Beispiel #11
0
        public async Task <IHttpActionResult> MergeSend(MergeViewModel model)
        {
            return(await CurrentAccountExecuteAsync(async delegate(Account user)
            {
                var userFrom = await _auth.AccountGetAsync(model.AccountIdFrom);
                if (object.Equals(userFrom, null) || userFrom.Id == AccountId)
                {
                    return AccountNotFound();
                }

                var userPrimaryEmail = model.AccountIdPrimaryEmail == userFrom.Id ? userFrom : user;

                await NotificationManager.MergeConfirmationNotification(user, userFrom, userPrimaryEmail);

                return Ok();
            }));
        }
Beispiel #12
0
        public void MergeViewModel_GetView_ReturnsIView_NotNull()
        {
            //------------Setup for test--------------------------
            _firstResource = CreateResource(ResourceType.WorkflowService);

            var mockWorkSurfaceViewModel = new Mock <IMergePreviewWorkflowDesignerViewModel>();

            mockWorkSurfaceViewModel.Setup(model => model.Server).Returns(_environmentModel.Object);
            mockWorkSurfaceViewModel.Setup(model => model.ResourceModel).Returns(_firstResource.Object);

            var currentTree = new List <ConflictTreeNode>();
            var diffTree    = new List <ConflictTreeNode>();

            _mockParseServiceForDifferences.Setup(parser =>
                                                  parser.GetDifferences(It.IsAny <IContextualResourceModel>(), It.IsAny <IContextualResourceModel>(),
                                                                        false)).Returns((currentTree, diffTree));

            //------------Execute Test---------------------------

            var viewModel = new Mock <IMergeWorkflowViewModel>();

            viewModel.Setup(model => model.MergePreviewWorkflowDesignerViewModel).Returns(mockWorkSurfaceViewModel.Object);
            var vm = new MergeViewModel(_eventAggregator.Object, viewModel.Object, new Mock <IPopupController>().Object, new Mock <IView>().Object);

            Assert.IsNotNull(vm);
            Assert.IsFalse(vm.HasVariables);
            Assert.IsFalse(vm.HasDebugOutput);
            Assert.IsNull(vm.DisplayName);
            Assert.AreEqual("MergeConflicts", vm.ResourceType);
            Assert.IsNull(vm.HelpText);
            Assert.IsFalse(vm.IsDirty);

            var view = vm.GetView();

            //------------Assert Results-------------------------
            Assert.IsNotNull(view);
        }
        private void SetMerge(
            MergeViewModel merge,
            IReadOnlyCollection <BranchViewModel> branches,
            CommitViewModel childCommit,
            CommitViewModel parentCommit,
            bool isMerge = true)
        {
            BranchViewModel childBranch = branches
                                          .First(b => b.Branch == childCommit.Commit.Branch);
            BranchViewModel parentBranch = branches
                                           .First(b => b.Branch == parentCommit.Commit.Branch);

            if (isMerge)
            {
                childCommit.BrushInner = themeService.Theme.GetDarkerBrush(childCommit.Brush);
            }

            int childRow     = childCommit.RowIndex;
            int parentRow    = parentCommit.RowIndex;
            int childColumn  = childBranch.BranchColumn;
            int parentColumn = parentBranch.BranchColumn;

            bool isBranchStart = (childCommit.Commit.HasFirstParent &&
                                  childCommit.Commit.FirstParent.Branch != childCommit.Commit.Branch) ||
                                 (childCommit.Commit.Branch.IsLocalPart && parentCommit.Commit.Branch.IsMainPart);

            BranchViewModel mainBranch = childColumn >= parentColumn ? childBranch : parentBranch;

            int childX  = childCommit.X;
            int parentX = parentCommit.X;

            int x1 = childX <= parentX ? 0 : childX - parentX - 6;
            int y1 = 0;
            int x2 = parentX <= childX ? 0 : parentX - childX - 6;
            int y2 = Converters.ToY(parentRow - childRow) + Converters.HalfRow - 8;

            if (isBranchStart && x1 != x2)
            {
                y1 = y1 + 2;
                x1 = x1 + 2;
            }

            merge.ChildRow  = childRow;
            merge.ParentRow = parentRow;

            double y = (double)Converters.ToY(childRow);

            merge.Rect = new Rect(
                (double)Math.Min(childX, parentX) + 10,
                y + Converters.HalfRow,
                Math.Abs(childX - parentX) + 2 + (x1 == x2 ? 2 : 0),
                y2 + 2);
            merge.Width = merge.Rect.Width;

            merge.Line       = $"M {x1},{y1} L {x2},{y2}";
            merge.Brush      = mainBranch.Brush;
            merge.Stroke     = isBranchStart ? 2 : 1;
            merge.StrokeDash =
                (childCommit.Commit.Branch.IsLocalPart && parentCommit.Commit.Branch.IsMainPart) ||
                (parentCommit.Commit.Branch.IsLocalPart && childCommit.Commit.Branch.IsMainPart)
                                ? "1" : "";

            merge.NotifyAll();
        }
Beispiel #14
0
 public MergeView(MergeViewModel vm)
 {
     InitializeComponent();
     DataContext = vm;
 }
 private async Task PerformExtraValidationsAsync(MergeViewModel mergeViewModel)
 {
     await Task.WhenAll(
         ValidateNaamInUseAsync(mergeViewModel.Naam, mergeViewModel.RekeningIds),
         ValidateRekeningnummerInUseAsync(mergeViewModel.Rekeningnummer, mergeViewModel.RekeningIds));
 }
 private async Task SetSelectListsAsync(MergeViewModel mergeViewModel)
 {
     ViewData["StandaardCategorieId"] = SelectListUtil.GetSelectList(await _categorieenService.GetSelectListForIdsAsync(mergeViewModel.CategorieIds), mergeViewModel.StandaardCategorieId);
 }