Chandrashekar
6/29/2015 - 9:11 AM

Insert New Records and Delete Missing Records

-- =============================================
-- Author:		Chandrashekar Naik D
-- Create date: 2015-06-25
-- Description:	Insert Delegation 
-- =============================================
--SELECT * FROM UserDelegateMapping UDM
CREATE PROCEDURE USP_SaveUserDelegation @centerId INT, @delegateFromUserId INT, @strUserIds NVARCHAR(1000), @LogInUserId INT
AS
BEGIN
	--DECLARE @xmldelegateToUsers VARCHAR(max) = '<Root><Row><UserId>1</UserId></Row><Row><UserId>2</UserId></Row></Root>'
	--IF @strUserIds <> ''
	--BEGIN
	--DECLARE @strUserIds VARCHAR(1000) = '1494,1245'
	DECLARE @tblSourceUsers TABLE (Id INT IDENTITY(1, 1), UserId INT)
	DECLARE @tblRecordsToDelete TABLE (Id INT IDENTITY(1, 1), UserId INT)
	DECLARE @tblRecordsToInsert TABLE (Id INT IDENTITY(1, 1), UserId INT)
	DECLARE @UserId INT
	DECLARE @I INT = 1, @I_RowCount INT

	IF @strUserIds <> ''
	BEGIN
		INSERT INTO @tblSourceUsers
		SELECT CONVERT(INT, Value)
		FROM [dbo].[Spliter](@strUserIds, ',')
	END

	--Delete recods which are not in incoming list and exists in user table
	INSERT INTO @tblRecordsToDelete
	SELECT Ltbl.DelegateToUserId
	FROM UserDelegateMapping Ltbl
	LEFT JOIN @tblSourceUsers Rtbl ON Ltbl.DelegateToUserId = Rtbl.UserId
	WHERE Ltbl.DelegateFromUserId = @delegateFromUserId
		AND Rtbl.UserId IS NULL

	IF EXISTS (
			SELECT 1
			FROM @tblRecordsToDelete
			)
	BEGIN
		--Delete
		DELETE UDM
		FROM UserDelegateMapping UDM
		INNER JOIN @tblRecordsToDelete tbl ON UDM.DelegateToUserId = tbl.UserId
		WHERE UDM.DelegateFromUserId = @delegateFromUserId

		SELECT @I_RowCount = COUNT(*)
		FROM @tblRecordsToDelete

		SET @I = 1

		--Loop for each user and remove proxy manager role
		WHILE (@I <= @I_RowCount)
		BEGIN
			SELECT @UserId = UserId
			FROM @tblRecordsToDelete
			WHERE Id = @I

			--Role:15 is Proxy Manager Role
			EXEC Usp_DeactivateAssignedUsers @UserId = @UserId, @CenterId = @centerId, @RoleId = 15, @ModifiedBy = @LogInUserId

			SET @I = @I + 1
		END
	END

	--Insert records which are in incoming user list and not in destination user table
	INSERT INTO @tblRecordsToInsert
	SELECT Ltbl.UserId
	FROM @tblSourceUsers Ltbl
	LEFT JOIN UserDelegateMapping Rtbl ON Ltbl.UserId = Rtbl.DelegateToUserId
		AND Rtbl.DelegateFromUserId = @delegateFromUserId
	WHERE Rtbl.DelegateToUserId IS NULL

	IF EXISTS (
			SELECT 1
			FROM @tblRecordsToInsert
			)
	BEGIN
		--Insert
		INSERT INTO UserDelegateMapping (DelegateFromUserId, DelegateToUserId, IsActive, CreatedBy, CreatedDate)
		SELECT @delegateFromUserId, tbl.UserId, 1, @LogInUserId, GETDATE()
		FROM @tblRecordsToInsert tbl

		SELECT @I_RowCount = COUNT(*)
		FROM @tblRecordsToInsert

		SET @I = 1

		--Loop for each user and add proxy manager role
		WHILE (@I <= @I_RowCount)
		BEGIN
			SELECT @UserId = UserId
			FROM @tblRecordsToInsert
			WHERE Id = @I

			--Role:15 is Proxy Manager Role			
			EXEC Usp_AddCenterAdminPerUserId @userID = @UserId, @roleid = 15, @CenterId = @centerId, @CreatedBy = @LogInUserId

			SET @I = @I + 1
		END
	END
END