diff --git a/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj b/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj
index c18fe1cae..48da4063a 100644
--- a/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj
+++ b/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj
@@ -548,6 +548,8 @@
+
+
diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateNodeReference.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateNodeReference.sql
new file mode 100644
index 000000000..e525067ad
--- /dev/null
+++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateNodeReference.sql
@@ -0,0 +1,93 @@
+-------------------------------------------------------------------------------
+-- Author Swapnamol Abraham
+-- Created 18-09-2024
+-- Purpose Create node resource reference within a Hierarchy Edit.
+--
+-- Modification History
+--
+-- 18-09-2024 SA Initial Revision.
+-------------------------------------------------------------------------------
+CREATE PROCEDURE [hierarchy].[HierarchyEditCreateNodeReference]
+(
+ @HierarchyEditDetailId int,
+ @MoveToHierarchyEditDetailId int,
+ @UserId int,
+ @UserTimezoneOffset int = NULL
+)
+
+AS
+
+BEGIN
+
+ BEGIN TRY
+
+ BEGIN TRAN
+
+ DECLARE @AmendDate datetimeoffset(7) = ISNULL(TODATETIMEOFFSET(DATEADD(mi, @UserTimezoneOffset, GETUTCDATE()), @UserTimezoneOffset), SYSDATETIMEOFFSET())
+
+ DECLARE @HierarchyEditId int
+ DECLARE @ResourceId int, @ParentNodeId INT
+ SELECT @HierarchyEditId = HierarchyEditId, @ResourceId = ResourceId,@ParentNodeId = ParentNodeId FROM [hierarchy].[HierarchyEditDetail] WHERE Id = @HierarchyEditDetailId
+
+
+ -- creating a folder reference into a referenced folder should affect all instances of the referenced folder.
+
+ DECLARE @CurrentNodeId INT,
+ @ReferenceHierarchyEditDetailId INT
+
+ SELECT @CurrentNodeId = hed.NodeId
+ FROM [hierarchy].[HierarchyEditDetail] hed
+ WHERE hed.Id = @MoveToHierarchyEditDetailId
+ AND HierarchyEditId = @HierarchyEditId
+
+ -- Declare the cursor
+
+ DECLARE NodeCursor CURSOR FOR
+ SELECT Id AS ReferenceHierarchyEditDetailId
+ FROM hierarchy.HierarchyEditDetail
+ WHERE NodeId = @CurrentNodeId
+ AND HierarchyEditId = @HierarchyEditId
+ AND deleted = 0
+ -- Open the cursor
+ OPEN NodeCursor;
+
+ -- Fetch the first row from the cursor
+ FETCH NEXT FROM NodeCursor
+ INTO @ReferenceHierarchyEditDetailId;
+
+ -- Loop until no more rows are returned
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ --Execute the script to add new folder references in all referenced instances
+ EXEC [hierarchy].[HierarchyEditReferenceNode] @HierarchyEditDetailId, @ReferenceHierarchyEditDetailId, @UserId,@UserTimezoneOffset
+
+ -- Fetch the next row from the cursor
+ FETCH NEXT FROM NodeCursor
+ INTO @ReferenceHierarchyEditDetailId;
+ END
+
+ -- Close and deallocate the cursor
+ CLOSE NodeCursor;
+ --DEALLOCATE NodeCursor;
+
+ COMMIT
+
+ END TRY
+ BEGIN CATCH
+ DECLARE @ErrorMessage NVARCHAR(4000);
+ DECLARE @ErrorSeverity INT;
+ DECLARE @ErrorState INT;
+
+ SELECT
+ @ErrorMessage = ERROR_MESSAGE(),
+ @ErrorSeverity = ERROR_SEVERITY(),
+ @ErrorState = ERROR_STATE();
+
+ IF @@TRANCOUNT > 0
+ ROLLBACK TRAN;
+
+ RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
+
+ END CATCH
+END
+Go
\ No newline at end of file
diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateResourceReference.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateResourceReference.sql
new file mode 100644
index 000000000..f07690cd0
--- /dev/null
+++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateResourceReference.sql
@@ -0,0 +1,93 @@
+-------------------------------------------------------------------------------
+-- Author Swapnamol Abraham
+-- Created 18-09-2024
+-- Purpose Create a resource reference within a Hierarchy Edit.
+--
+-- Modification History
+--
+-- 18-09-2024 SA Initial Revision.
+-------------------------------------------------------------------------------
+CREATE PROCEDURE [hierarchy].[HierarchyEditCreateResourceReference]
+(
+ @HierarchyEditDetailId int,
+ @MoveToHierarchyEditDetailId int,
+ @UserId int,
+ @UserTimezoneOffset int = NULL
+)
+
+AS
+
+BEGIN
+
+ BEGIN TRY
+
+ BEGIN TRAN
+
+ DECLARE @AmendDate datetimeoffset(7) = ISNULL(TODATETIMEOFFSET(DATEADD(mi, @UserTimezoneOffset, GETUTCDATE()), @UserTimezoneOffset), SYSDATETIMEOFFSET())
+
+ DECLARE @HierarchyEditId int
+ DECLARE @ResourceId int, @ParentNodeId INT
+ SELECT @HierarchyEditId = HierarchyEditId, @ResourceId = ResourceId,@ParentNodeId = ParentNodeId FROM [hierarchy].[HierarchyEditDetail] WHERE Id = @HierarchyEditDetailId
+
+
+ -- creating a resource reference into a referenced folder should affect all instances of the referenced folder
+
+ DECLARE @CurrentNodeId INT,
+ @ReferenceHierarchyEditDetailId INT
+
+ SELECT @CurrentNodeId = hed.NodeId
+ FROM [hierarchy].[HierarchyEditDetail] hed
+ WHERE hed.Id = @MoveToHierarchyEditDetailId
+ AND HierarchyEditId = @HierarchyEditId
+
+ -- Declare the cursor
+
+ DECLARE NodeCursor CURSOR FOR
+ SELECT Id AS ReferenceHierarchyEditDetailId
+ FROM hierarchy.HierarchyEditDetail
+ WHERE NodeId = @CurrentNodeId
+ AND HierarchyEditId = @HierarchyEditId
+ AND deleted = 0
+ -- Open the cursor
+ OPEN NodeCursor;
+
+ -- Fetch the first row from the cursor
+ FETCH NEXT FROM NodeCursor
+ INTO @ReferenceHierarchyEditDetailId;
+
+ -- Loop until no more rows are returned
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ -- Execute the update statement for the current row
+ EXEC [hierarchy].[HierarchyEditReferenceResource] @HierarchyEditDetailId, @ReferenceHierarchyEditDetailId, @UserId,@UserTimezoneOffset
+
+ -- Fetch the next row from the cursor
+ FETCH NEXT FROM NodeCursor
+ INTO @ReferenceHierarchyEditDetailId;
+ END
+
+ -- Close and deallocate the cursor
+ CLOSE NodeCursor;
+ DEALLOCATE NodeCursor;
+
+ COMMIT
+
+ END TRY
+ BEGIN CATCH
+ DECLARE @ErrorMessage NVARCHAR(4000);
+ DECLARE @ErrorSeverity INT;
+ DECLARE @ErrorState INT;
+
+ SELECT
+ @ErrorMessage = ERROR_MESSAGE(),
+ @ErrorSeverity = ERROR_SEVERITY(),
+ @ErrorState = ERROR_STATE();
+
+ IF @@TRANCOUNT > 0
+ ROLLBACK TRAN;
+
+ RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
+
+ END CATCH
+END
+GO
\ No newline at end of file
diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditPublish.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditPublish.sql
index 32c0f74e0..6ae6d9325 100644
--- a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditPublish.sql
+++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditPublish.sql
@@ -132,20 +132,24 @@ BEGIN
-- UPDATE NodeLink 'deleted' for remove reference
- UPDATE
- nl
- SET
- Deleted = 1,
- AmendUserId = @AmendUserId,
- AmendDate = @AmendDate
- FROM
- hierarchy.HierarchyEditDetail hed
- INNER JOIN
- hierarchy.NodeLink nl ON hed.NodeLinkId = nl.Id
- WHERE
- HierarchyEditId = @HierarchyEditId
- AND hed.HierarchyEditDetailTypeId = 4 -- Node Link
- AND hed.Deleted = 1
+ UPDATE nl
+ SET nl.Deleted = 1
+ FROM hierarchy.NodeLink nl
+ INNER JOIN (
+ SELECT hed.NodeLinkId
+ FROM hierarchy.HierarchyEditDetail hed
+ WHERE hed.HierarchyEditId = @HierarchyEditId
+ AND hed.Deleted = 1
+ --Only include rows where no corresponding non-deleted row exists
+ AND NOT EXISTS (
+ SELECT 1
+ FROM hierarchy.HierarchyEditDetail hed2
+ WHERE hed2.HierarchyEditId = @HierarchyEditId
+ AND hed2.Deleted = 0
+ AND hed2.NodeLinkId = hed.NodeLinkId
+ )
+ ) AS filtered
+ ON nl.Id = filtered.NodeLinkId
-- For moved nodes, delete the original NodeLinks, providing they have not been used (by a reference to the original position).
UPDATE
diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditReferenceNode.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditReferenceNode.sql
index d697061a2..1bf4f5b7e 100644
--- a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditReferenceNode.sql
+++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditReferenceNode.sql
@@ -8,6 +8,7 @@
-- 29-04-2024 DB Initial Revision.
-- 13-05-2024 DB Set the parent node path id for the new reference node.
-- 08-07-2024 DB Populate the PrimaryCatalogueNodeId.
+-- 24-09-2024 SA Correct the display order of the referenced folder.
-------------------------------------------------------------------------------
CREATE PROCEDURE [hierarchy].[HierarchyEditReferenceNode]
(
@@ -49,24 +50,18 @@ BEGIN
WHERE Id = @ReferenceToHierarchyEditDetailId
-- Increment display order of nodes in destination.
- UPDATE
- hed_moveTo_children
- SET
- HierarchyEditDetailOperationId = CASE WHEN hed_moveTo_children.HierarchyEditDetailOperationId IS NULL THEN 2 ELSE hed_moveTo_children.HierarchyEditDetailOperationId END,
- DisplayOrder = hed_moveTo_children.DisplayOrder + 1,
+ UPDATE
+ [hierarchy].[HierarchyEditDetail]
+ SET
+ HierarchyEditDetailOperationId = CASE WHEN HierarchyEditDetailOperationId IS NULL THEN 2 ELSE HierarchyEditDetailOperationId END,
+ DisplayOrder = DisplayOrder + 1,
AmendDate = @AmendDate
- FROM
- [hierarchy].[HierarchyEditDetail] hed_moveTo
- INNER JOIN
- [hierarchy].[HierarchyEditDetail] hed_moveTo_children ON hed_moveTo_children.HierarchyEditId = hed_moveTo.HierarchyEditId
- AND hed_moveTo_children.ParentNodeId = hed_moveTo.NodeId
- AND ISNULL(hed_moveTo_children.HierarchyEditDetailOperationId, 0) != 3 -- ignore deletes.
- WHERE
- hed_moveTo.Id = @ReferenceToHierarchyEditDetailId
- AND hed_moveTo.ResourceId IS NULL
- AND hed_moveTo.Deleted = 0
- AND hed_moveTo_children.Deleted = 0
-
+ where
+ HierarchyEditId = @HierarchyEditId AND
+ ParentNodeId = @NewParentNodeId
+ and ParentNodePathId = @NewParentNodePathId
+ AND ISNULL(HierarchyEditDetailOperationId, 0) != 3
+ AND Deleted = 0
-- Create the new Hierarchy Edit Detail records for the reference nodes and resources.
DECLARE @OriginalNodePath NVARCHAR(256)
@@ -98,7 +93,7 @@ BEGIN
ResourceVersionId,
NULL AS ResourceReferenceId, -- Populated further down
NodeResourceId,
- DisplayOrder,
+ 1,
NULL AS InitialNodePath,
@DestinationParentNodePath + SUBSTRING(ISNULL(NewNodePath, InitialNodePath), LEN(@OriginalParentNodePath)+1, LEN(ISNULL(NewNodePath, InitialNodePath))) AS NewNodePath, -- Not using REPLACE incase number of digits in nodeIds are not consistant
0 AS Deleted,
diff --git a/WebAPI/LearningHub.Nhs.Repository/Hierarchy/HierarchyEditRepository.cs b/WebAPI/LearningHub.Nhs.Repository/Hierarchy/HierarchyEditRepository.cs
index be0fc8455..21524cf76 100644
--- a/WebAPI/LearningHub.Nhs.Repository/Hierarchy/HierarchyEditRepository.cs
+++ b/WebAPI/LearningHub.Nhs.Repository/Hierarchy/HierarchyEditRepository.cs
@@ -253,7 +253,7 @@ public async Task ReferenceNode(MoveNodeViewModel moveNodeViewModel, int userId)
var param3 = new SqlParameter("@p2", SqlDbType.Int) { Value = userId };
var param2 = new SqlParameter("@p3", SqlDbType.Int) { Value = this.TimezoneOffsetManager.UserTimezoneOffset ?? (object)DBNull.Value };
- string sql = "hierarchy.HierarchyEditReferenceNode @p0, @p1, @p2, @p3";
+ string sql = "hierarchy.HierarchyEditCreateNodeReference @p0, @p1, @p2, @p3";
var sqlParams = new List() { param0, param1, param2, param3 };
await this.DbContext.Database.ExecuteSqlRawAsync(sql, sqlParams);
@@ -336,7 +336,7 @@ public async Task HierarchyEditReferenceResource(HierarchyEditMoveResourceViewMo
var param2 = new SqlParameter("@p2", SqlDbType.Int) { Value = userId };
var param3 = new SqlParameter("@p3", SqlDbType.Int) { Value = this.TimezoneOffsetManager.UserTimezoneOffset ?? (object)DBNull.Value };
- string sql = "hierarchy.HierarchyEditReferenceResource @p0, @p1, @p2, @p3";
+ string sql = "hierarchy.HierarchyEditCreateResourceReference @p0, @p1, @p2, @p3";
var sqlParams = new List() { param0, param1, param2, param3 };
await this.DbContext.Database.ExecuteSqlRawAsync(sql, sqlParams);