public void NewCostCentreMustUseParentHeirarchyInNode()
        {
            //Arrange
            var ctx = CreateContext();
            mockCentres
                .Setup(set => set.Find(It.Is<object[]>(objects => (string) objects[0] == CostCentre1)))
                .Returns(() => centres[1]);
            mockCentres
                .Setup(set => set.Create())
                .Returns(new CostCentre())
                .Verifiable();
            mockCentres
                .Setup(set => set.Add(It.Is<CostCentre>(c => c.Node == new HierarchyId("/1/3/"))))
                .Verifiable();
            ctx
                .SetupGet(c => c.CostCentres)
                .Returns(mockCentres.Object);
            var sut = new CostCentreController(ctx.Object);
            var newCentre = new CostCentreModel
            {
                costCode = "new",
                parentCostCode = CostCentre1,
                name = "name",
                color = "FFFFFF",
                currencyCode = new Select2Model()
            };

            //Act
            sut.UpsertCostCentre(newCentre);

            //Assert
            mockCentres.Verify();
        }
        public ActionResult UpsertCostCentre(CostCentreModel costCentre)
        {
            var costCode = costCentre.costCode;
            if ((string.IsNullOrEmpty(costCentre.name)) ||
                (string.IsNullOrEmpty(costCentre.color)))
            {
                return Json(new {costCode, success = false});
            }

            var parentCostCode = string.IsNullOrEmpty(costCentre.parentCostCode)
                ? Settings.Default.RootCostCentre
                : costCentre.parentCostCode;

            if (string.Equals(parentCostCode, costCode, StringComparison.InvariantCultureIgnoreCase))
            {
                return Json(new {costCode, success = false});
            }

            var update = true;
            var centre = context.CostCentres.Find(costCode);
            var parentCentre = context.CostCentres.Find(parentCostCode);
            if (parentCentre == null)
            {
                return Json(new {costCode, success = false});
            }
            var parentNode = parentCentre.Node;
            if (centre == null)
            {
                update = false;
                centre = context.CostCentres.Create();
                costCentre.orderId =
                    context
                        .CostCentres
                        .Count(centre1 => centre1.ParentCostCentreCostCode == parentCostCode) + 1;
                costCentre.node = parentNode.ToString() + costCentre.orderId + "/";
                centre.ParentCostCentreCostCode = parentCostCode;
                centre.CostCode = costCode;
            }

            centre.Node = new HierarchyId(costCentre.node);
            centre.Color = costCentre.color;
            centre.ConsumptionType = GetConsumptionType(costCentre.consumptionTypes);
            centre.CurrencyCode = costCentre.currencyCode.id;
            centre.Description = costCentre.description;
            centre.Name = costCentre.name;
            centre.OrderId = costCentre.orderId;

            if (!update)
            {
                context.CostCentres.Add(centre);
            }

            context.SaveChanges();

            return Json(new {costCode, success = true});
        }