|  |  |  | @@ -22226,6 +22226,419 @@ Go | 
		
	
		
			
				|  |  |  |  | 	IF (@@Error = 0) PRINT 'Procedure Creation: [vesp_ListUnlinkedItems] Succeeded' | 
		
	
		
			
				|  |  |  |  | 	ELSE PRINT 'Procedure Creation: [vesp_ListUnlinkedItems] Error on Creation' | 
		
	
		
			
				|  |  |  |  | 	GO | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | /* | 
		
	
		
			
				|  |  |  |  | ========================================================================================================== | 
		
	
		
			
				|  |  |  |  |  Begin: C2024-004: KL - Update Copy Replace functionality, (remove ''copy of'') | 
		
	
		
			
				|  |  |  |  | ========================================================================================================== | 
		
	
		
			
				|  |  |  |  | */ | 
		
	
		
			
				|  |  |  |  | 	 | 
		
	
		
			
				|  |  |  |  | IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[CopyItemAndChildren]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) | 
		
	
		
			
				|  |  |  |  | 	DROP PROCEDURE [CopyItemAndChildren]; | 
		
	
		
			
				|  |  |  |  | GO | 
		
	
		
			
				|  |  |  |  | 	 | 
		
	
		
			
				|  |  |  |  | 	/***************************************************************************** | 
		
	
		
			
				|  |  |  |  | 	   Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE | 
		
	
		
			
				|  |  |  |  | 		   Copyright 2024 - Volian Enterprises, Inc. All rights reserved. | 
		
	
		
			
				|  |  |  |  | 	*****************************************************************************/ | 
		
	
		
			
				|  |  |  |  | 	/* | 
		
	
		
			
				|  |  |  |  | 	========================================================================================================== | 
		
	
		
			
				|  |  |  |  | 	 Author:		Kevin Laskey | 
		
	
		
			
				|  |  |  |  | 	 Modified Date:	07/09/2024 | 
		
	
		
			
				|  |  |  |  | 	 Description:	Copy Item and its Children | 
		
	
		
			
				|  |  |  |  | 	========================================================================================================== | 
		
	
		
			
				|  |  |  |  | 	 */ | 
		
	
		
			
				|  |  |  |  | CREATE PROCEDURE [dbo].[CopyItemAndChildren] | 
		
	
		
			
				|  |  |  |  | ( | 
		
	
		
			
				|  |  |  |  | 	@StartItemID INT, | 
		
	
		
			
				|  |  |  |  | 	@DestFormatID INT, | 
		
	
		
			
				|  |  |  |  | 	@UserID NVARCHAR(100), | 
		
	
		
			
				|  |  |  |  | 	@NewStartItemID int output | 
		
	
		
			
				|  |  |  |  | ) | 
		
	
		
			
				|  |  |  |  | WITH EXECUTE AS OWNER | 
		
	
		
			
				|  |  |  |  | AS | 
		
	
		
			
				|  |  |  |  | BEGIN TRY -- Try Block | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | --+-----------------------------------------------------------------+ | 
		
	
		
			
				|  |  |  |  | --& BEGIN TRANSACTION to make these changes temporary               & | 
		
	
		
			
				|  |  |  |  | --+-----------------------------------------------------------------+ | 
		
	
		
			
				|  |  |  |  | 	BEGIN TRANSACTION | 
		
	
		
			
				|  |  |  |  | 	if exists (select * from tblitems where itemid = @StartItemID and DeleteStatus !=0) | 
		
	
		
			
				|  |  |  |  | 		BEGIN | 
		
	
		
			
				|  |  |  |  | 			RAISERROR ('###Cannot Paste Step###This step has been deleted',16,1) | 
		
	
		
			
				|  |  |  |  | 			RETURN | 
		
	
		
			
				|  |  |  |  | 		END | 
		
	
		
			
				|  |  |  |  | DECLARE @Children AS TABLE | 
		
	
		
			
				|  |  |  |  | ( | 
		
	
		
			
				|  |  |  |  | 	ItemID INT PRIMARY KEY, | 
		
	
		
			
				|  |  |  |  | 	NewItemID INT, | 
		
	
		
			
				|  |  |  |  | 	ContentID INT, | 
		
	
		
			
				|  |  |  |  | 	NewContentID INT, | 
		
	
		
			
				|  |  |  |  | 	FormatID INT, | 
		
	
		
			
				|  |  |  |  | 	NewFormatID INT | 
		
	
		
			
				|  |  |  |  | ) | 
		
	
		
			
				|  |  |  |  | DECLARE @NewDocuments AS TABLE | 
		
	
		
			
				|  |  |  |  | ( | 
		
	
		
			
				|  |  |  |  | 	DocID INT PRIMARY KEY, | 
		
	
		
			
				|  |  |  |  | 	NewDocID INT | 
		
	
		
			
				|  |  |  |  | ) | 
		
	
		
			
				|  |  |  |  | -- Locals | 
		
	
		
			
				|  |  |  |  | DECLARE @DTS DATETIME -- DTS of all New Items | 
		
	
		
			
				|  |  |  |  | DECLARE @StartContentID INT | 
		
	
		
			
				|  |  |  |  | Select @StartContentID = ContentID from Items where ItemID = @StartItemID | 
		
	
		
			
				|  |  |  |  | SET @DTS = GETDATE() -- Get the current Date and Time | 
		
	
		
			
				|  |  |  |  | -- Get a list of all of the Items to be copied based upon StartItemID and EndItemID | 
		
	
		
			
				|  |  |  |  | -- If the StartItemID = EndItemID then it is a single item and it's children | 
		
	
		
			
				|  |  |  |  | INSERT INTO @Children SELECT ItemID,ItemID,ContentID,ContentID,FormatID,FormatID FROM vefn_ChildItemsRange(@StartItemID,@StartItemID,null) | 
		
	
		
			
				|  |  |  |  | -- <<< Copy Contents >>> | 
		
	
		
			
				|  |  |  |  | -- Create new content rows to match the existing rows.  Set the type to the Current ContentID temporarily | 
		
	
		
			
				|  |  |  |  | -- so that the new content rows can be associated with the existing content rows. | 
		
	
		
			
				|  |  |  |  | -- Rem 'Copy Of ' + before first [Number] for C2024-004 (KL) | 
		
	
		
			
				|  |  |  |  | INSERT INTO Contents | 
		
	
		
			
				|  |  |  |  |   ([Number],[Text],[Type],[FormatID],[Config],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  | 	select CASE when [ContentID] = @StartContentID and [Type]<20000 then [Number] else [Number] end, | 
		
	
		
			
				|  |  |  |  | 	[Text],[ContentID],[FormatID],[Config],@DTS,@UserID | 
		
	
		
			
				|  |  |  |  |  from Contents where ContentID in(Select ContentID from @Children) | 
		
	
		
			
				|  |  |  |  | -- Update the @Children with the NewConentIDs | 
		
	
		
			
				|  |  |  |  | --print 'A	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | UPDATE NN set NN.NewContentID = CC.ContentID | 
		
	
		
			
				|  |  |  |  | From Contents CC | 
		
	
		
			
				|  |  |  |  | Join @Children NN on NN.ContentID = CC.Type AND CC.DTS = @DTS and CC.UserID = @UserID | 
		
	
		
			
				|  |  |  |  | -- Reset the Type column in the Contents table with the Type column from the original Records. | 
		
	
		
			
				|  |  |  |  | --print 'B	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | DECLARE @SourceType INT | 
		
	
		
			
				|  |  |  |  | Select @SourceType = Type from Contents where ContentID = @StartContentID | 
		
	
		
			
				|  |  |  |  | if @SourceType =  0 | 
		
	
		
			
				|  |  |  |  | 	BEGIN | 
		
	
		
			
				|  |  |  |  | 		UPDATE CC set CC.Type = CC2.Type, CC.DTS = CC2.DTS, CC.UserID = CC2.UserID | 
		
	
		
			
				|  |  |  |  | 		From Contents CC | 
		
	
		
			
				|  |  |  |  | 		Join @Children NN on NN.NewContentID = CC.ContentID | 
		
	
		
			
				|  |  |  |  | 		Join Contents CC2 on NN.ContentID = CC2.ContentID | 
		
	
		
			
				|  |  |  |  | 	END | 
		
	
		
			
				|  |  |  |  | else | 
		
	
		
			
				|  |  |  |  | 	BEGIN | 
		
	
		
			
				|  |  |  |  | UPDATE CC set CC.Type = CC2.Type | 
		
	
		
			
				|  |  |  |  | From Contents CC | 
		
	
		
			
				|  |  |  |  | Join @Children NN on NN.NewContentID = CC.ContentID | 
		
	
		
			
				|  |  |  |  | Join Contents CC2 on NN.ContentID = CC2.ContentID | 
		
	
		
			
				|  |  |  |  | 	END | 
		
	
		
			
				|  |  |  |  | --print 'B1	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- Contents are done | 
		
	
		
			
				|  |  |  |  | 	-- SELECT * From Contents where DTS = @DTS and UserID = @UserID | 
		
	
		
			
				|  |  |  |  | -- <<< Copy Grids >>> | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Grids]([ContentID],[Data],[Config],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  | 	SELECT NN.[NewContentID],[Data],[Config],@DTS,@UserID | 
		
	
		
			
				|  |  |  |  | 		FROM [Grids] GG Join @Children NN on GG.ContentID = NN.ContentID | 
		
	
		
			
				|  |  |  |  | -- <<< Copy Images >>> | 
		
	
		
			
				|  |  |  |  | --print 'B2	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Images]([ContentID],[ImageType],[FileName],[Data],[Config],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  | 	SELECT NN.[NewContentID],[ImageType],[FileName],[Data],[Config],@DTS,@UserID | 
		
	
		
			
				|  |  |  |  | 		FROM [Images] II Join @Children NN on II.ContentID = NN.ContentID | 
		
	
		
			
				|  |  |  |  | -- Create new item rows based upon the current item rows and the @Children table, with the NewContentIDs | 
		
	
		
			
				|  |  |  |  | --print 'B3	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Items] ([PreviousID],[ContentID],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  |      SELECT II.[PreviousID], -- Leave the PreviousID as is for now | 
		
	
		
			
				|  |  |  |  | 			NN.NewContentID, @DTS, @UserID | 
		
	
		
			
				|  |  |  |  | 			from @Children NN | 
		
	
		
			
				|  |  |  |  | 			join Items II on II.ContentID = NN.ContentID | 
		
	
		
			
				|  |  |  |  | -- Update the @Children with the NewItemIDs | 
		
	
		
			
				|  |  |  |  | --print 'B4	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | UPDATE NN set NN.NewItemID = II.ItemID | 
		
	
		
			
				|  |  |  |  | From Items II | 
		
	
		
			
				|  |  |  |  | Join @Children NN on NN.NewContentID = II.ContentID AND II.DTS = @DTS and II.UserID = @UserID | 
		
	
		
			
				|  |  |  |  | DECLARE @NewItemID int | 
		
	
		
			
				|  |  |  |  | SELECT @NewItemID = NewItemID | 
		
	
		
			
				|  |  |  |  | 	FROM @Children | 
		
	
		
			
				|  |  |  |  | 	WHERE ItemID = @StartItemID | 
		
	
		
			
				|  |  |  |  | --print 'B5	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | UPDATE NN SET NN.[NewFormatID] = CC.[FormatID] | 
		
	
		
			
				|  |  |  |  | 	FROM @Children NN | 
		
	
		
			
				|  |  |  |  | 	Join vefn_ChildItemsRange(@NewItemID,@NewItemID,@DestFormatID) CC | 
		
	
		
			
				|  |  |  |  | 	ON NN.NewItemID = CC.ItemID | 
		
	
		
			
				|  |  |  |  | -- The @Children table is now complete | 
		
	
		
			
				|  |  |  |  | 	--SELECT * From @Children | 
		
	
		
			
				|  |  |  |  | -- Update the PreviousID in the new Item rows, to the new ItemIDs based upon the old ItemIDs | 
		
	
		
			
				|  |  |  |  | --print 'B6	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | Update II Set II.[PreviousID] = NN.NewItemID | 
		
	
		
			
				|  |  |  |  | from Items II | 
		
	
		
			
				|  |  |  |  | Join @Children NN on NN.ItemID = II.PreviousID AND II.DTS = @DTS and II.UserID = @UserID | 
		
	
		
			
				|  |  |  |  | -- Get the new ItemIDs based upon the old ItemIDs | 
		
	
		
			
				|  |  |  |  | SELECT @NewStartItemID = NewItemID from @Children where ItemID = @StartItemID | 
		
	
		
			
				|  |  |  |  | --SELECT @NewEndItemID = NewItemID from @Children where ItemID = @EndItemID | 
		
	
		
			
				|  |  |  |  | -- Set the PreviousID for the starting Item to null temporarily. | 
		
	
		
			
				|  |  |  |  | -- This will be adjusted based upon where the step is inserted. | 
		
	
		
			
				|  |  |  |  | --print 'B7	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | Update Items Set PreviousID = null where ItemID = @NewStartItemID | 
		
	
		
			
				|  |  |  |  | if @SourceType =  0 | 
		
	
		
			
				|  |  |  |  | 	BEGIN | 
		
	
		
			
				|  |  |  |  | 		UPDATE II SET II.DTS = II2.DTS, II.UserID = II2.UserID | 
		
	
		
			
				|  |  |  |  | 		From Items II | 
		
	
		
			
				|  |  |  |  | 		Join @Children NN on NN.NewItemID = II.ItemID | 
		
	
		
			
				|  |  |  |  | 		Join Items II2 on NN.ItemID = II2.ItemID | 
		
	
		
			
				|  |  |  |  | 		WHERE NN.ItemID = @StartItemID | 
		
	
		
			
				|  |  |  |  | 	END | 
		
	
		
			
				|  |  |  |  | --print 'C	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- Items are done | 
		
	
		
			
				|  |  |  |  | 	--SELECT * From Items where DTS = @DTS and UserID = @UserID | 
		
	
		
			
				|  |  |  |  | -- <<< Copy Parts >>> | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Parts] ([ContentID],[FromType],[ItemID],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  | Select NNF.NewContentID,[FromType],NNT.NewItemID, @DTS, @UserID from Parts PP | 
		
	
		
			
				|  |  |  |  | JOIN @Children NNF on PP.ContentID = NNF.ContentID | 
		
	
		
			
				|  |  |  |  | JOIN @Children NNT on PP.ItemID = NNT.ItemID | 
		
	
		
			
				|  |  |  |  | --print 'D	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- Parts are done | 
		
	
		
			
				|  |  |  |  | 	-- SELECT * From Parts where DTS = @DTS and UserID = @UserID | 
		
	
		
			
				|  |  |  |  | -- <<< Copy Annotations >>> | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Annotations] ([ItemID],[TypeID],[RtfText],[SearchText],[Config],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  |      Select NewItemID, TypeID, RtfText, SearchText, Config, @DTS, @UserID | 
		
	
		
			
				|  |  |  |  | 			from Annotations AA Join @Children NN on AA.ItemID = NN.ItemID | 
		
	
		
			
				|  |  |  |  | --print 'E	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- Annotations are done | 
		
	
		
			
				|  |  |  |  | 	-- SELECT * From Annotations where DTS = @DTS and UserID = @UserID | 
		
	
		
			
				|  |  |  |  | -- <<< Copy Documents and Entries>>> | 
		
	
		
			
				|  |  |  |  | -- logic to create Entries for Library Documents | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Entries] ([ContentID],[DocID],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  | 	SELECT NN.[NewContentID],EE.[DocID],@DTS,@UserID | 
		
	
		
			
				|  |  |  |  |   FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN [Documents] DD on EE.[DocID] = DD.[DocID] and Isnull(LibTitle,'') <> '' | 
		
	
		
			
				|  |  |  |  | -- Logic to create new documents for any documents used that do not have libtitles | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Documents] ([LibTitle],[DocContent],[DocAscii],[Config],[DTS],[UserID],[FileExtension]) | 
		
	
		
			
				|  |  |  |  |   OUTPUT CAST(INSERTED.[LibTitle] as INT),INSERTED.[DocID] INTO @NewDocuments | 
		
	
		
			
				|  |  |  |  | 	SELECT str(DD.[DocID]),[DocContent],[DocAscii],[Config],@DTS,@UserID,[FileExtension] | 
		
	
		
			
				|  |  |  |  |   FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN [Documents] DD on EE.[DocID] = DD.[DocID] and Isnull(LibTitle,'') = '' | 
		
	
		
			
				|  |  |  |  | UPDATE DD SET LibTitle = '' | 
		
	
		
			
				|  |  |  |  | 	FROM Documents DD JOIN @NewDocuments ND on DD.[DocID] = ND.[NewDocID] | 
		
	
		
			
				|  |  |  |  | 	where DTS = @DTS and UserID = @UserID | 
		
	
		
			
				|  |  |  |  | --print 'F	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- Documents are Done | 
		
	
		
			
				|  |  |  |  | 	-- SELECT * From Documents where DTS = @DTS and UserID = @UserID | 
		
	
		
			
				|  |  |  |  | -- Logic to create entries for these newly created documents | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Entries] ([ContentID],[DocID],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  | 	SELECT NN.[NewContentID],ND.[NewDocID],@DTS,@UserID | 
		
	
		
			
				|  |  |  |  |   FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN @NewDocuments ND on EE.[DocID] = ND.[DocID] | 
		
	
		
			
				|  |  |  |  | -- Logic to Create DROUsages for these newly created documents | 
		
	
		
			
				|  |  |  |  | INSERT INTO [DROUsages] ([DocID],[ROID],[Config],[DTS],[UserID],[RODbID]) | 
		
	
		
			
				|  |  |  |  |  	SELECT ND.[NewDocID],[ROID],[Config],@DTS,@UserID,[RODbID] | 
		
	
		
			
				|  |  |  |  |   FROM [DROUsages] RR | 
		
	
		
			
				|  |  |  |  | 	JOIN @NewDocuments ND on RR.[DocID] = ND.[DocID] | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | --print 'G	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- Entries are done | 
		
	
		
			
				|  |  |  |  | 	-- SELECT * From Entries EE JOIN Documents DD on ee.DocID = DD.DocID where EE.DTS = @DTS and EE.UserID = @UserID | 
		
	
		
			
				|  |  |  |  | -- <<< Copy RoUsages >>> | 
		
	
		
			
				|  |  |  |  | INSERT INTO [RoUsages] ([ContentID],[ROID],[Config],[DTS],[UserID],[RODbID]) | 
		
	
		
			
				|  |  |  |  | 	SELECT NN.[NewContentID],CAST([ROUsageID] as nvarchar(16)),[Config],@DTS,@UserID,[RODbID] | 
		
	
		
			
				|  |  |  |  | 		FROM [RoUsages] RR Join @Children NN on RR.ContentID = NN.ContentID | 
		
	
		
			
				|  |  |  |  | -- Update content records for newly copied records to use correct RO usage ids in the RO tags | 
		
	
		
			
				|  |  |  |  | DECLARE @RowsAffected int | 
		
	
		
			
				|  |  |  |  | SET @RowsAffected=1 | 
		
	
		
			
				|  |  |  |  | WHILE @RowsAffected > 0 | 
		
	
		
			
				|  |  |  |  | BEGIN | 
		
	
		
			
				|  |  |  |  | 	UPDATE CC SET [TEXT] = C2.NewText | 
		
	
		
			
				|  |  |  |  | 	FROM CONTENTS CC | 
		
	
		
			
				|  |  |  |  | 	JOIN (SELECT C1.ContentID, .dbo.vefn_FixROText(C1.Text, CAST([ROID] as int), [ROUsageID]) NewText | 
		
	
		
			
				|  |  |  |  | 	FROM CONTENTS C1 | 
		
	
		
			
				|  |  |  |  | 	JOIN @Children NN on C1.ContentID = NN.NewContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN RoUsages RO on NN.NewContentID = RO.ContentID where Len([ROID]) < 12) C2 ON CC.ContentID = C2.ContentID | 
		
	
		
			
				|  |  |  |  | 	WHERE [TEXT] <> C2.NewText | 
		
	
		
			
				|  |  |  |  | 	SET @RowsAffected = @@RowCount | 
		
	
		
			
				|  |  |  |  | END | 
		
	
		
			
				|  |  |  |  | -- Update grid records for newly copied records to use correct RO usage ids in the RO tags | 
		
	
		
			
				|  |  |  |  | SET @RowsAffected=1 | 
		
	
		
			
				|  |  |  |  | WHILE @RowsAffected > 0 | 
		
	
		
			
				|  |  |  |  | BEGIN | 
		
	
		
			
				|  |  |  |  | 	UPDATE GG SET [Data] = G2.NewData | 
		
	
		
			
				|  |  |  |  | 	FROM GRIDS GG | 
		
	
		
			
				|  |  |  |  | 	JOIN (SELECT G1.ContentID, .dbo.vefn_FixROData(G1.Data, CAST([ROID] as int), [ROUsageID]) NewData | 
		
	
		
			
				|  |  |  |  | 	FROM GRIDS G1 | 
		
	
		
			
				|  |  |  |  | 	JOIN @Children NN on G1.ContentID = NN.NewContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN RoUsages RO on NN.NewContentID = RO.ContentID where Len([ROID]) < 12) G2 ON GG.ContentID = G2.ContentID | 
		
	
		
			
				|  |  |  |  | 	WHERE Cast([Data] as nvarchar(max)) <> cast(G2.NewData as nvarchar(max)) | 
		
	
		
			
				|  |  |  |  | 	SET @RowsAffected = @@RowCount | 
		
	
		
			
				|  |  |  |  | END | 
		
	
		
			
				|  |  |  |  | UPDATE RON SET [ROID] = ROO.[ROID] | 
		
	
		
			
				|  |  |  |  | 	FROM RoUsages RON | 
		
	
		
			
				|  |  |  |  | 	JOIN @Children NN on RON.ContentID = NN.NewContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN RoUsages ROO on CAST(RON.ROID as int) = ROO.RoUsageID | 
		
	
		
			
				|  |  |  |  | 	where Len(RON.[ROID]) < 12 | 
		
	
		
			
				|  |  |  |  | --print 'H	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- RoUsages are done | 
		
	
		
			
				|  |  |  |  | 	-- SELECT * From RoUsages where DTS = @DTS and UserID = @UserID | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | -- <<< Copy Transtions >>> | 
		
	
		
			
				|  |  |  |  | -- Note that the inserted record has the 'TranType' field set to old transitionid.  This is done | 
		
	
		
			
				|  |  |  |  | -- so that the next step can replace the old transitionid with the new transitionid in the | 
		
	
		
			
				|  |  |  |  | -- content record's transition tokens.  The TranType gets reset after the content records are | 
		
	
		
			
				|  |  |  |  | -- updated. | 
		
	
		
			
				|  |  |  |  | -- Also note that the 'toid/rangeid' may need converted to newly copied ids or may not.  If it's | 
		
	
		
			
				|  |  |  |  | -- not a range, then it always is converted to new, if there is a new.  If it's a range, both | 
		
	
		
			
				|  |  |  |  | -- the toid & the rangeid must be new in order for the conversion to be correct.  You cannot | 
		
	
		
			
				|  |  |  |  | -- have part of the range pointing to the new and part of the range pointing to the original | 
		
	
		
			
				|  |  |  |  | -- locations. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | INSERT INTO .[dbo].[Transitions] ([FromID],[ToID],[RangeID],[IsRange],[TranType],[Config],[DTS],[UserID]) | 
		
	
		
			
				|  |  |  |  | 	SELECT NNF.[NewContentID], | 
		
	
		
			
				|  |  |  |  | 		-- if both toid & range are null, use the original toid & rangeid | 
		
	
		
			
				|  |  |  |  | 		CASE WHEN NNT.[NewItemID] is null or NNR.[NewItemID] is null THEN [ToID] ELSE NNT.[NewItemID] END, | 
		
	
		
			
				|  |  |  |  | 		CASE WHEN NNT.[NewItemID] is null or NNR.[NewItemID] is null THEN [RangeID] ELSE NNR.[NewItemID] END, | 
		
	
		
			
				|  |  |  |  | 		[IsRange],[TransitionID],[Config],@DTS,@UserID | 
		
	
		
			
				|  |  |  |  | 	FROM .[dbo].[Transitions] TT | 
		
	
		
			
				|  |  |  |  | 	JOIN @Children NNF on TT.[FromID] = NNF.[ContentID] | 
		
	
		
			
				|  |  |  |  | 	LEFT JOIN @Children NNT on TT.[ToID] = NNT.[ItemID] | 
		
	
		
			
				|  |  |  |  | 	LEFT JOIN @Children NNR on TT.[RangeID] = NNR.[ItemID] | 
		
	
		
			
				|  |  |  |  | --print 'H1	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- -- Update content records for newly copied records to use correct TransitionIDs in the Transition tags | 
		
	
		
			
				|  |  |  |  | SET @RowsAffected=1 | 
		
	
		
			
				|  |  |  |  | WHILE @RowsAffected > 0 | 
		
	
		
			
				|  |  |  |  | BEGIN | 
		
	
		
			
				|  |  |  |  | UPDATE CC SET [TEXT] = C2.NewText | 
		
	
		
			
				|  |  |  |  | 	FROM CONTENTS CC | 
		
	
		
			
				|  |  |  |  | 	JOIN (SELECT C1.ContentID, .dbo.vefn_FixTransitionTextForCopy(C1.Text, TRO.TransitionID, TRO.TranType,  TRO.[ToID], TRO.[RangeID],TR.[TransitionID], TR.[ToID], TR.[RangeID], .dbo.vefn_GetNewTranType(NN.FormatID, NN.NewFormatID, TRO.TranType)) NewText | 
		
	
		
			
				|  |  |  |  | 	FROM CONTENTS C1 | 
		
	
		
			
				|  |  |  |  | 	JOIN @Children NN on C1.ContentID = NN.NewContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN Transitions TR on NN.NewContentID = TR.FromID | 
		
	
		
			
				|  |  |  |  | 	JOIN Transitions TRO on TR.TranType = TRO.TransitionID) C2 ON CC.ContentID = C2.ContentID | 
		
	
		
			
				|  |  |  |  | 	WHERE [TEXT] <> C2.NewText | 
		
	
		
			
				|  |  |  |  | 	SET @RowsAffected = @@RowCount | 
		
	
		
			
				|  |  |  |  | END | 
		
	
		
			
				|  |  |  |  | --print 'H2	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | --set nocount off | 
		
	
		
			
				|  |  |  |  | -- -- Update grid records for newly copied records to use correct TransitionIDs in the Transition tags | 
		
	
		
			
				|  |  |  |  | declare @grids table | 
		
	
		
			
				|  |  |  |  | ( | 
		
	
		
			
				|  |  |  |  | contentid int primary key, | 
		
	
		
			
				|  |  |  |  | data xml | 
		
	
		
			
				|  |  |  |  | ) | 
		
	
		
			
				|  |  |  |  | insert into @grids select gg.contentid,gg.data from GRIDS GG | 
		
	
		
			
				|  |  |  |  | 	where gg.contentid in (select nn.newcontentid from | 
		
	
		
			
				|  |  |  |  | 	@Children NN | 
		
	
		
			
				|  |  |  |  | 	JOIN Transitions TR on NN.NewContentID = TR.FromID | 
		
	
		
			
				|  |  |  |  | 	JOIN Transitions TRO on TR.TranType = TRO.TransitionID) | 
		
	
		
			
				|  |  |  |  | --print 'H2.1	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | --select * from @grids | 
		
	
		
			
				|  |  |  |  | SET @RowsAffected=1 | 
		
	
		
			
				|  |  |  |  | WHILE @RowsAffected > 0 | 
		
	
		
			
				|  |  |  |  | BEGIN | 
		
	
		
			
				|  |  |  |  | UPDATE GG SET [DATA] = G2.NewData | 
		
	
		
			
				|  |  |  |  | 	FROM @GRIDS GG | 
		
	
		
			
				|  |  |  |  | 	JOIN (SELECT G1.ContentID, .dbo.vefn_FixTransitionDataForCopy(G1.Data, TRO.TransitionID, TRO.TranType,  TRO.[ToID], TRO.[RangeID],TR.[TransitionID], TR.[ToID], TR.[RangeID], .dbo.vefn_GetNewTranType(NN.FormatID, NN.NewFormatID, TRO.TranType)) NewData | 
		
	
		
			
				|  |  |  |  | 	FROM @GRIDS G1 | 
		
	
		
			
				|  |  |  |  | 	JOIN @Children NN on G1.ContentID = NN.NewContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN Transitions TR on NN.NewContentID = TR.FromID | 
		
	
		
			
				|  |  |  |  | 	JOIN Transitions TRO on TR.TranType = TRO.TransitionID) G2 ON GG.ContentID = G2.ContentID | 
		
	
		
			
				|  |  |  |  | 	WHERE Cast([DATA] as nvarchar(max)) <> CAST(G2.NewData as nvarchar(max)) | 
		
	
		
			
				|  |  |  |  | 	SET @RowsAffected = @@RowCount | 
		
	
		
			
				|  |  |  |  | END | 
		
	
		
			
				|  |  |  |  | --print 'H2.2	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | update GG set data = g1.data from Grids gg join @grids g1 on gg.contentid = g1.contentid | 
		
	
		
			
				|  |  |  |  | --print 'H3	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | --set nocount on | 
		
	
		
			
				|  |  |  |  | -- Add 'Verification Required' AnnotationType | 
		
	
		
			
				|  |  |  |  | 	DECLARE @typeID int | 
		
	
		
			
				|  |  |  |  | 	SELECT @typeID = TypeID from AnnotationTypes where Name = 'Verification Required' | 
		
	
		
			
				|  |  |  |  | 	IF(@typeID IS NULL) | 
		
	
		
			
				|  |  |  |  | 	BEGIN | 
		
	
		
			
				|  |  |  |  | 		INSERT INTO [AnnotationTypes]	([Name],[UserID])	VALUES	('Verification Required','Volian') | 
		
	
		
			
				|  |  |  |  | 		SELECT @typeID = SCOPE_IDENTITY() | 
		
	
		
			
				|  |  |  |  | 	END | 
		
	
		
			
				|  |  |  |  | 	-- Add "Verification Required" Annotation for each Transition whose transition format changes | 
		
	
		
			
				|  |  |  |  | INSERT INTO [Annotations] ([ItemID],[TypeID],[SearchText],[UserID]) | 
		
	
		
			
				|  |  |  |  | 		SELECT NN.NewItemID, @typeID,'Verify Transition Format',@UserID | 
		
	
		
			
				|  |  |  |  | 			FROM Transitions TR | 
		
	
		
			
				|  |  |  |  | 			JOIN @Children NN on TR.FromID = NN.NewContentID | 
		
	
		
			
				|  |  |  |  | 			JOIN Transitions TRO on TR.TranType = TRO.TransitionID | 
		
	
		
			
				|  |  |  |  | 			WHERE .dbo.vefn_CompareTranFormat(NN.FormatID, NN.NewFormatID, TRO.TranType) <> 0 | 
		
	
		
			
				|  |  |  |  | --print 'H4	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | UPDATE TR SET TR.[TranType] = .dbo.vefn_GetNewTranType(NN.FormatID, NN.NewFormatID, TRO.TranType) | 
		
	
		
			
				|  |  |  |  | 	FROM Transitions TR | 
		
	
		
			
				|  |  |  |  | 	JOIN @Children NN on TR.FromID = NN.NewContentID | 
		
	
		
			
				|  |  |  |  | 	JOIN Transitions TRO on TR.TranType = TRO.TransitionID | 
		
	
		
			
				|  |  |  |  | --print 'H5	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | -- Transitions are done | 
		
	
		
			
				|  |  |  |  | 	-- SELECT * From Transitions where DTS = @DTS and UserID = @UserID | 
		
	
		
			
				|  |  |  |  | --print 'Z	' + cast(datediff(s,@dts,getdate()) as varchar(100)) | 
		
	
		
			
				|  |  |  |  | --foldouts fixing code | 
		
	
		
			
				|  |  |  |  | if exists (select * from contents where contentid in (select newcontentid from @children) and config like '%FloatingFoldout%') | 
		
	
		
			
				|  |  |  |  | begin | 
		
	
		
			
				|  |  |  |  | 	--insert into #mytemp | 
		
	
		
			
				|  |  |  |  | 	select cc.contentid,xsteps.value('@FloatingFoldout','int') oldfoldoutid,(select newitemid  | 
		
	
		
			
				|  |  |  |  | 	from @children  | 
		
	
		
			
				|  |  |  |  | 	where itemid = xsteps.value('@FloatingFoldout','int')) newfoldoutid,xconfig  | 
		
	
		
			
				|  |  |  |  | 	into #mytemp  | 
		
	
		
			
				|  |  |  |  | 	from (select *,cast(config as xml) xconfig from contents where contentid in (select newcontentid from @children)) cc | 
		
	
		
			
				|  |  |  |  | 	cross apply xconfig.nodes('Config/Step') tsteps(xsteps) | 
		
	
		
			
				|  |  |  |  | 	--build @cmd string | 
		
	
		
			
				|  |  |  |  | 	declare @cmd nvarchar(max) | 
		
	
		
			
				|  |  |  |  | 	declare cmds cursor for | 
		
	
		
			
				|  |  |  |  | 	select distinct 'update #mytemp set xconfig.modify(''replace value of (Config/Step/@FloatingFoldout)[1] with "' | 
		
	
		
			
				|  |  |  |  | 	 + cast(newfoldoutid as varchar(10)) | 
		
	
		
			
				|  |  |  |  | 	 + '"'') where xconfig.value(''(Config/Step/@FloatingFoldout)[1]'',''int'') = ' | 
		
	
		
			
				|  |  |  |  | 	 + cast(oldfoldoutid as varchar(10)) | 
		
	
		
			
				|  |  |  |  | 	from #mytemp | 
		
	
		
			
				|  |  |  |  | 	--execute cursor over rows | 
		
	
		
			
				|  |  |  |  | 	open cmds | 
		
	
		
			
				|  |  |  |  | 	fetch next from cmds into @cmd | 
		
	
		
			
				|  |  |  |  | 	while @@fetch_status = 0 | 
		
	
		
			
				|  |  |  |  | 	begin | 
		
	
		
			
				|  |  |  |  | 		exec sp_executesql @cmd | 
		
	
		
			
				|  |  |  |  | 		fetch next from cmds into @cmd | 
		
	
		
			
				|  |  |  |  | 	end | 
		
	
		
			
				|  |  |  |  | 	close cmds | 
		
	
		
			
				|  |  |  |  | 	deallocate cmds | 
		
	
		
			
				|  |  |  |  | 	--actually update contents | 
		
	
		
			
				|  |  |  |  | 	update cc set config = cast(xconfig as varchar(max)) from contents cc join #mytemp mt on cc.contentid = mt.contentid | 
		
	
		
			
				|  |  |  |  | 	--get rid of #mytemp | 
		
	
		
			
				|  |  |  |  | 	drop table #mytemp | 
		
	
		
			
				|  |  |  |  | end | 
		
	
		
			
				|  |  |  |  | --end foldouts fixing code | 
		
	
		
			
				|  |  |  |  | --section start | 
		
	
		
			
				|  |  |  |  | DECLARE @NewContentID int | 
		
	
		
			
				|  |  |  |  | Select @NewContentID = NewContentID from @Children where ItemID = @StartItemID | 
		
	
		
			
				|  |  |  |  | DECLARE @Config varchar(max) | 
		
	
		
			
				|  |  |  |  | DECLARE @XConfig xml | 
		
	
		
			
				|  |  |  |  | select @Config = config from contents where contentid = @NewContentID | 
		
	
		
			
				|  |  |  |  | select @XConfig = cast(@Config as xml) | 
		
	
		
			
				|  |  |  |  | if @Config like '%SectionStart%' begin | 
		
	
		
			
				|  |  |  |  | 	DECLARE @SectionStart int | 
		
	
		
			
				|  |  |  |  | 	select @SectionStart = xproc.value('@SectionStart','int') from @xconfig.nodes('Config/Procedure') tproc(xproc) | 
		
	
		
			
				|  |  |  |  | 	DECLARE @NewSectionStart int | 
		
	
		
			
				|  |  |  |  | 	select @NewSectionStart = newitemid from @children where itemid = @SectionStart | 
		
	
		
			
				|  |  |  |  | 	DECLARE @cmd2 nvarchar(max) | 
		
	
		
			
				|  |  |  |  | 	set @cmd2 = ' | 
		
	
		
			
				|  |  |  |  | 		declare @XConfig xml;  | 
		
	
		
			
				|  |  |  |  | 		set @XConfig = cast(''' + @Config + ''' as xml);  | 
		
	
		
			
				|  |  |  |  | 		set @XConfig.modify(''replace value of (Config/Procedure/@SectionStart)[1] with "' + cast(@NewSectionStart as nvarchar(10)) + '"'');  | 
		
	
		
			
				|  |  |  |  | 		update contents set config = cast(@XConfig as varchar(max)) where contentid = ' + cast(@NewContentID as nvarchar(10)) + ';' | 
		
	
		
			
				|  |  |  |  | 	exec sp_executesql @cmd2 | 
		
	
		
			
				|  |  |  |  | end | 
		
	
		
			
				|  |  |  |  | --end section start | 
		
	
		
			
				|  |  |  |  | 	IF( @@TRANCOUNT > 0 ) COMMIT | 
		
	
		
			
				|  |  |  |  | END TRY | 
		
	
		
			
				|  |  |  |  | BEGIN CATCH -- Catch Block | 
		
	
		
			
				|  |  |  |  | 	IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level | 
		
	
		
			
				|  |  |  |  |  	ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit.  Top level will rollback | 
		
	
		
			
				|  |  |  |  | 	EXEC vlnErrorHandler | 
		
	
		
			
				|  |  |  |  | END CATCH | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | Go | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	IF (@@Error = 0) PRINT 'Procedure Creation: [CopyItemAndChildren] Succeeded' | 
		
	
		
			
				|  |  |  |  | 	ELSE PRINT 'Procedure Creation: [CopyItemAndChildren] Error on Creation' | 
		
	
		
			
				|  |  |  |  | 	GO | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | /* | 
		
	
		
			
				|  |  |  |  | ========================================================================================================== | 
		
	
		
			
				|  |  |  |  |  End: C2024-004: KL - Update Copy Replace functionality, (remove ''copy of'') | 
		
	
		
			
				|  |  |  |  | ========================================================================================================== | 
		
	
		
			
				|  |  |  |  | */ | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | ----------------------------------------------------------------------------- | 
		
	
		
			
				|  |  |  |  | /* | 
		
	
		
			
				|  |  |  |  |   --------------------------------------------------------------------------- | 
		
	
	
		
			
				
					
					|  |  |  | @@ -22260,8 +22673,8 @@ BEGIN TRY -- Try Block | 
		
	
		
			
				|  |  |  |  | 	DECLARE @RevDate varchar(255) | 
		
	
		
			
				|  |  |  |  | 	DECLARE @RevDescription varchar(255) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	set @RevDate = '03/27/2024 11:00 AM' | 
		
	
		
			
				|  |  |  |  | 	set @RevDescription = 'B2024-018: Enhanced link issue with sub-sections in source but not in enhanced' | 
		
	
		
			
				|  |  |  |  | 	set @RevDate = '07/09/2024 9:00 AM' | 
		
	
		
			
				|  |  |  |  | 	set @RevDescription = 'C2024-004: Update Copy Replace functionality' | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	Select  cast(@RevDate as datetime) RevDate, @RevDescription  RevDescription | 
		
	
		
			
				|  |  |  |  | 	PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription | 
		
	
	
		
			
				
					
					|  |  |  |   |