DECLARE @_BranchCode VARCHAR(24) = 'A03', @_nUserId INT, @_LangId INT
	DECLARE @_DocCode VARCHAR(24) = 'PX', @_DefaultDocStatus TINYINT = 1 -- Trạng thái chứng từ mặc định;
	DECLARE @_RowId_DocProcess VARCHAR(24), @_DocProcessId VARCHAR(24)
	DECLARE @_Stt VARCHAR(24), @_DocDate DATE
 
	IF OBJECT_ID(N'tempdb..#IdList') IS NOT NULL DROP TABLE #IdList
	SELECT AccDoc.Stt, AccDoc.DocDate, AccDoc.DocNo, AccDoc.DocStatus, AccDoc.CreatedBy, AccDoc.CreatedAt
	INTO #IdList
	FROM dbo.B30AccDocItem AccDoc
	WHERE AccDoc.BranchCode = @_BranchCode AND AccDoc.DocCode = @_DocCode AND AccDoc.DocStatus = 1
 
	WHILE EXISTS(SELECT 1 FROM #IdList)
	BEGIN
		SELECT TOP(1) @_Stt = Stt, @_DocDate = DocDate, @_nUserId = CreatedBy FROM #IdList ORDER BY Stt ASC
 
		DELETE dbo.B30AccDocProcess WHERE Stt = @_Stt
		DELETE dbo.B30AccDocProcessUser WHERE Stt = @_Stt
		DELETE dbo.B30AccDocProcessResult WHERE Stt = @_Stt
 
		EXECUTE dbo.usp_B20DocProcess_GetData
			@_Id = NULL,
			@_DocDate = @_DocDate,
			@_BranchCode = @_BranchCode,
			@_DocCode = @_DocCode,
			@_LangId = @_LangId,
			@_IsRunFromApp = 0,
			@_IsSelectResult = 0,
			@_RowId_DocProcess = @_RowId_DocProcess OUTPUT,
			@_DocProcessId = @_DocProcessId OUTPUT
 
		DECLARE @ci varbinary(128)
		SELECT @ci = ISNULL(CONTEXT_INFO(), 0)
		SET CONTEXT_INFO 0x55555;
	
			UPDATE dbo.B30AccDocItem
			SET DocStatus = @_DefaultDocStatus,
				RowId_DocProcess = @_RowId_DocProcess,
				DocProcessId = @_DocProcessId
			WHERE BranchCode = @_BranchCode
				AND DocCode = @_DocCode
				AND Stt = @_Stt
	
		SET CONTEXT_INFO @ci;
 
		EXECUTE dbo.usp_B20DocProcess_CreateProcess_WithoutNotification
			@_Stt = @_Stt,
			@_RowId_DocProcess = @_RowId_DocProcess,
			@_BranchCode = @_BranchCode,
			@_DocCode = @_DocCode,
			@_DefaultDocStatus = @_DefaultDocStatus,
			@_nUserId = @_nUserId,
			@_LangId = @_LangId
 
		DELETE #IdList WHERE Stt = @_Stt
	END
 
	DROP TABLE #IdList
/*
* Tạo các bước duyệt chi tiết cho chứng từ dựa theo Quy trình (xác định bởi hàm usp_B20DocProcess_GetData) và dữ liệu trên phiếu
* + Insert các bước duyệt (ví dụ: 3 bước, 2 bước,...) chưa kiểm tra đến user nào, điều kiện nào
* + Trong từng bước duyệt, kiểm tra điều kiện giá trị dựa theo bảng TableHeader trong B00DmCt để xác định bước đó sẽ có user nào duyệt
-- 07/10/2020 Bổ sung điều kiện thực hiện cho các bước
-- 22/06/2021 Chamvt bổ sung thêm các điều kiện để gửi thông báo khi có chứng từ cần duyệt trên PC
-- 08/09/2022 PhongNVT sửa gửi thông báo qua Mobile, PC, Email theo khai báo từng quy trình duyệt
-- 08/10/2022 THANGNH kiểm tra nếu chưa được duyệt lần nào thì tạo lại quy trình mới
*/
ALTER PROCEDURE dbo.usp_B20DocProcess_CreateProcess_WithoutNotification
	@_Stt UniqueKeyType = '',
	@_RowId_DocProcess UniqueKeyType = '',
	@_BranchCode varchar(3) = '',
	@_DocCode VARCHAR(24) = '',
	@_DefaultDocStatus INT = 0,
	@_nUserId INT = 0,
	@_LangId INT = 0
 
AS
BEGIN
	SET NOCOUNT ON;
 
	DECLARE @_ExecString NVARCHAR(MAX), @_RowId_Detail VARCHAR(16), @_Id_Condition INT, @_ConditionString NVARCHAR(MAX), @_Count INT = 0,
			@_Result BIT, @_Id_Sequen INT, @_ErrorMessage NVARCHAR(128), @_TableHeader VARCHAR(254), @_ProcessKeyColumnName VARCHAR(16),
			@_ProcessTableName VARCHAR(32), @_ProcessUserTableName VARCHAR(64), @_IsCreateInitStep BIT, @_CheckUserList BIT,
			@_IdList_Check VARCHAR(MAX), @_IdList_Original VARCHAR(MAX), @_ConditionDetail NVARCHAR(MAX) = '',
			@ci varbinary(128), @_ProcessList_Original VARCHAR(MAX), @_ProcessList_Check VARCHAR(MAX) = '', -- 03/06/2021 MinhPT: Thêm biến @_ProcessList_Original, @_ProcessList_Check
			@_MobilePush INT, @_PCPush INT, @_SourceTableId INT,  -- 22/06/2021 chamvt thêm
			@_EmailPush INT, @_ExplorerCommandkey VARCHAR(24)  -- 08/09/2022 PhongNVT thêm
 
	SELECT @_TableHeader = TableHeader, @_ProcessTableName = ProcessTableName, 
			@_ProcessKeyColumnName = KeyColumnName, @_ProcessUserTableName = ProcessTableName + 'User',
			@_ExplorerCommandkey = ExplorerCommandkey  -- 08/09/2022 PhongNVT thêm
		FROM dbo.B00DmCt
		WHERE Ma_Ct = @_DocCode
 
	SELECT @_IsCreateInitStep = IsCreateInitStep, 
		@_PCPush = PcPushNoti, @_MobilePush = MobilePushNoti, @_EmailPush = EmailPushNoti -- 08/09/2022 PhongNVT thêm
		FROM dbo.B20DocProcess
		WHERE RowId = @_RowId_DocProcess
 
	-- 08/10/2022 THANGNH kiểm tra chứng từ trước đó có bước 0 hay không
	DECLARE @_ExistsInitStep INT = 0
	SET @_ExecString = 
	N'IF EXISTS (SELECT 1 FROM dbo.' + @_ProcessTableName + ' WHERE ' + @_ProcessKeyColumnName + ' = @_Stt AND RowId_Detail = ''0000'') 
		SET @_ExistsInitStep = 1'
	EXECUTE sp_executesql @_ExecString, N'@_Stt VARCHAR(16), @_ExistsInitStep INT OUTPUT', @_Stt = @_Stt, @_ExistsInitStep = @_ExistsInitStep OUTPUT;
 
	IF (ISNULL(@_RowId_DocProcess, '') <> '')
	BEGIN
		-- 03/06/2021 MinhPT: Lấy giá trị @_ProcessList_Original là các bước duyệt hiện tại
		SELECT @_ExecString = N'
		IF EXISTS(SELECT 1 FROM dbo.' + @_ProcessTableName + ' WHERE ' + @_ProcessKeyColumnName + ' = @_Stt)
		BEGIN
			SELECT @_Count = 1
 
			SELECT @_IdList_Original = COALESCE(ISNULL(@_IdList_Original, '''') + '','', '''') + CAST(Id_Condition AS VARCHAR(MAX))
				FROM dbo.' + @_ProcessUserTableName 
			+ ' WHERE ' + @_ProcessKeyColumnName + ' = @_Stt --AND ISNULL(Id_Condition, 0) <> -99
				GROUP BY Id_Condition
				ORDER BY MAX(Id)
			
			SELECT @_ProcessList_Original = COALESCE(ISNULL(@_ProcessList_Original, '''') + '','', '''') + CAST(RowId_Detail AS VARCHAR(MAX))
				FROM dbo.' + @_ProcessTableName 
			+ ' WHERE ' + @_ProcessKeyColumnName + ' = @_Stt
				GROUP BY RowId_Detail
				ORDER BY MAX(BuiltinOrder)
		END ELSE
			SELECT @_Count = 0, @_IdList_Original = '''', @_ProcessList_Original = '''''
 
		EXECUTE sp_executesql @_ExecString, N'@_Count INT OUTPUT, @_Stt VARCHAR(16), @_IdList_Original VARCHAR(MAX) OUTPUT, @_ProcessList_Original VARCHAR(MAX) OUTPUT', 
									@_Count = @_Count OUTPUT, @_Stt = @_Stt, @_IdList_Original = @_IdList_Original OUTPUT, @_ProcessList_Original = @_ProcessList_Original OUTPUT
 
		IF @_Count > 0
		BEGIN
			IF NOT EXISTS(SELECT 1 FROM dbo.B20DocProcess WHERE RowId = @_RowId_DocProcess)
			BEGIN
				SELECT @_ErrorMessage = N'Quy trình gốc đã bị xóa.'
 
				RAISERROR(@_ErrorMessage, 16, 1);
				GOTO END_PROCESS;
			END
			
			IF OBJECT_ID('TempDb..#TblProcessDetail') IS NOT NULL DROP TABLE #TblProcessDetail;
 
			CREATE TABLE #TblProcessDetail (Id INT, ProcessKeyColumn VARCHAR(16), BuiltinOrder INT, RowId VARCHAR(16), Condition NVARCHAR(MAX))
 
			IF @_IsCreateInitStep = 1
			BEGIN
				INSERT INTO #TblProcessDetail(Id, ProcessKeyColumn, BuiltinOrder, RowId, Condition)
				SELECT CAST(-99 AS INT), @_Stt, CAST(0 AS INT), '0000', ''
			END
 
			INSERT INTO #TblProcessDetail(Id, ProcessKeyColumn, BuiltinOrder, RowId, Condition)
			SELECT Id, @_Stt, BuiltinOrder, RowId, Condition
			FROM dbo.B20DocProcessDetail
			WHERE RowId_DocProcess = @_RowId_DocProcess
 
			WHILE EXISTS(SELECT 1 FROM #TblProcessDetail)
			BEGIN
				SELECT TOP(1) @_RowId_Detail = RowId, @_ConditionDetail = ISNULL(Condition, '')
					FROM #TblProcessDetail
					ORDER BY BuiltinOrder
						
				-- Nếu các bước có điều kiện, và chứng từ bị thay đổi dữ liệu so với điều kiện lúc tạo phiếu thì STOP
				SELECT @_ExecString = N'IF EXISTS (SELECT 1 FROM ' + @_TableHeader 
													+ ' WHERE ' + @_ProcessKeyColumnName + ' = ''' + @_Stt + '''' 
													+ IIF(@_ConditionDetail = '', '', ' AND (' + @_ConditionDetail + ')') 
												+ ') 
											SET @_Result = 1 ELSE SET @_Result = 0'
 
				EXECUTE sp_executesql @_ExecString, N'@_Result INT OUTPUT', @_Result = @_Result OUTPUT;
 
				DECLARE @TblCondition TABLE (Id INT, RowId_Detail VARCHAR(16), Condition NVARCHAR(512), BuiltinOrder INT)
 
				IF @_Result = 1
				BEGIN
					SELECT @_ProcessList_Check = ISNULL(@_ProcessList_Check, '') + ',' + ISNULL(@_RowId_Detail, '')
 
					INSERT INTO @TblCondition (Id, RowId_Detail, Condition, BuiltinOrder)
					SELECT Id, RowId_Detail, ISNULL(Condition, ''), BuiltinOrder
						FROM dbo.B20DocProcessCondition
						WHERE RowId_Detail = @_RowId_Detail
				END
 
				IF @_IsCreateInitStep = 1
				BEGIN
					INSERT INTO @TblCondition (Id, RowId_Detail, Condition, BuiltinOrder)
					SELECT -99, @_RowId_Detail, ISNULL(Condition, ''), BuiltinOrder
						FROM #TblProcessDetail
						WHERE RowId = '0000'
				END
 
				DELETE #TblProcessDetail WHERE RowId = @_RowId_Detail
 
				WHILE EXISTS(SELECT 1 FROM @TblCondition WHERE RowId_Detail = @_RowId_Detail)
				BEGIN
					SELECT TOP(1) @_Id_Condition = Id, @_ConditionString = ISNULL(Condition, '')
						FROM @TblCondition
						WHERE RowId_Detail = @_RowId_Detail
						ORDER BY BuiltinOrder
 
					DELETE FROM @TblCondition
						WHERE Id = @_Id_Condition
 
					-- 03/06/2021 MinhPT: Kiểm tra danh sách các bước duyệt của chứng từ. Do thêm điều kiện rẽ nhánh ở các bước duyệt
					SELECT @_ExecString = N'IF EXISTS(
												SELECT 1 FROM ' + @_TableHeader 
													+ ' WHERE ' + @_ProcessKeyColumnName + ' = ''' + @_Stt + '''' 
													+ IIF(@_ConditionString = '', '', ' AND (' + @_ConditionString + ')') 
												+ ') 
											SELECT @_Result = 1 ELSE SELECT @_Result = 0'
					BEGIN TRY
						EXECUTE sp_executesql @_ExecString, N'@_Result BIT OUTPUT', @_Result = @_Result OUTPUT;
 
						IF (@_Result = 1)
						BEGIN
							SELECT @_IdList_Check = ISNULL(@_IdList_Check, '') + ',' + FORMAT(ISNULL(@_Id_Condition, ''), '#')
 
							DELETE FROM @TblCondition
								WHERE RowId_Detail = @_RowId_Detail
						END
					END TRY
					BEGIN CATCH
						PRINT ERROR_MESSAGE()
						DELETE FROM @TblCondition
							WHERE Id = @_Id_Condition
					END CATCH
				END
			END
 
			-- 03/06/2021 MinhPT: So sánh quy trình cũ mới
			-- 08/10/2022 THANGNH kiểm tra nếu chưa được duyệt lần nào thì tạo lại quy trình mới
			DECLARE @_ExistsResult INT = 0;
 
			SET @_ExecString = N'IF EXISTS(SELECT 1 FROM dbo.' + @_ProcessTableName + 'Result WHERE ' + @_ProcessKeyColumnName + ' = @_Stt) SET @_ExistsResult = 1 ELSE SET @_ExistsResult = 0;'
			EXECUTE sp_executesql @_ExecString, N'@_Stt VARCHAR(16), @_ExistsResult INT OUTPUT', @_Stt = @_Stt, @_ExistsResult = @_ExistsResult OUTPUT;
 
			IF @_ExistsResult = 0
			BEGIN
				SET @_ExecString = N'DELETE dbo.' + @_ProcessTableName + ' WHERE ' + @_ProcessKeyColumnName + ' = @_Stt;' + CHAR(13) + 
					'DELETE dbo.' + @_ProcessUserTableName + ' WHERE ' + @_ProcessKeyColumnName + ' = @_Stt;'
				EXECUTE sp_executesql @_ExecString, N'@_Stt VARCHAR(16)', @_Stt = @_Stt;
			END
			ELSE
			BEGIN
				IF (ISNULL(@_ProcessList_Check, '') <> ISNULL(@_ProcessList_Original, '')) OR (ISNULL(@_IdList_Check, '') <> ISNULL(@_IdList_Original, ''))
				BEGIN			
					SELECT @_ErrorMessage = dbo.ufn_sys_MessageText('NotChangeProcess', @_LangId)
					RAISERROR(@_ErrorMessage, 16, 1);
					GOTO END_PROCESS;
				END
				ELSE
					GOTO END_PROCESS
			END
 
			IF OBJECT_ID('TempDb..#TblProcessDetail') IS NOT NULL DROP TABLE #TblProcessDetail;
 
			--IF (ISNULL(@_IdList_Check, '') <> ISNULL(@_IdList_Original, '')) AND @_ExistsResult = 1
			--BEGIN
			--	IF @_ExistsResult = 1
			--	BEGIN
			--		SELECT @_ErrorMessage = dbo.ufn_sys_MessageText('NotChangeProcess', @_LangId)
 
			--		RAISERROR(@_ErrorMessage, 16, 1);
			--		GOTO END_PROCESS;	
			--	END
			--	ELSE
			--	BEGIN
			--		SET @_ExecString = N'DELETE dbo.' + @_ProcessTableName + ' WHERE ' + @_ProcessKeyColumnName + ' = @_Stt;'
			--		EXECUTE sp_executesql @_ExecString, N'@_Stt VARCHAR(16)', @_Stt = @_Stt;
			--	END
			--END 
			--ELSE
			--	RETURN
		END
	END
 
	IF OBJECT_ID('TempDb..#DocProcessDetail') IS NOT NULL DROP TABLE #DocProcessDetail;
 
	DECLARE @ProcessDetailTmp TABLE (Id INT, BuiltinOrder INT, RowId VARCHAR(16), ApprovalDocStatus INT, 
										RefuseDocStatus INT, RowId_DocProcess VARCHAR(16), IsInitStep BIT, Condition NVARCHAR(MAX),
										IsESign BIT, ESignType VARCHAR(24), ESignDocType VARCHAR(24) --29/05/2023 PhongNVT thêm xử lý ESign
										)
 
	INSERT INTO @ProcessDetailTmp(Id, BuiltinOrder, RowId, ApprovalDocStatus, RefuseDocStatus, RowId_DocProcess, Condition, IsInitStep,
									IsESign, ESignType, ESignDocType --29/05/2023 PhongNVT thêm xử lý ESign
									)
	SELECT d.Id, d.BuiltinOrder, d.RowId, d.ApprovalDocStatus, d.RefuseDocStatus, d.RowId_DocProcess, d.Condition, 
		IIF(@_IsCreateInitStep = 1, 0, IIF(d.BuiltinOrder = 1, 1, 0)) AS IsInitStep,
		d.IsESign, d.ESignType, dp.ESignDocType --29/05/2023 PhongNVT thêm xử lý ESign
	FROM dbo.B20DocProcessDetail AS d
		LEFT JOIN dbo.B20DocProcess dp ON dp.RowId = d.RowId_DocProcess
	WHERE d.RowId_DocProcess = @_RowId_DocProcess;
 
 
	-- 26/09/2019: ThụĐT: Sửa trường hợp tạo bước đệm sẽ để RowID = 0000
	IF @_IsCreateInitStep = 1
	BEGIN
		INSERT INTO @ProcessDetailTmp(Id, BuiltinOrder, RowId, ApprovalDocStatus, RefuseDocStatus, RowId_DocProcess, IsInitStep,
										IsESign, ESignType, ESignDocType --29/05/2023 PhongNVT thêm xử lý ESign
										)
		SELECT TOP (1) CAST(-99 AS INT), CAST(0 AS INT), CAST('0000' AS VARCHAR(16)), @_DefaultDocStatus,
				@_DefaultDocStatus, d.RowId_DocProcess, CAST(1 AS BIT),
				dp.IsESignStep0 AS IsESign, dp.ESignType, dp.ESignDocType --29/05/2023 PhongNVT thêm xử lý ESign
			FROM dbo.B20DocProcessDetail AS d
				LEFT JOIN dbo.B20DocProcess dp ON dp.RowId = d.RowId_DocProcess
			WHERE d.RowId_DocProcess = @_RowId_DocProcess
	END
 
	-- Lấy các bước duyệt dựa theo mã quy trình (RowId_DocProcess)	
	SELECT Id, BuiltinOrder, RowId, ApprovalDocStatus, RefuseDocStatus, Condition, 
			LAG(RowId) OVER (ORDER BY BuiltinOrder) AS PreviousProcess, 
			LEAD(RowId) OVER (ORDER BY BuiltinOrder) AS NextProcess,
			IsInitStep,
			ISNULL(IsESign, 0) AS IsESign, ISNULL(ESignType, '') AS ESignType, ISNULL(ESignDocType, '') AS ESignDocType --29/05/2023 PhongNVT thêm xử lý ESign
		INTO #DocProcessDetail
		FROM @ProcessDetailTmp
		WHERE RowId_DocProcess = @_RowId_DocProcess
 
	-- Lấy các điều kiện duyệt của từng bước duyệt
	IF OBJECT_ID('TempDb..#DocProcessCondition') IS NOT NULL DROP TABLE #DocProcessCondition;
	SELECT Id, BuiltinOrder, RowId_Detail, Condition
		INTO #DocProcessCondition
		FROM dbo.B20DocProcessCondition
		WHERE RowId_Detail IN (SELECT RowId FROM #DocProcessDetail)
 
	IF @_IsCreateInitStep = 1
	BEGIN
		SET IDENTITY_INSERT #DocProcessCondition ON
 
		--26/09/2019: ThụĐT: Sửa trường hợp tạo bước đệm sẽ để RowID= 0000
		INSERT INTO #DocProcessCondition(Id, BuiltinOrder, RowId_Detail, Condition)
		SELECT TOP(1) CAST(-99 AS INT), CAST(0 AS INT), 
				CAST('0000' AS VARCHAR(16)), CAST('' AS VARCHAR(16))
			FROM #DocProcessDetail
 
		SET IDENTITY_INSERT #DocProcessCondition OFF
	END
 
	IF OBJECT_ID('TempDb..#DocProcessUser') IS NOT NULL DROP TABLE #DocProcessUser;
 
	-- Lấy các user duyệt theo các điều kiện
	SELECT Id, ParentId, BuiltinOrder, RowId_Detail, UserId, DocProcessRoleId
		INTO #DocProcessUser
		FROM dbo.B20DocProcessUser
		WHERE ParentId IN (SELECT Id FROM #DocProcessCondition)
	
	IF @_IsCreateInitStep = 1
	BEGIN
		SET IDENTITY_INSERT #DocProcessUser ON
 
		INSERT INTO #DocProcessUser(Id, ParentId, BuiltinOrder, RowId_Detail, UserId)
		SELECT TOP(1) CAST(-99 AS INT), CAST(-99 AS INT), 
				CAST(0 AS INT), CAST('0000' AS VARCHAR(16)), @_nUserId
			FROM #DocProcessCondition
 
		SET IDENTITY_INSERT #DocProcessUser OFF
	END
 
	DECLARE @_DocProcessId VARCHAR(16) = '';
 
	-- 22/10/2020 Tiền xử lý: Loại bỏ các bước không thỏa mãn điều kiện và cập nhật lại PreviousProcess, NextProcess
	-- Không xử lý chung ở vòng WHILE bên dưới được do các dòng không có điều kiện đã được insert vào bảng gốc
	DECLARE @DocProcessDetail0 TABLE (RowId VARCHAR(16), BuiltinOrder INT, Condition NVARCHAR(MAX))
 
	INSERT INTO @DocProcessDetail0 (RowId, BuiltinOrder, Condition)
	SELECT RowId, BuiltinOrder, Condition
	FROM #DocProcessDetail
 
	IF EXISTS (SELECT 1 FROM @DocProcessDetail0 WHERE ISNULL(Condition, '') <> '') 
		OR @_ExistsInitStep <> @_IsCreateInitStep	-- 08/10/2022 THANGNH kiểm tra nếu chưa được duyệt lần nào thì tạo lại quy trình mới (Mà có thay đổi bước 0 - Tự duyệt)
	BEGIN
		WHILE EXISTS(SELECT 1 FROM @DocProcessDetail0)
		BEGIN
			SELECT TOP (1) @_RowId_Detail = RowId, @_ConditionDetail = Condition
				FROM @DocProcessDetail0
				ORDER BY BuiltinOrder
 
			IF ISNULL(@_ConditionDetail, '') <> ''
			BEGIN
				SET @_Result = 0
 
				SELECT @_ExecString = N'
				IF NOT EXISTS (SELECT 1 FROM ' + @_TableHeader + ' WHERE ' + @_ProcessKeyColumnName + ' = ''' + @_Stt + '''' + ' AND (' + @_ConditionDetail + ')) 
					SET @_Result = 1'
 
				--EXECUTE sp_executesql @_ExecString, N'@_Result BIT OUTPUT', @_Result = @_Result OUTPUT;
 
				BEGIN TRY
					EXECUTE sp_executesql @_ExecString, N'@_Result BIT OUTPUT', @_Result = @_Result OUTPUT;
				END TRY
				BEGIN CATCH
					SET @_ErrorMessage = dbo.ufn_sys_MessageText('BizProcess_NoProcess', @_LangId) + CHAR(13) + CHAR(13)
						+ N'Error: ' + ERROR_MESSAGE() + CHAR(13)
 
					RAISERROR(@_ErrorMessage, 16, 1);
 
					GOTO END_PROCESS;
				END CATCH
 
				IF @_Result = 1
				BEGIN
					DELETE #DocProcessDetail WHERE RowId = @_RowId_Detail
					DELETE #DocProcessCondition WHERE RowId_Detail = @_RowId_Detail
					DELETE #DocProcessUser WHERE RowId_Detail = @_RowId_Detail
 
					UPDATE #DocProcessDetail SET PreviousProcess = b.PreviousProcess, NextProcess = b.NextProcess
					FROM #DocProcessDetail a 
						LEFT OUTER JOIN
						(SELECT Id, BuiltinOrder, RowId, 
								LAG(RowId) OVER (ORDER BY BuiltinOrder) AS PreviousProcess, 
								LEAD(RowId) OVER (ORDER BY BuiltinOrder) AS NextProcess
							FROM #DocProcessDetail
						) b ON a.RowId = b.RowId
				END
			END
 
			DELETE @DocProcessDetail0 WHERE RowId = @_RowId_Detail
		END
 
		-- 22/10/2020: Nếu không có bước nào thỏa mãn thì không hợp lệ và không cho lưu. Cập nhật lại DocProcessId
		IF NOT EXISTS (SELECT 1 FROM #DocProcessDetail)
		BEGIN
			SET @ci = ISNULL(CONTEXT_INFO(), 0)
			SET CONTEXT_INFO 0x55555
			
			SET @_ExecString = N'UPDATE dbo.' + @_TableHeader + ' SET RowId_DocProcess = '''' WHERE ' + @_ProcessKeyColumnName + ' = ''' + @_Stt + '''' 
			EXECUTE(@_ExecString)
			
			SET CONTEXT_INFO @ci
 
			SELECT @_ErrorMessage = dbo.ufn_sys_MessageText('BizProcess_NoProcess', @_LangId)
 
			RAISERROR(@_ErrorMessage, 16, 1);
			GOTO END_PROCESS;
		END
 
		-- Xác định lại bước đầu tiên
		UPDATE TOP(1) #DocProcessDetail SET IsInitStep = 1
		WHERE BuiltinOrder = (SELECT MIN(BuiltinOrder) FROM #DocProcessDetail)
 
		-- Cập nhật lại DocProcessId do có thể có sự thay đổi (Bước đầu tiên không thỏa mãn)
		SET @ci = ISNULL(CONTEXT_INFO(), 0)
		SET CONTEXT_INFO 0x55555
 
		SELECT TOP 1 @_DocProcessId = RowId FROM #DocProcessDetail ORDER BY BuiltinOrder ASC
 
		SET @_ExecString = N'UPDATE dbo.' + @_TableHeader + ' SET DocProcessId = ''' + @_DocProcessId + ''' WHERE ' + @_ProcessKeyColumnName + ' = ''' + @_Stt + '''' 
		EXECUTE(@_ExecString)
 
		SET CONTEXT_INFO @ci
	END
 
	-- 03/06/2021 MinhPT: Nếu quy trình tạo ra chỉ có 1 bước số 0 thì coi như quy trình duyệt của phiếu này không có ý nghĩa => báo lỗi
	IF EXISTS(SELECT 1 FROM #DocProcessDetail HAVING MAX(BuiltinOrder) = MIN(BuiltinOrder) AND MIN(BuiltinOrder) = 0)
	BEGIN
		SET @_ErrorMessage = dbo.ufn_sys_MessageText('BizProcess_NoProcess', @_LangId)
 
		RAISERROR(@_ErrorMessage, 16, 1);
 
		GOTO END_PROCESS;
	END
 
	IF OBJECT_ID('TempDb..#ProcessSequen') IS NOT NULL DROP TABLE #ProcessSequen;
	CREATE TABLE #ProcessSequen (Id_Sequen INT)
 
	SELECT TOP 1 @_DocProcessId = RowId FROM #DocProcessDetail ORDER BY BuiltinOrder ASC
 
	-- Xử lý các bước thỏa mãn điều kiện thực hiện
 	WHILE EXISTS(SELECT 1 FROM #DocProcessDetail)
	BEGIN
		SELECT TOP(1) @_RowId_Detail = RowId, @_ConditionDetail = Condition
			FROM #DocProcessDetail
			ORDER BY BuiltinOrder
 
		IF @_ProcessTableName IN ('B30BizDocProcess', 'B30StatsDocProcess') --29/05/2023 PhongNVT thêm xử lý ESign: hiện tại chỉ hỗ trợ cho 1 số chứng từ BizDoc, StatsDoc
		BEGIN
		    SELECT @_ExecString =
				N'INSERT INTO dbo.' + @_ProcessTableName + 
				'(' + @_ProcessKeyColumnName + ', RowId_Detail, BuiltinOrder, ApprovalDocStatus, 
					RefuseDocStatus, PreviousProcess, NextProcess, ApprovedResult, IsESign, ESignType, ESignDocType)' + CHAR(13) +
				N'	OUTPUT Inserted.Id INTO #ProcessSequen(Id_Sequen)' + CHAR(13) +
				N'	SELECT TOP(1) ''' + @_Stt + ''', RowId, BuiltinOrder, ApprovalDocStatus, 
							RefuseDocStatus, ISNULL(PreviousProcess, ''''), ISNULL(NextProcess, ''''),
							IIF(IsInitStep = 1, -1, NULL), IsESign, ESignType, ESignDocType' + CHAR(13) +
				N'		FROM #DocProcessDetail' + CHAR(13) +
				N'		WHERE RowId = ''' + @_RowId_Detail + '''' + CHAR(13) +
				N'		ORDER BY BuiltinOrder'
		END
		ELSE
		BEGIN
		    SELECT @_ExecString =
				N'INSERT INTO dbo.' + @_ProcessTableName + 
				'(' + @_ProcessKeyColumnName + ', RowId_Detail, BuiltinOrder, ApprovalDocStatus, 
					RefuseDocStatus, PreviousProcess, NextProcess, ApprovedResult)' + CHAR(13) +
				N'	OUTPUT Inserted.Id INTO #ProcessSequen(Id_Sequen)' + CHAR(13) +
				N'	SELECT TOP(1) ''' + @_Stt + ''', RowId, BuiltinOrder, ApprovalDocStatus, 
							RefuseDocStatus, ISNULL(PreviousProcess, ''''), ISNULL(NextProcess, ''''),
							IIF(IsInitStep = 1, -1, NULL)' + CHAR(13) +
				N'		FROM #DocProcessDetail' + CHAR(13) +
				N'		WHERE RowId = ''' + @_RowId_Detail + '''' + CHAR(13) +
				N'		ORDER BY BuiltinOrder'
		END
		
	
		EXECUTE sp_executesql @_ExecString
 
		SELECT @_Id_Sequen = Id_Sequen
			FROM #ProcessSequen;
 
		DELETE FROM #ProcessSequen
			WHERE Id_Sequen = @_Id_Sequen;
 
		DELETE FROM #DocProcessDetail
			WHERE RowId = @_RowId_Detail;
 
		WHILE EXISTS(SELECT 1 FROM #DocProcessCondition WHERE RowId_Detail = @_RowId_Detail)
		BEGIN
			SELECT TOP(1) @_Id_Condition = Id, @_ConditionString = ISNULL(Condition, '')
				FROM #DocProcessCondition
				WHERE RowId_Detail = @_RowId_Detail
				ORDER BY BuiltinOrder
 
			DELETE FROM #DocProcessCondition
				WHERE Id = @_Id_Condition
 
			SELECT @_ExecString = N'IF EXISTS(
										SELECT 1 FROM ' + @_TableHeader 
											+ ' WHERE ' + @_ProcessKeyColumnName + ' = ''' + @_Stt + '''' 
											+ IIF(@_ConditionString = '', '', ' AND (' + @_ConditionString + ')')
										+ ') 
									SELECT @_Result = 1 ELSE SELECT @_Result = 0'
			BEGIN TRY
				EXECUTE sp_executesql @_ExecString, N'@_Result BIT OUTPUT', @_Result = @_Result OUTPUT;
 
				IF (@_Result = 1)
				BEGIN
					SELECT @_ExecString =
						N'INSERT INTO dbo.' + @_ProcessUserTableName + 
							'(ParentId, ' + @_ProcessKeyColumnName + ', RowId_Detail, BuiltinOrder, UserId, DocProcessRoleId, Id_Condition)' + CHAR(13) +
						N'SELECT @_Id_Sequen, @_Stt, @_RowId_Detail, BuiltinOrder, UserId, DocProcessRoleId, @_Id_Condition' + CHAR(13) +
						N'	FROM #DocProcessUser' + CHAR(13) +
						N'	WHERE ParentId = @_Id_Condition'
				
					EXECUTE sp_executesql @_ExecString, N'@_Id_Sequen INT, @_Stt VARCHAR(16), @_RowId_Detail VARCHAR(16), @_Id_Condition INT',
											@_Id_Sequen = @_Id_Sequen, @_Stt = @_Stt, @_RowId_Detail = @_RowId_Detail, @_Id_Condition = @_Id_Condition;
 
					DELETE FROM #DocProcessCondition
						WHERE RowId_Detail = @_RowId_Detail
				END
			END TRY
			BEGIN CATCH
				PRINT ERROR_MESSAGE()
				DELETE FROM #DocProcessCondition
					WHERE Id = @_Id_Condition
 
			END CATCH
		END
	
		SELECT @_ExecString = N'IF NOT EXISTS(SELECT 1 FROM dbo.' + @_ProcessUserTableName + ' WHERE ParentId = @_Id_Sequen) 
								SELECT @_CheckUserList = 1 ELSE SELECT @_CheckUserList = 0'
 
		EXECUTE sp_executesql @_ExecString, N'@_Id_Sequen INT, @_CheckUserList BIT OUTPUT',
									@_Id_Sequen = @_Id_Sequen, @_CheckUserList = @_CheckUserList OUTPUT
		
		IF @_CheckUserList = 1
		BEGIN
			SELECT @_ErrorMessage = dbo.ufn_sys_MessageText('BizProcess_NoProcessUser', @_LangId)
 
			RAISERROR(@_ErrorMessage, 16, 1);
			GOTO END_PROCESS;
		END
	END
 
	-- 08/09/2022 PhongNVT sửa gửi thông báo qua Mobile, PC, Email theo khai báo từng quy trình duyệt
	-- 08/09/2022 PhongNVT Rào lại xử lý lấy @_MobilePush, @_PCPush từ B00Config
	--SET @_MobilePush = (SELECT ISNULL(dbo.ufn_vB00Config_GetValue('M_MobilePushNotification', @_BranchCode), 0))
	--SET @_PCPush = (SELECT ISNULL(dbo.ufn_vB00Config_GetValue('M_PCPushNotification', @_BranchCode), 0))
 
	---- Đẩy cảnh báo lên app
	----IF ISNULL(dbo.ufn_vB00Config_GetValue('M_MobilePushNotification', @_BranchCode), 0) = 1 AND ISNULL(@_DocProcessId, '') <> ''
	--IF(@_MobilePush = 1 OR @_PCPush = 1 OR @_EmailPush = 1) AND ISNULL(@_DocProcessId, '') <> ''
	--BEGIN
	--	DECLARE @_UserName NVARCHAR(MAX) = '', @_Body NVARCHAR(256) = '', @_DocNoColumnName VARCHAR(32) = 'DocNo',
	--		@_UserIdList NVARCHAR(MAX) = '', @_Id0 INT, 
	--		@_DocNo NVARCHAR(256) = '', -- 22/06 chamvt thêm; 
	--		@_Title NVARCHAR(256) = '', -- 19/07/22 chamvt sửa đổi
	--		@_PushMobDescription NVARCHAR(500) = ''
 
	--	IF @_TableHeader LIKE 'B30CrmTrans%' SET @_DocNoColumnName = 'TransNo'
 
	--	SELECT @_ExecString = N'SELECT TOP 1 @_DocNo = ' + @_DocNoColumnName + ', @_SourceTableId = Id FROM ' + @_TableHeader + ' WHERE '+ @_ProcessKeyColumnName + ' = ''' + @_Stt + ''''
 
	--	EXECUTE sp_executesql @_ExecString, N'@_TableHeader NVARCHAR(524), @_ProcessKeyColumnName NVARCHAR(16), @_Stt NVARCHAR(16), @_DocNo NVARCHAR(32) OUTPUT, @_SourceTableId INT OUTPUT',
	--								@_TableHeader = @_TableHeader, @_ProcessKeyColumnName = @_ProcessKeyColumnName, @_Stt = @_Stt, @_DocNo = @_DocNo OUTPUT, @_SourceTableId = @_SourceTableId OUTPUT
 
	--	SELECT @_Stt AS Stt, @_DocCode AS DocCode, @_DocNo AS DocNo, @_RowId_DocProcess AS RowId_DocProcess, @_DocProcessId AS DocProcessId,
	--		NULL AS DocProcessIdOrder, 
	--		@_nUserId AS  CreatedBy, @_ExplorerCommandkey AS ExplorerCommandkey, @_SourceTableId AS Id,  -- 08/08/22 chamvt thêm 
	--		@_PCPush AS PCPushNoti, @_MobilePush AS MobilePushNoti, @_EmailPush AS EmailPushNoti, -- 08/09/2022 PhongNVT thêm
	--		2 AS ApprovalStatus, --0: ko duyệt, 1: trả lại, 2: duyệt
	--		@_TableHeader AS SourceTable, '' AS Description
	--	INTO #VoucherListPushNotifi
 
	--	EXEC dbo.usp_sys_PushNotification_Approval 
	--			@_TableTmp = '#VoucherListPushNotifi',                 
	--			@_LangId = @_LangId,                      
	--			@_nUserId = @_nUserId,                     
	--			@_BranchCode = @_BranchCode,                 
	--			@_IdListPush = NULL
 
	--	DROP TABLE IF EXISTS #VoucherListPushNotifi
	--END
	
	
	END_PROCESS:
	IF OBJECT_ID('TempDb..#ProcessSequen') IS NOT NULL DROP TABLE #ProcessSequen;
	IF OBJECT_ID('TempDb..#DocProcessDetail') IS NOT NULL DROP TABLE #DocProcessDetail;
	IF OBJECT_ID('TempDb..#DocProcessCondition') IS NOT NULL DROP TABLE #DocProcessCondition;
	IF OBJECT_ID('TempDb..#DocProcessUser') IS NOT NULL DROP TABLE #DocProcessUser;
	IF OBJECT_ID('TempDb..#TblProcessDetail') IS NOT NULL DROP TABLE #TblProcessDetail;
 
	RETURN;
 
END
 
GO