/// <summary> /// Moves department to destination department /// </summary> /// <param name="d">Department to move</param> /// <param name="destinationDept">Destination department to nest in as subdepartment</param> /// <returns>Moved department with updated parent dept ID</returns> public IDepartmentDTO MoveDepartment(IDepartmentDTO d, IDepartmentDTO destinationDept) { var cloneDept = d as BaseDepartment; var oldParent = Department(d.ParentDeptID) as BaseDepartment; // Take out being moved department from parent's subdepartments oldParent.SubDepts.Remove(d.DeptID); // If current department level is Division, it means we are going down to Department level // and need to change class of department if (d is Division) { cloneDept = new Department(d as BaseDepartment); } // If we are moving up to Division level, // need to change class from Department to Division if (destinationDept.ParentDeptID == 0) { cloneDept = new Division(d as BaseDepartment); cloneDept.DeptName = "Division_" + UniqueID.Name(); } else if (SubDepartments(destinationDept). Find(sameName => sameName.DeptName == cloneDept.DeptName) != null) { cloneDept.DeptName += "_" + UniqueID.Name(); } // Set new parent for being moved department cloneDept.ParentDeptID = destinationDept.DeptID; // Add new child to destination subdepartment (destinationDept as BaseDepartment).SubDepts.Add(cloneDept.DeptID); // If class of department changed, need to update Departments table int di = Departments.FindIndex(dept => dept.DeptID == d.DeptID); Departments[di] = cloneDept; UpdateSalaries(oldParent); UpdateSalaries(destinationDept as BaseDepartment); return(cloneDept); }